2010-11-24 8 views
10

重複の可能性:
How can a language's compiler be written in that language?
implementing a compiler in “itself”その言語の言語用のコンパイラはどうやって書いていますか?

私はRubinius、Rubyで書かれたコンパイラを使用してバイトコードにコンパイルRubyの実装を見ていました。私はこれの周りに私の頭を得ることができません。どのようにして言語のコンパイラを言語自体に書くのですか? Rubyで書かれた将来のコードをコンパイルすることができる実行可能ファイルにコンパイルするだけのテキストがあるようです。私はその文章を入力するだけで混乱します。誰でもこれを説明できる?

+0

申し訳ありませんが、それを見ませんでした。 – jergason

答えて

16

簡略化するために、最初にコンパイラ用のコンパイラを別の言語で記述します。その後、コンパイラをコンパイルしてください。

だから、すでにコンパイラを持っている何らかの言語が必要ですが、そのようなものがたくさんあるので、Rubyコンパイラコンパイラ(!)を書くことができます。 CでRubyコンパイラをコンパイルし、Rubyプログラムをコンパイルします。

当然のことながら、元のコンパイラは機械コードで書かれ、アセンブリのためにコンパイルされたコンパイラであった。 CやFortranなどのコンパイラをコンパイルしたものです。 Iterative development in action.

プロセスがbootstrappingと呼ばれる - おそらくまあ、次の順序でそれを行うことが可能である、彼は彼自身のブートストラップで沼の外に身を引かれるミュンヒハウゼン男爵の物語:)

0

にちなんで名付けられた:

  1. コンパイラを任意の言語で記述します(たとえば、CではRubyコード)。
  2. Rubyコードをコンパイルできるようになったので、Rubyコードをコンパイルするコンパイラを作成し、このコンパイラを手順1で書いたCコンパイラでコンパイルできます。この文は奇妙です!あなたに今から
  3. は2 :)

楽しんで書かれたコンパイラで、すべてのRubyコードをコンパイルすることができます! :)

0

コンパイラは、ソースコードを実行可能ファイルに変換するものです。だから、それは何が書かれていても問題ありません。それは、コンパイルしているのと同じ言語か、または十分なパワーの他の言語にすることができます。

同じ言語で書かれたプラットフォーム用の言語用のコンパイラを作成していて、実装言語用のコンパイラがまだない場合は楽しいことです。ここでの選択は、コンパイラを持っている別のプラットフォームでコンパイルするか、別の言語でコンパイラを作成し、それを使って "実際の"コンパイラをコンパイルすることです。

2

私はその文章を読むだけで戸惑うことがあります。

コンパイラがよく呼ばれる翻訳者と考えるのが役立ちます。その目的は、人間が読むことができるソースコードを取得して、コンピュータが読むことができるバイナリコードに変換することです。Rubiniusの場合、読み込まれるコードはRubyコードであり、それを変換するコードはマシンコード(実際にはIntelマシンコードにコンパイルされたLLVMマシンコードですが、これはバックグラウンドの詳細です) 。 Rubinius自体は、まったくプログラミング言語で書かれている可能性があります。それはちょうどそれがコンパイルする同じ言語で書かれたことが起こった。

もちろん、最初にRubiniusを実行する必要があります。これは、通常のRubyインタプリタの可能性が最も高いです。ただし、いったんRubiniusをインタプリタで実行すると、独自のソースコードを渡すことができ、コンパイルされたバージョンを作成して実行することに注意してください。これは、古いフレーズから「ブートストラップによって自分自身を引き上げる」というブートストラップと呼ばれます。

最後の注意:Rubyプログラムは任意のマシンコードを呼び出すことはできません。 Rubiniusのその部分は実際にはC++で書かれています。

0

これは、2段階のプロセスです:

  1. は、あなたが今のRubyコンパイラを持っているので、あなたが書くことができRubyのコンパイラはまだ
  2. 存在しないと仮定すると、Cのようないくつかの他のlanaguageでのRubyコンパイラを書きますRubyコンパイラ(新)Rubyコンパイラ

誰かが既にRubyコンパイラ(Matz)を書いているので、2番目の部分だけを実行する必要があります。より簡単に言われました。

0

答えのすべては、これまでさまざまなコンパイラを使用して、コンパイラをブートストラップする方法を説明しました。ただし、コンパイラを手動でコンパイルする方法もあります。コンパイラがマシンで実行されなければならない理由はありません。人間が実行することもできます。

+0

この回答を少し拡大できますか?あなたは、人々が機械コードで物を書いている、あるいは何か他のものについて話していますか? –

関連する問題