【お知らせ】プログラミング記事の投稿はQiitaに移行しました。

Brainf*ckトランスレータ (1) はじめに

第3回 コンパイラ実装会でざっくりとx86アセンブリのトランスレータについて説明しました。資料は特に用意せずに即席で説明したため、いくつか不備な点がありました。

  • 64bit
  • シンボル名のプレフィックス
  • 記法

具体的なコードについて取り上げる前に、これらについて簡単に触れておきます。

64bit

私自身は以下の理由により、マシン語の勉強はi386(32bit x86)から始める方が良いと考えていました。

  • 64bit(x86_64)は32bit(i386)の拡張なので、32bit時代の事情を知らないと理解できない仕様がある。
    • 同じことは32bitについても言えるが、16bitはセグメントを意識するなど32bitより難しい点があるため、最初に16bitをやるべきかは微妙。
    • Alphaのように最初から64bitとして設計されたISAなら問題ないと思うが、Alphaはもう製造されていない。
  • 64bit OSでは32bitコードも動くものがあるため、テストのためにOSを入れ替えることは少ないかも。
  • 32bitを理解していれば独力で(わざわざ説明しなくても)64bit化できるのではないか。

あまりこれを強調すると押し付けになってしまうため、暗黙の了解として敢えて触れないようにしていました。しかし大半の方が64bitで開発されていたため、32bitの説明がそのままでは適用できないケースが続出して、混乱が生じました。

そもそも上記は一般論で、Brainf*ckのトランスレータを作成するのに歴史的背景の理解が本当に必要なのか?と考え直しました。ISAが何であれ、アセンブリ言語に慣れることが何よりも大事なはずです。

シンボル名のプレフィックス

システムコールを直接呼ぶと完全にOSに依存してしまうため、libcを呼び出す方法で説明しました。Win32を念頭に説明したためC関数のシンボル名にプレフィックスのアンダースコアを付けていましたが(例: _purchar)、プレフィックスが不要なELF環境では動かないため混乱が生じました。

勉強会でのMac率を考えると64bit ELFを前提にするのも躊躇するため、プレフィックスについては環境ごとに説明しようと思います。

記法

私が慣れているIntel記法で説明しました。しかしMacのasはGNU binutilsではなくIntel記法を受け付けないことが判明したため、AT&T記法が避けられなくなりました。

【追記】MacのasがIntel記法を受け付けないのではなく、gccIntel記法で出力できない(-masm=intelを受け付けない)ようです。いずれにしてもgccの出力を読みながら調べるのにIntel記法が使えないのには変わりないので、AT&T記法は必要となります。

記法自体はアセンブリ言語の本質ではないため、あまり拘っても仕方がありません。説明はAT&T記法中心に切り替えようと思います。