自作コンパイラにどの様なファイルが必要なのでしょうか?
例えば、画面に横100px、縦100pxの赤色の画像を表示するプログラムがあるとします。そのプログラムを
コンパイルするにあたって、cpu以外にもメモリやほかの装置にも命令がいくはず、ならばコンパイラのソースコードにはcpuで動くソースコード以外にもメモリやほかの装置にどのように動くかなどのソースコード?などが書いていないければならないのでしょうか?
今まで質問とは違いコンパイラとハードウェアの質問ですが、どうかよろしくお願いします。
(修正)
補足ですいません。命令や関数を自作する場合、
コンパイラ自体をいじって新しい命令や関数を作る際にcpuに対してどのような二進数が出力されるかなども自作するのでしょうか?
使うcpu自体の事も理解していないとちゃんと動作する命令や関数が作れないと思うのですが。
コンパイラのソースコードには二進数などの命令も書かれてありどのようにcpuで動くなども記述されているのでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
ベストアンサー
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#のような「仮想マシン」用の命令を生成するような場合は、コンパイラーの開発者がその「仮想マシン」の仕様を詳細に定めることになります。
ちなみに、命令が必ずしも二進数(バイナリデータ)で書かれるとは限りません。いったんアセンブリ言語のコードを生成して、それをアセンブラーでアセンブルしてバイナリデータにする、という方式も多いです。アセンブラーはコンパイラーとは別に用意されている場合もありますし、コンパイラーに内蔵されている場合もあります。
いずれにしても、コンパイラーの自作はかなりハードルが高いですよ? 初心者の状態からだと、おそらく年単位でかかると思います(どのようなコンパイラーを想定しているのかにもよりますが)。
投稿2018/01/22 09:01
総合スコア5938
0
コンパイラと言っても大きく2種類あります。
- 直接CPUが処理できる命令に置き換えるもの
実行速度は速い
- 中間コードに変換し、ランタイムプログラムが中間コードを解釈して実行するもの
1に比べると実行速度は遅い。ただしインタープリターよりは概ね速い。
CやC++などは、1の形のコンパイラになります。(C++/CLIは.NETなので別)
C#やVB.NETなどはどちらかと言うと2の中間コード形式です。.NET Frameworkがそのランタイムになります。
画面などハードウェアへのアクセスは、そのハードウェアにアクセスするためのドライバーやライブラリなどが通常は必要になります。
中間コードにする利点は、OSなどのプラットフォームに依存する部分を、ランタイムにすべて任せることができる点です。使用するプラットフォーム向けのランタイムがあれば、中間コードはどのプラットフォームでも動くということになります。(Javaなどがそうですね)
コンパイラーを自作する場合、CPUの命令コードまで吐き出すような物となると、CPUの理解は必須になります。
そうではなく、C言語やC++言語へのソースコードを吐き出して、それを既存のC/C++コンパイラーに掛けるというやり方もありかと思います。
この場合は、コンパイラーというよりトランスレータになってしまいますが、CPUの命令を吐き出すのも一種のトランスレータですから、まあ、有りかと。
(初期のC++は、C言語のソースコードを吐き出すプリプロセッサとして作られました。今は、CPUのコードを吐き出すようなものしか無いと思いますが、それでも1パスではなく複数のパスを通して最終的にCPUのコードを吐き出しています。)
投稿2018/01/22 08:25
総合スコア3579
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
こんにちは。
メモリやほかの装置にどのように動くかなどのソースコード?などが書いていないければならないのでしょうか?
Pythonは知りませんが、C, C++についてはそれらは標準ランタイム・ライブラリの仕事です。
コンパイラ自身ではないです。ただ、他のコンパイラが提供している標準ランタイムを使わない場合は自力で標準ランタイムを開発する必要があります。
【補足への追記】
命令や関数を自作する場合、コンパイラ自体をいじって新しい命令や関数を作る際にcpuに対してどのような二進数が出力されるかなども自作するのでしょうか?
C/C++の場合は関数を追加するだけならコンパイラを修正する必要は全くありません。普通にその関数をC/C++言語で記述してC/C++コンパイラでコンパイルするだけです。
if文や各種演算子等のコンパイラ組み込みの構文を追加するような場合はコンパイラ自体の修正が必要です。最終的にはコンパイラがマシン語を出力します。マシン語出力まで修正が必要になるかどうかは修正内容次第です。
ですが、難易度高いです。コンパイラの改造はプログラミングに熟練するまで封印しておいた方が良いかも知れません。プログラミングの素人が改造したコンパイラが使い物になるとは思えないですし。
投稿2018/01/22 07:29
編集2018/01/22 08:16総合スコア23272
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
コンパイラのソースコードにはcpuで動くソースコード以外にもメモリやほかの装置にどのように動くかなどのソースコード?などが書いていないければならないのでしょうか?
通常、メモリアクセスはCPU自身が管理していてMOV
などCPU自体に命令として組み込まれていますので、アクセスコードという必要はあまりありません(昔のMS-DOSなど一気に使えるメモリが狭い環境では、切り替える処理を生成する必要があるケースもあります)。
一方で、「文字を出力する」とか「キーボードから値を取ってくる」といった処理は、本来であればI/OポートやメモリマップドI/Oなど、ハードウェアごとにアクセス手法が違ってきます(ワンチップマイコンなどだと、自分で管理しないといけません)。
ただ、それでは煩雑すぎるので、抽象化するレイヤーがいくつもあります。いちばん原始的なところではBIOS(Basic I/O System)があって、特定の割り込みを呼び出せばこの動作をする、というようなものを実装しています。
さらに、現代のOSではデバイスドライバを組み込みますが、デバイスドライバがハードウェア間の差異を吸収して、OS上で動くプログラムは個々のハードウェアを考えなくても、OSのAPIを呼び出せば同じ動作をさせられる、というようになっています。
投稿2018/01/22 07:33
総合スコア145184
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/22 09:34
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/22 09:26
2018/01/22 09:26
2018/01/22 11:32
2018/01/22 11:56
2018/01/22 12:42
2018/01/22 12:45
2018/01/22 13:22
2018/01/22 13:30
2018/01/22 14:34
2018/01/23 00:18
2018/01/23 00:40
2018/01/23 10:43