インタープリターをコンパイラーに変換しますか?


8

まず、これが私の前に他の多くのプログラマーから寄せられた質問であることを私は知っています。しかし、私を助けることができる使用可能なリソースを見つけることができませんでした。

まあ、私は「ライト」と呼ばれるプログラミング言語を作成しています。構文はpythonに匹敵しますが、厳密なオブジェクト指向のコンセプトがあります。

私はまだこの言語用のインタープリター(C ++で)を作成しましたが、私の問題はこれを実行可能ファイルに変換する方法です。(または単に:どのようにコンパイラーを作るのですか?)

ご清聴ありがとうございました

PS:私は非常に古いチュートリアルへのリンクをいくつか見つけましたが、それはパスカルです...

編集:まあ、まあ。今、私はC ++に適したチュートリアルを見つけました。プロジェクトについて:いくつかの変更がありました。現在、この言語は「Q」と呼ばれています。(kju Dot)。


最初にターゲット言語を学び、次に基本コードブロックを自分の言語から他の言語にどのように変換するかを確認します
ラチェットフリーク

1
「単に」コンパイラーを作成しようとしているのですか(以前に同じ言語のインタープリターを実装していたことからの背景知識を備えています)、それともインタープリターをコンパイラーに変えようとしているのですか?あなたのフレージングは​​私にアイデアを与えています;-)

4
二村プロジェクション?
Dan D.

1
それは取るに足らないことです-コンパイルされたバージョンを取得するには、特定のソースコードに対してインタープリターを専門化するだけです。
SK-logic

問題は、「トレースコンパイラ」のような手法についてです
Dmitry Ponyatov

回答:


12

字句解析/構文解析(および構造化の方法に応じた分析)の最初の2つのステップは同じです。ただし、表現をコード生成表現に変換する必要があります。LLVMは、リモートでまともな無料のコード生成ライブラリがほぼ唯一存在するため、通常、愛好家に使用されます。


これはまさに私が書こうとしていたことですが、最初にそれを理解しました。+1を持っている。
メイソンウィーラー

3
違う。趣味のコンパイラプロジェクトでは、単にC(またはC ++など)を発行するだけの方がはるかに人気があります。LLVMははるかに複雑です。そして、JVMまたは.NETは、この目的のためにLLVMよりも悪くはありません。
SK-logic

これらのコンパイラーは、OPが必要とする実行可能ファイルを生成しません。.NET / JVMに関しては、それは彼の言語のセマンティクスに本当に依存しています。
DeadMG 2013

1
@DeadMG、 ghc、Cを介して実行可能ファイルを完全に生成できます。他のCベースのコンパイラの数百も同様です。あなたの宗教popen(...)はコンパイラでの使用を禁止していますか?次に、自分gcc自身を捨てなければなりません。.NETについては、JVMとは異なり、その安全でない機能により、さまざまなセマンティクスに対応できます。
SK-logic

私はLLVM(Pythonバインディング付き)を使用しましたが、それは魅力のように機能しました。:)
LaVolpe 2015

4

本当に必要なのが実行可能ファイルだけである場合は、スクリプトをインタープリター実行可能ファイルの最後に追加して、それを実行させることができます。

参照:https : //stackoverflow.com/questions/5795446/appending-data-to-an-exe

代わりに、インタプリタと同じディレクトリにあるファイルからインタプリタにコードをロードして、複数のファイルを使用するだけで、ほとんど同じ結果を得ることができます。

真のコンパイラは、コードを他の言語に変換し、その言語のコンパイラを使用します。ただし、実行可能ファイルを配布するだけの場合は、配布する必要はありません。


まあ、私はこのパッキングの方法を知っています:) Pythonで使用しました(py2exeを聞く前に)。私にとってこれは不正行為であり、他の問題はパフォーマンスです。現在の私の言語は低レベルですが、厳密なオブジェクト指向です。
LaVolpe 2013

コンパイラを確実に作成するのではなく、インタプリタのみを埋め込む
Dmitry Ponyatov '27

1
@DmitryPonyatov、あなたはほぼ7年後、私の回答ですでに言ったことをコメントする必要性を感じましたか?
Winston Ewert

3

.NETランタイムからSystem.Reflection.Emitを使用して.NET実行可能ファイルを生成することも検討してください。これにより、既にいくつかの問題を解決している既存のオブジェクト指向環境にアクセスでき、結果のexeはプラットフォームに依存しません。ランタイムは、必要に応じて.exeの中間コードをマシンコードにコンパイルするため、パフォーマンスは、ネイティブコードに直接コンパイルした場合と同等のパフォーマンスになるはずです。


おそらく素晴らしいアイデアですが、私はある時点で自分の言語を低レベルに設計しました;)今、私はIntelのOpCodeのドキュメントを掘り下げようとしています。
LaVolpe 2014

0

「トレースコンパイラ」と呼ばれる手法について質問しています。インタプリタはコード実行に関する情報を収集し、収集したデータを使用して低レベルのコードを段階的に構築します。

https://en.wikipedia.org/wiki/Tracing_just-in-time_compilation

https://stefan-marr.de/papers/oopsla-marr-ducasse-meta-tracing-vs-partial-evaluation/

従来のJITとの違いは、収集されたトレースデータとコンパイルされたコードがプログラムのすべての実行から保持されることです。これにより、実行可能なマシンコードだけでなく、実際の(またはトレーニング)データの最適化も可能になります。最初のパスは一連のテストで、プログラムのすべての部分のコードを作成するには、すべてのプログラムブランチに合格する必要があります。次のものは、最適化(最も頻繁に使用されるケースへの分岐順序など)を収集して適用する実際のデータ(本番用)で実行されるプログラムです。

この方法は、従来のコンパイラ構築スキームよりも実装がはるかに複雑であるため、頻繁に使用されることはなく、そのようなコンパイラを実行する方法に関するチュートリアルの適切なセットを見つけることは複雑です。

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