10

高レベルのプログラミングのバックグラウンドを持っているので、低レベルのプログラミングについて学ぶことに興味があります。コンパイラがどのようにコンパイルされるか知りたいですか?

ウィキのいくつかの記事を見たところ、数値機械語は最低レベルの言語であると言われていますが、この機械語をコンパイルするにはコンパイラが必要です。そのコンパイラはどの言語で書かれていますか?

4

4 に答える 4

15

通常、コンパイラの作成者は次の 2 つのルートのいずれかを使用します。

  • コンパイラ全体を他の既存の言語で記述します。これは一般的に最も簡単なオプションです。

  • 最小限のトランスレータを使用できるように、他の言語で十分なコードを記述し、その「足場」をベースとして使用して、コンパイルする言語で適切なコンパイラを記述します。これはより複雑で、通常は時間がかかりますが、実際のプロジェクトで言語をテストすることにより、言語のバグや弱点を洗い流す機会を本質的に提供します。

コードを変換する最初のプログラムは、少なくとも部分的にマシン コード (CPU に何をすべきかを伝える実際の数値) で書かれました。マシンコード用の「コンパイラ」が実際には存在しないため、これは最低レベルです* ; それは特定の方法で配置された数字にすぎず、CPU には外部の助けなしにそれらを処理するための回路が内蔵されています。

*命令を解釈して実行するハードウェアの設計を支援するプログラムがありますが、それはおそらくコンパイラーの定義の範囲外です。このようなプログラムは、コンパイラが出力する直接実行可能なファイルとは対照的に、回路図などのハードウェア記述を生成します。

于 2013-07-11T20:25:45.547 に答える
9

お気に入りのコンパイラ A を使用して、別のコンパイラ、たとえば B を作成できます。この B では、いくつかの追加機能を追加したため、簡単にお気に入りのコンパイラになり、コンパイラ C の作成に使用できます...

それではどうやって始めますか?昔は、CPU が直接解釈する生の数値をメモリに入力するだけでした。これが、 source がしばしばcodeと呼ばれる理由です。最小限のコンパイラがこのようにプログラムされると、それを実行して、コンパイルする言語で書かれた別のコンパイラを作成できます。これも、より高いレベルのものを作成するために使用できます。

実際、生の命令コードをメモリに書き込むこと自体が、コンパイラが人間であるゼロレベルのコンパイル プロセスとして扱うことができます。

特定の言語のコンパイラが同じ言語で書かれていることはよくあることです。これは、たとえば C プログラミング言語の場合です。これは偶然ではありません。なぜなら、あえてその言語用のコンパイラを書くほど言語をよく知っている人は、プログラミングに使用するお気に入りの言語の中にこの言語を持っている可能性が高いからです。ただし、これは単なる典型的なケースであり、特にコンパイラの構築に適したものを含め、選択できる言語が多数あるため、必ずしも必要ではありません。

于 2013-07-11T20:17:34.733 に答える
6

数値機械コードはバイナリです。1 と 0。コンパイルは、それをさらに低い形式に縮小することを意味するため、実際にはコンパイルされていません。

たとえば、引用したwiki記事から: For example, on the Zilog Z80 processor, the machine code 00000101, which causes the CPU to decrement the B processor register, would be represented in assembly language as DEC B.

したがって、Z80 アセンブリ言語を書いているときにコンパイラがあれば、命令 DEC B は '00000101' にコンパイルされます (その逆ではありません)。

于 2013-07-11T20:16:47.897 に答える
2

数値機械コードは、回路に対する一連のオフとオンの状態を表し、すべての電子データが最も低いレベルにあるものです。この低レベル言語には、いわゆる「コンパイラ」はありません。代わりに、コンピューターの回路は、電気的状態の高低によって実現されるコードのオンとオフを読み取ることによって「解釈」するように組み合わされ、構造化されています。とにかく、これらの高レベルまたは低レベルの状態により、さまざまなゲート/回路が開いたり閉じたりし、一般に動作が異なります。電子ゲートの詳細をご覧ください。

于 2013-07-11T20:21:32.370 に答える