質問

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

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

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


この質問に対するバリエーションは、古くから繰り返し尋ねられてきました。 コンパイラの書き方を学ぶ. これは SO リソースの不完全なリストです 話題になっている。

役に立ちましたか?

解決

そのようなものにかかる時間の見積もりは、多くの異なる要因に依存します。たとえば、経験豊富なプログラマは、単体テストを使用して、簡単な算術式評価者を数時間で簡単にノックアウトできます。しかし、初心者のプログラマーは、構文解析手法、再帰下降、式ツリーの抽象的な表現、ツリーウォーク戦略などについて学ばなければならない場合があります。算術式のためだけに、これには数週間以上かかります。

しかし、それであなたを落胆させないでください。ジェフとジョエルが最近のスタックオーバーフローポッドキャストでエリックシンクと話し合っていたので、コンパイラの作成はプログラミングのさまざまな側面について学ぶための優れた方法。いくつかのコンパイラを構築しましたが、それらは私の最も記憶に残るプログラミングプロジェクトの1つです。

コンパイラの構築に関する古典的な書籍の一部は次のとおりです。

他のヒント

デイブ・ハンソン、クリス・フレイザーとともに10年を費やして世界で最も注意深く作成されたコンパイラの1つは、経験から学んだ主なことの1つは、CまたはC ++でコンパイラを記述しようとすることではないことを一度教えてくれました。

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

インタープリターを作成する場合のもう1つの優れたオプションは、基礎となるプログラミング言語のメモリー管理およびその他の機能を使用することです。 ASTに解析し、ASTのツリーウォークで解釈します。これにより、すぐに地面から落ちます。パフォーマンスは最高ではありませんが、許容範囲内です。 (このテクニックを使用して、私はかつてModula-3でPostScriptインタープリターを作成しました。最初の実装には1週間かかりました。

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

コンパイラー設計に関する古典的な本は

<!> quot;コンパイラ設計の原則<!> quot;アルフレッド・V・アホとジェフリー・D・ウルマン。かなり前からあり、そのピンクの騎士と緑のドラゴンは、少なくとも数世代のCS学生によく知られています。

また...

<!> quot;コンパイラ:原則、テクニック、およびツール<!> quot;アルフレッド・V・アホ、モニカ・S・ラム、ラヴィ・セティ、ジェフリー・D・ウルマン

コンパイラの作成に興味がある場合、これらは間違いなく開始するのに最適な場所です。

  

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

しないでください。 (または、少なくともあなたがする前に、長く、一生懸命に考えてください!)

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

コンパイラに関する質問には答えがあります<!> quot;ドラゴンの本を読んで、その本を読んで、この本... <!> quot;数分でコンテンツに関係なくSOで。そのため、その部分はスキップします(最初に言ったように)。必要なツールの使用方法を学ぶためにこれらの本を読むことは、自転車の乗り方を学ぶために角運動量を読むことと同じくらい便利です。

それで、あなたの意図に疑問を投げかけることなく、あなたが尋ねたものに答えるために、私は簡単に手始めにantlrとantlrworksをお勧めできます。 ASTを簡単に生成して(本当の魔法が発生する場所で)、文法を視覚的にデバッグできます。動作するコンパイラのかなりの部分を生成します。

あなたが自分のものを知っていて、さらに制御したい場合、またはantlrが気に入らない場合は、 lemon パーサージェネレーターと ragel ステートマシンコンパイラー(レキシングを特別にサポート) 。

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

実行時間が遅い場合は、解釈を行うだけで開発作業をさらに短縮できます。これは、多くの場合、この方法で動的機能を実装する方が簡単だからです。

誰もが非常に重要な点を1つ見逃していると思います。

なぜ コンパイラ/インタプリタ/パーサなどを作成しますか?

これにより、あなたが何をするかが大きく決まります。

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

たくさんの本が利用可能です。私が気に入ったのは BYTE の本です。Threaded Interpreted Languages - おそらく絶版になっています。

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

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

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

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

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

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

幸運

コンパイラーを記述して言語をアセンブリー/マシンに限定したくない場合、次のオプションは、JVM、PVM、またはなどのバイトコード言語の仮想マシンにコンパイラーを書き込むことです。 NET。

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

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