C言語のコンパイル その1 どのような方針で行くか?

どのように変換するか?

C言語をバイナリにどのように変換するか、が自作CPU上に自作OSを乗せる上で、最も大きな課題の1つと考えられる。 すなわち、コンパイラをどのように作るか、である。

レギュレーションとして、コンパイラはとりあえず動けばOKということにする。 そこで、容易さ、実装時間の面から、既存のフレームワークであるLLVMの一部を利用し、とりあえず以下のように実装することとした。

f:id:denchu314:20180814223715p:plain
C言語からバイナリへの変換

(先日のOSもくもく会で聞いたが、過去に某企業がこのような構成でコンパイラを実装し、LLVMのコミュニティを怒らせたことがあるらしい...。これは趣味なので許していただきたい。) まず、フロントエンドはclangを用いてLLVM IR(中間表現)に変換する。中間表現はテキスト形式によって記述され、可読性が高い。

以下の記事が参考になった。 itchyny.hatenablog.com

次に、LLVM IRをアセンブリ言語に変換する。CPU名はModakioとした(CPUの設計編は時間を見つけていつか書く)。 Modakioのアセンブリ言語なのでModasmとする。 LLVM IRからmodasmへの変換をどのように行うか、が今回の記事の内容となる。

一番の課題は、レジスタへのアサインをどのようなアルゴリズムで行うか、になると考えている。 コンパイラレジスタアサインはどのようにやっているか全くわからないが、とりあえず動けばいいので素人考えで適当に実装してみることにする。

Modasmから機械語への変換を行うアセンブラ、および動作検証を行うはModakioのエミュレータはすでに作った。(こちらも時間を見つけて書く)。