5

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

先日、Ruby で書かれた Ruby インタプリタである Rubinius について読んでいました。いろいろと調べてみたのですが、このような仕組みがよくわからなくて困っていました。私はコンパイラーや言語作成の経験があまりありませんが、それを理解することに非常に興味があります。

言語はそれ自体でどの程度正確に解釈できますか? これがどこで意味をなすのか理解できないコンパイルの基本的なステップはありますか? 誰か私がばかみたいにこれを説明してくれませんか?

4

5 に答える 5

8

思ったより簡単です。

Rubinius は 100% Ruby で書かれているわけではありません。

http://rubini.us/より

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

于 2010-05-30T06:08:14.107 に答える
4

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

基本的に、ブートストラップとは、言語xで言語xのコンパイラ (またはインタプリタ) を作成することを意味します。これは、手作業で低レベルの基本的なコンパイラを作成する (つまり、アセンブリで C コンパイラを作成する) か、別の高レベル言語を使用することによって行われます。

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

于 2010-05-30T12:50:37.263 に答える
2

Rubinius の場合、VM は C++ で記述され、すべての低レベル (オペレーティング システム関連) の操作と基本操作を処理します。VM には独自のバイトコード形式があり (JVM にも独自の形式があります)、Rubinius が開始されると、バイトコードを実行する VM が開始されます。ただし、C (MRI) や Java (JRuby) とは異なり、Rubinius の標準ライブラリ (Ruby 言語の一部) のほとんどは Ruby で実装されています。また、Rubinius バイトコード コンパイラも Ruby で記述されています。つまり、最初の早い段階で、標準の Ruby インタープリター (MRI) を使用して Rubinius をブートストラップする必要がありました。しかし、これはもはや当てはまりません (ビルドシステムが rake を使用しているため、まだ必要かどうかはわかりませんが)。

于 2010-05-30T12:39:39.017 に答える
1

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

さて、あなたは Lisp の実装を持っています。この実装を Imp と呼びます (IMPlementation の略で、勝手に作った名前です)。Imp はそれ自体がプログラムであるため、コンピューターで実行できます。ここで、Lisp で書かれた Lisp 用の独自の実装を作成し、それを Circ と呼びます。Circ は、Lisp コードからコンパイルされた (または必要に応じて解釈された) プログラムです。コードは、ファイルを読み取り、解析 (意味のあるデータに処理) し、そのデータに対して何らかの処理を行うように記述されています。これは何ですか?Circ の場合は、データを実行します。

しかし、どのようにそうするのですか?

単純なケースとして、Circ が読み取って解析するコードが、数学を実行して結果を出力するような単純なものであるとします。Circ はコードを使いやすいデータに処理し (Lisp のような言語の場合、始めるのは簡単ですが、それは要点を超えています)、それを格納します。Lisp では数値を計算するコードを書くことができるので、Circ 用に書かれたコードも Lisp で書かれているので、そうすることができます。処理されたデータは、いくつかの追加処理コードに差し込まれます...そしてほら! 数値結果が出ました!次に、Circ プログラムが結果を出力します。

単純な数学よりも複雑なものでも同じことができます。実際、言語の他の側面をコンパイル/解釈できます。これらの「その他の側面」を十分に書き、それらをつなぎ合わせると、Lisp で書かれた Lisp 用のコンパイラが得られます。

コンパイラは Imp によってコンパイルされるため、自分のマシンで実行できます。これで完了です。

于 2010-05-30T06:27:25.820 に答える
0

この手法は一般にメタサーキュラー評価器と呼ばれ、Lisp のコンテキストで数十年前に初めて導入されました。

この手法の適切な説明は、Structure and Interpretation of Computer Programsの第 4 章にあります。

于 2010-05-30T06:21:18.607 に答える