16

プログラミング言語やスクリプト言語を書こうとしている人に、どのようなヒントを与えることができますか? コンパイラのプログラミング方法や設計方法については心配していませんが、ツールとコード ジェネレータを使用してコンパイラをすばやく開発する方法については心配していません。

前回試したときは、C++ でコーディングしましたが、状態と構文は、実際のロジックを記述するのとほぼ同じくらいの時間がかかりました。次のツールが役立つことはわかっています。

私は、C++ コードを生成し、gcc でコンパイルできると考えていました。上記のツールを使用して、プログラムまたはスクリプト言語を記述するのにどれくらいの時間がかかると見積もられますか?


この質問のバリエーションは、 Learning to write a compilerまでさかのぼって繰り返し尋ねられてきました。これは、このトピックに関するSO リソースの不完全なリストです。

4

10 に答える 10

18

そのような処理にかかる時間を見積もるには、さまざまな要因が影響します。たとえば、経験豊富なプログラマーは、単体テストを使用して、単純な算術式評価器を数時間で簡単にノックアウトできます。ただし、初心者のプログラマーは、解析手法、再帰的降下、式ツリーの抽象表現、ツリー ウォーキング戦略などについて学習する必要がある場合があります。算術式だけでも、これには簡単に数週間以上かかる可能性があります。

しかし、それで落胆しないでください。Jeff と Joel が最近の Stack Overflow ポッドキャストで Eric Sink と話し合っていたように、コンパイラを書くことは、プログラミングのさまざまな側面について学ぶ優れた方法です。私はいくつかのコンパイラを構築しましたが、それらは私の最も記憶に残るプログラミング プロジェクトの 1 つです。

コンパイラの構築に関するいくつかの古典的な本は次のとおりです。

于 2009-01-17T19:37:52.043 に答える
5

ChrisFraserと共に世界で最も慎重に作成されたコンパイラの1つを構築するのに10年を費やしたDaveHansonは、経験から学んだ主なことの1つは、CまたはC++でコンパイラを作成しようとしないことであると私に言いました。

何かをすばやく開発したい場合は、ネイティブコードを生成しないでください。CLR、JVM、 Lua仮想マシンなどの既存の仮想マシンをターゲットにします。最大のムンクを使用してコードを生成します。

インタプリタを作成する場合のもう1つの優れたオプションは、基盤となるプログラミング言語のメモリ管理やその他の機能を使用することです。ASTに解析してから、ASTのツリーウォークで解釈します。これにより、すぐに地面から離れることができます。パフォーマンスは最高ではありませんが、許容範囲内です。(この手法を使用して、私はかつてModula-3でPostScriptインタープリターを作成しました。最初の実装には1週間かかり、後で主にレクサーでパフォーマンスの調整が行われましたが、置き換える必要はありませんでした。)

LALRパーサジェネレータは避けてください。ANTLRやElkhoundGLRパーサジェネレータなど、時間を節約できるものを使用してください。

于 2009-01-17T22:34:39.157 に答える
3

コンパイラに関する質問は、その内容に関係なく、数分で「ドラゴンブックを読んで、その本を読んで、この本を読んで...」と答えます。だから私はその部分をスキップします(最初に言ったように)。これらの本を読んで必要なツールの使い方を学ぶことは、角運動量について読んで自転車の乗り方を学ぶのと同じくらい役に立ちます。

したがって、あなたの意図を疑うことなく、あなたが尋ねたことに答えるために、私は簡単にantlrとantlrworksを初心者に勧めることができます. AST を簡単に生成し (本当の魔法が起こるところだと思います)、文法を視覚的にデバッグできます。動作するコンパイラのかなりの部分が生成されます。

あなたが自分のものを知っていて、より多くの制御をしたい場合、またはantlrが好きでない場合は、lemonパーサージェネレーターとragelステートマシンコンパイラー(字句解析を特別にサポートしています)を一緒に使用できます.

あまりパフォーマンスが必要なく、C/C++ コードを生成する予定がある場合は、最適化を自分で行うのをスキップして、C/C++ コンパイラに任せることができます。

