質問: 自作コンパイラにどの様なファイルが必要なのでしょうか? 例えば、画面に横100px、縦100pxの赤色の画像を表示するプログラムがあるとします。そのプログラムを コンパイルするにあたって、cpu以外にもメモリやほかの装置にも命令がいくはず、ならばコンパイラのソースコードにはcpuで動くソースコード以外にもメモリやほかの装置にどのように動くかなどのソースコード?などが書いていないければならないのでしょうか? 今まで質問とは違いコンパイラとハードウェアの質問ですが、どうかよろしくお願いします。 (修正) 補足ですいません。命令や関数を自作する場合、 コンパイラ自体をいじって新しい命令や関数を作る際にcpuに対してどのような二進数が出力されるかなども自作するのでしょうか? 使うcpu自体の事も理解していないとちゃんと動作する命令や関数が作れないと思うのですが。 コンパイラのソースコードには二進数などの命令も書かれてありどのようにcpuで動くなども記述されているのでしょうか?
回答: > > cpu以外にもメモリやほかの装置にも命令がいくはず、 > > > そのお膳立てをしているのが「OS」です。例えばWindowsは、画面に絵や文字を表示したり、音を鳴らしたり、キーボードやマウスの入力を制御したり、ファイルを読んだり書いたり、そういった機能を有しています。そして、OSの開発者はそれらの機能をユーザーに使ってもらえるように「API (Application Programming Interface)」を公開しています(OSのAPIはシステムコールとも呼びます)。APIは究極的にはCPUのCALL命令やソフトウェア割り込み命令などで実行されます。 コンパイラーは、ソースコードを読み取って最終的に「API呼び出しをするCPU命令」を生成することで、OSが提供する機能(CPU以外のハードウェアの制御)を実行することができるのです。 つまり、 > > cpuで動くソースコード以外にもメモリやほかの装置にどのように動くかなどのソースコード?などが書いていないければならないのでしょうか? > > > コンパイラーの自作が目的なら、「所望の機能を実行するAPIを呼び出す命令を生成する処理を書く」、ということになります。 > > コンパイラ自体をいじって新しい命令や関数を作る際にcpuに対してどのような二進数が出力されるかなども自作するのでしょうか? > > > 当然そうなります。ソースコードをどのように解釈し、どのようなCPU命令を生成するかをきっちり設計しなければコンパイラーは作れません。 > > コンパイラのソースコードには二進数などの命令も書かれてありどのようにcpuで動くなども記述されているのでしょうか? > > > それはコンパイラーの責務ではありません。CPUがどのような命令でどのように動くかはCPUのマニュアルに書かれています。そして、それを提供しているのはCPUメーカー(インテルとかAMDとか)です。通常、コンパイラーの開発者はCPUメーカーからCPUのマニュアルを入手し、それをよりどころにコンパイラーを開発します。 ただし、JavaやC#のような「仮想マシン」用の命令を生成するような場合は、コンパイラーの開発者がその「仮想マシン」の仕様を詳細に定めることになります。 ちなみに、命令が必ずしも二進数(バイナリデータ)で書かれるとは限りません。いったんアセンブリ言語のコードを生成して、それをアセンブラーでアセンブルしてバイナリデータにする、という方式も多いです。アセンブラーはコンパイラーとは別に用意されている場合もありますし、コンパイラーに内蔵されている場合もあります。 いずれにしても、コンパイラーの自作はかなりハードルが高いですよ? 初心者の状態からだと、おそらく年単位でかかると思います(どのようなコンパイラーを想定しているのかにもよりますが)。