質問

Rubyの標準的なMRI実装だけで、私はしばらくの間Rubyでプログラミングを行ってきましたが、私が聞いた他の実装に常に興味を持っています。

私は先日、ルビーに書かれたルビー通訳者であるルビーニウスについて読んでいました。私はさまざまな場所でそれを調べようとしましたが、私はこのようなものがどのように機能するかを正確に理解するのに苦労していました。コンパイラーや言語執筆の経験はあまりありませんでしたが、それを理解することに本当に興味があります。

言語はそれ自体でどのように正確に解釈できますか?コンパイルの基本的なステップはありますか?誰かが私がばかであるように私にこれを説明できますか(とにかくそれがそれほど遠くないので)

役に立ちましたか?

解決

それはあなたが思っているよりも簡単です。

RubiniusはRubyで100%書かれていません。

から http://rubini.us/

CやJavaなどの一般的な言語の大規模な側面は、プログラマが利用できる機能の大部分が言語自体に記述されていることです。 Rubiniusには、そのリストにRubyを追加するという目標があります。 Rubyistsは、言語に機能をより簡単に追加し、バグを修正し、言語の仕組みを学ぶことができます。 可能な限りルビーがルビーで書かれている場合。不可能な場合(まだ)、それはC ++です。

他のヒント

あなたが探している概念はです コンパイラブートストラップ.

基本的にブートストラップとは、言語のコンパイラ(または通訳)を書くことを意味します バツ 言語で バツ. 。これは、基本的なコンパイラを手で低レベルで書き込む(つまり、アセンブリでCコンパイラを書く)、または別の高レベルの言語を使用することによって行われます。

ブートストラップの詳細を読んでください ウィキペディア. 。 SICPの関連する章を含め、メタサーカル評価者に関するグレッグの回答も強くお勧めします。

Rubiniusの場合、VMはC ++で記述されており、すべてのLowLevel(オペレーティングシステム関連)のものとベース操作を扱います。 VMには独自のバイトコード形式があり(JVMにも独自のものがあります)、Rubiniusが開始されると、Bytecodeを実行するVMが開始されます。しかし、Rubiniusの標準ライブラリ(Ruby The Languageの一部)のほとんどは、C(MRI)またはJava(Jruby)と比較してRubyで実装されています。また、Rubinius BytecodeコンパイラもRubyで記述されています。ええ、最初のある時点で、彼らは標準のRubyインタープリター(MRI)をBootstrap Rubiniusに使用する必要がありました。しかし、これはもうそうではないはずです(ビルドシステムがRakeを使用しているため、まだ必要かどうかはわかりませんが)。

あなたが働いている言語がいくつかの言語であると仮定します、それは問題ではありませんが、Lispは言います。 (C ++、Java、Ruby、何でもかもしれません。)

さて、LISPの実装があります。この実装IMPを呼び出します(実装のために名前が略です)。 IMPはそれ自体がプログラムであるため、コンピューターはそれを実行できます。これで、LISPで書かれたLISPの独自の実装を作成し、CIRCと呼びます。 circは、LISPコードからコンパイルされたプログラム(またはそうであれば解釈される)にすぎません。コードは書かれているため、ファイルに読み取り、解析(意味のあるデータに処理します)、データで何かを行います。これは何ですか? cirの場合、データを実行します。

しかし、どうやってそうしますか?

コードCircが読み取られており、ペルセが読み取られていると仮定します。 CIRCは、コードを使いやすいデータに処理します(LISPのような言語の場合は簡単ですが、それはポイントを超えています)。 LISPでは、コードを作成するためのコードを作成できます。そのため、CIRC用に記述されたコードもLISPで書かれているため、コードもできます。したがって、処理されたデータは、いくつかの追加処理コードとvoilaに接続されています!数値結果があります!次に、CIRCプログラムが結果を出力します。

同じことは、単純な数学よりも複雑なことでもできます。実際、言語の他の側面をコンパイル/解釈できます。これらの「他の側面」を十分に書き、それらを接着すると、LISPで書かれたLISPのAAコンパイラを取得します。

コンパイラはIMPによってコンパイルされているため、マシンとPrestoによって実行できます!あなたは終わりました。

この手法は一般にaと呼ばれます 中鎖評価者 数十年前にLISPの文脈で最初に導入されました。

テクニックの良い説明はで見つけることができます コンピュータープログラムの構造と解釈, 、第4章。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top