遅いランタイムに耐えられる場合は、この方法で動的機能を実装する方が簡単なことが多いため、解釈を行うだけで開発作業をさらに短縮できます。

于 2009-01-17T20:35:31.800 に答える
3

私は、誰もが1つの非常に重要な点を見逃していると思います.

なぜコンパイラ/インタープリター/パーサーなどを書きたいのですか?

これはあなたがすることの多くを真剣に決定します。

私はかなりの数の言語の実装に取り​​組んできました。かなり奇妙なもの、ドメイン固有のもの、コマンド環境を介した単純なスクリプト化されたもの (多くの場合、コマンド環境は後で隠されました) です。それぞれに異なるレベルのスキルが必要でした。

多くの本が利用可能です。私が気に入ったのは BYTE の本 : Threaded Interpreted Languages でした。絶版になっているに違いありません。

簡単なスクリプト エンジンは、数晩考え、少し試行錯誤するだけで作成できます。

しかし、今では時間を大幅に節約できるオンラインコースがあるに違いありません。

于 2012-04-18T16:30:10.600 に答える
3

C++ をよく知っている人として、プログラミング言語またはスクリプト言語を作成しようとしている人にどのようなヒントを与えることができますか?

やらないでください。(または、少なくとも、実行する前によく考えてください!)

カスタム作成されたオブジェクトのメソッド/プロパティを公開するスクリプト言語を作成しようとしている場合は、それらを Java (または .NET/VB またはすべての不快なマイクロソフト主義) で実装してから、次のいずれかを使用することをお勧めします。スクリプト言語としてのBean Scripting Framework言語。(Microsoft側で同等のものを使用します。)

于 2009-01-17T20:05:23.187 に答える
3

コンパイラ設計に関する古典的な本は次のとおりです。

Alfred V. Aho と Jeffrey D. Ullman による「コンパイラ設計の原則」。それはかなり前から存在しており、そのピンクの騎士と緑のドラゴンは、少なくとも数世代の CS 学生によく知られています。

また...

Alfred V. Aho、Monica S. Lam、Ravi Sethi、Jeffrey D. Ullman による「Compilers: Principles, Techniques, and Tools」

コンパイラを書くことに興味があるなら、これらは間違いなく始めるのに最適な場所です。

于 2009-01-17T19:41:42.813 に答える
2

既存のバイトコード インタープリターを確認することを強くお勧めします。言語を CIL (.NET) や Java (または Python や Parrot などの他の言語) に適合させることができれば、実行可能なサポート環境を作成するためのすべての労力を節約でき、言語の概念を試すことができます。

于 2009-01-17T20:06:18.583 に答える
1

LALRに使用した優れたツールは、GOLD解析システムです。無料で、文法はBackus-Naur Formであり、C#、VB.NET、Javaなどで記述されたエンジンを含む複数の例があります。これにより、文法を記述し、文法をファイルにコンパイルしてから、エンジンを使用して文法を解析できます。

上で推奨したように、ILなどのある種のバイトコードをターゲットにすることをお勧めします。これにより、膨大な量の既存のフレームワークを活用できるようになります。

幸運を

于 2009-01-18T00:58:56.387 に答える
1

インタープリターまたはコンパイラーを作成することを計画している場合は、次の大きなものを作成したいので、それをしないでください。あなたはすでにそれを念頭に置いている、または学ぶ目的を持っているので、それを書いてください。これを行うと、次の大きなことを誤って書いたことに気付くかもしれません。

于 2009-01-17T20:58:33.750 に答える
0

言語をアセンブリ/マシンに縮小するためにコンパイラを作成したくない場合、次のオプションは、JVM、PVM、または .NET などのバイトコード言語仮想マシンにコンパイラを作成することです。

もちろん、それをやりたくない場合、つまり独自の「ドメイン固有言語」を作成したいだけの場合は、Common Lisp で構築します。Lisp マクロは、必要な構文を作成し、それを Lisp に解析するかなり単純な方法を提供します。また、バイトコードやアセンブリについて心配する必要はありません。もちろん、Lisp を学ぶ必要があります。

于 2009-01-18T04:26:45.750 に答える