動的言語の開発


11

非常に単純な言語用にいくつかの手書きコンパイラを作成しましたが、今は単純化されたPythonやRubyに似た動的言語の開発に挑戦したいと考えています。しかし、コンパイラがどのように機能するかについて頭をかき回すのは簡単でした。プリミティブコンパイラは翻訳するだけです。しかし、言語が動的な場合、これを行うことはできません。実行時に情報を追跡し、より多くの作業を行うインタープリターまたはVMを作成する必要があります。

要するに、コンパイラがどのように機能するかを知っているが、インタープリターの作成に移行したいと考えているので、チェックアウトすべきリソースはありますか?動的言語用にいくつかのVMがありますが、自分でローリングしても問題ありません。これは私の個人的な経験のためだけです。

コンパイラーからインタープリターへの移行方法に関する情報を探しています。すでに言語Xのコンパイラーを作成しているが、今はインタープリターを作成する場合、何をする必要がありますか。また、プロセスを実行するリソースはありますか?

コンパイラや仮想マシンの動作を網羅する幅広いリソースや抽象的なリソースは必要ありません。このテーマに関する教科書がたくさんあります。私がオンラインで見つけたすべてのリソースは、経験がないことを前提としているため、語彙分析または構文分析から始めるか、非常に抽象的です。動作するコンパイラはありますが、これをインタープリターに変換して、言語に動的機能を追加したいと考えています。

このプロセスでリソースを見つけることができませんでした。スコープが限定的すぎるか、理論的すぎずにインタープリターの「バックエンド」のリソースを見つけることができなかったため、ここに投稿しました。


1
このような多くのリソースがあります。コンパイラとインタープリターの間の線は、思っているよりもぼやけていることに注意してください。C#4.0コンパイラは、他の多くのコンパイラと同様に、動的プログラミングをサポートしています。
ロバートハーベイ

@RobertHarveyはい、私が求めているのは、独自のランタイム/インタープリター/仮想マシンを作成するためのリソースです。.Netインタプリタは非常に複雑すぎて、私がベースにすることはできません!
オースティンヘンリー


1
そして、このチェックアウトSOの質問を、非常に興味深いです他の質問への参照とコメントのカップルが...ある
ヤニス

回答:


4

まず、インタープリターの実装について学びます。PLAI(プログラミング言語:アプリケーションと解釈)をお勧めします。シンタックスにとらわれることなく、解釈の本質に素早く到達します。

ご使用の言語では、コンパイラのフロントエンド(ほとんどはパーサー)とランタイムライブラリ(GC、データ構造、プリミティブ操作など)を再利用できます。

もちろん、インタープリターで使用するのと同じデータ構造(の一部)を操作するコードを生成するコンパイラーで動的言語を実装することもできます。たとえば、インタプリタでは、グローバル変数を文字列インデックス付きハッシュテーブルとして実装できます。コンパイラでは、同じテーブルを使用してルックアップを実行するコードにグローバル変数参照をコンパイルします。対照的に、レキシカル変数をより効率的な表現(「ネイティブ」引数とクロージャー構造参照)にコンパイルできます。


5

動的言語用のインタープリターの実装の基本を学びたい場合、最初の動的な、解釈されたプログラミング言語であるLispの起源より良い出発点を想像することはできません。

ジョン・マッカーシーは、1960年の最初の論文で、Lispに必要な5つのプリミティブ関数を定義しました。もちろん、McCarthyはLispに関する論文を学術的な演習としてのみ意図していました。evalアセンブリを実装し、最初のLispインタープリターを作成したのは大学院生でした。Paul Graham 、quote、atom、eq、cons、car、cdr、およびcondの7つのプリミティブを識別します。

事は、あなたは本当に任意の言語でLispを実装できるということです。一度実装evalすると、REPLを簡単に設定でき、インタラクティブなインタープリターができます。人々は、C、Java、Ruby、Python、および他の多くの言語でLispを実装するのに十分退屈または好奇心が強い。そして、必ずしも意図的ではありません。グリーンスパンの第10規則を覚えておくことが重要です。

十分に複雑なCまたはFortranプログラムには、Common Lispの半分の、アドホックで、非公式に指定され、バグに乗った、遅い実装が含まれています。

あなたの最終目標はLisp実装であるべきだと言っているのではありません。しかし、動的な言語の実装を学習する場合、同質性には利点があります。慣用的な構文がレクサー/パーサーを使用する言語のASTと同じ言語で学習できるのに、なぜ構文の問題に対処するのですか?

とにかく...ただの提案。しかし、Cが少なくともLispの性質を少し持っているため、ほとんどの優れたプログラミング言語には十分な理由があります。


1
2つの答えを受け入れられるといいのですが。おかげで、私は本当にLispインタープリターを実装すると思います。解析が簡単で、ドキュメントと既存のコードが大量にあるため、作業の基礎を提供してくれるはずです。残念ながら、Schemeを使用した学部のクラスを受講したため、髪の毛が抜けてしまいました;)
オースティンヘンリー

1
私は今、自分の言語をLispの方言にコンパイルしたいと思っています!
オースティンヘンリー


0

私はこれをパブリックドメインに入れました(〜600行のC#)、quote / list / apply / eval / test / etcをサポートし、Lispのような構文やセマンティックビルトインを簡単にカスタマイズできます:

https://repl.it/CdjV/3

例えば:

        var factorial = (Lambda)language.
            Evaluate
            (@"
                ( => ( n ) (
                        ? ( != n 0 )
                        ( * n ( this ( - n 1 ) ) )
                        1
                    )
                )
            ");

        var sw = new System.Diagnostics.Stopwatch();
        var n = 12;
        var r = 0;
        int k;
        sw.Start();
        for (k = 0; k < 10000; k++)
        {
            r = (int)factorial.Invoke(null, n);
        }
        sw.Stop();
        Console.WriteLine("{0}! = {1}", n, r);
        Console.WriteLine();
        Console.WriteLine("in {0} ms (for {1} times)", sw.ElapsedMilliseconds, k.ToString("0,0"));

'HTH、


0

Schemeを少し知っている(例えば、SICPを読んだ)かLispを想定しているなら、QueennecのLisp In Small Pieces本をお勧めします。Lispライクなインタプリタとコンパイラのいくつかのバリアント(バイトコードまたはCを含む)を説明します。

また、Scottのプログラミング言語プラグマティクス、最新のDragon BookGCハンドブック、Pierceの型とプログラミング言語を読んでください。

コンパイラーからインタープリターへの移行方法に関する情報を探しています。

次に、部分評価(および二村予測)と継続合格スタイルが関連する可能性があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.