9

私は大学でコンパイラのコースを受講しましたが、大変勉強になりましたが、とても勉強になり、とても楽しかったです。実装する言語仕様が与えられたので、私があまり学ばなかったのは言語設計でした。私は今、楽しみのために簡単なおもちゃの言語を作成することを考えています。これにより、さまざまな言語設計の原則を試したり実験したりできます。

まだ決めていないことの 1 つは、コンパイラに出力させたい言語または形式です。理想的には、使いやすく、デバッグ用の機能も備えた仮想マシン用のバイトコードを出力したいと考えています (たとえば、実行を一時停止して、いつでもスタックを確認できるなど)。しかし、私の空想はまだです。私が探しているもののアイデアを提供するために、私が検討したいくつかのオプションと、それらの長所と短所を以下に示します。

  • テキスト形式の x86 アセンブリ言語を出力してから、NASM や FASM などのアセンブラを呼び出すことができました。以前のコンパイラ作業は VM 上で行われていたため、これにより、実際のハードウェア用にコンパイルする経験が得られます。gdb を使用して生成されたプログラムをデバッグすることはおそらく可能ですが、デバッグをサポートする VM を使用するほど簡単ではないかもしれません。これの主な欠点は、x86 アセンブリの経験が限られていることと、CISC 命令セットとして少し気が遠くなるということです。

  • JVM や Lua 仮想マシンのような一般的な仮想マシンのバイトコードを出力できました。これらの長所と短所は、選択した特定の VM によって異なる可能性がありますが、一般的に、ここで見られる欠点は、将来のプロジェクトへの適用が制限される可能性のあるバイトコードを学習する必要がある可能性があることです。また、どの VM が自分のニーズに最も適しているかもわかりません。

  • 大学でこの目的のために特別に設計された、私のコンパイラ コースで使用したのと同じ VM を使用できました。私はすでにその設計と命令セットに精通しており、まともなデバッグ機能を備えているので、それは大きなプラスです. ただ、機能が極端に限られていて、そこそこ高度なことをやろうとするとすぐに限界にぶつかってしまう気がします。

  • LLVM を使用してLLVM Intermediate Representationを出力できます LLVM IR は非常に強力なようで、これに慣れていれば、将来必ず役に立ちます。一方で、作業とデバッグがどれほど簡単かはまったくわかりません。そのため、その分野の経験者からのアドバイスをいただければ幸いです。

  • 独自の仮想マシンを設計して実装できました。 これには大きな明らかなマイナス面があります。基本的に、プロジェクトを2 つのプロジェクトに分割することになり、実際に何かを成し遂げる可能性が大幅に低下します。ただし、必要な言語機能を「ファースト クラス」でサポートする VM を作成できるという点で、それでもいくらか魅力的です。たとえば、Lua VM はテーブルをファースト クラスでサポートしているため、簡単にLua バイトコードでそれらを操作します。

要約すると、私は比較的習得しやすく、操作しやすく、デバッグしやすい VM またはアセンブラーを探しています。これは趣味のプロジェクトであるため、理想的には、二度と使用しないツールや言語の学習に多くの時間を費やす可能性を最小限に抑えたいと考えています. ただし、この演習から得たい主なことは、言語設計の複雑さを直接理解することです。そのため、比較的迅速な実装を容易にするものは何でも優れています。

4

3 に答える 3

6

それは、構築したい言語の完成度と、その言語で何をしたいかによって異なります。他の言語と相互作用する実際のプロジェクト用に本格的な言語を作成したい場合、特定の言語機能をコンパイルする複雑さを試してみたいだけの場合よりも、ニーズがはるかに大きくなります。

アセンブリ言語ファイルへの出力は、一般的な選択肢です。アセンブリ言語ファイルに、プログラムの実際のコード (コメント内) で注釈を付けることができます。そうすれば、コンパイラが各言語構造に対して行ったことを正確に確認できます。ソースレベルのデバッグを可能にする方法で ASM ファイルに注釈を付けることができるかもしれません (これらのツールを使用してから長い時間が経ちました)。

言語設計に携わる場合は、ほぼ確実に x86 アセンブリ言語を知っている必要があります。そのため、学習に費やした時間は無駄になりません。そして、CISC 命令セットは実際には問題ではありません。レジスターとさまざまなアドレス指定モードを理解するには数時間の学習が必要であり、他のアセンブリ言語を既に使用している場合は、おそらく 1 週間もかからずにある程度習熟する必要があります。

JVM、lua、または .NET のバイト コードを出力することは、別の合理的なアプローチですが、そうすると、VM による仮定に縛られることになります。そして、おっしゃる通り、VM に関する詳細な知識が必要になります。一般的な VM には必要な機能が備わっている可能性が高いため、選択は実際には機能よりも好みの問題です。

LLVM は良い選択です。それは強力で、ますます人気が高まっています。LLVM IR を出力すると、他のコードと対話できる可能性がはるかに高くなり、他のコードと自分のコードを対話させることができます。LLVM の仕組みを知っていることは、コンパイラーや言語設計の分野での仕事を探している場合に有利です。

実装におけるトレードオフを確認して理解できるように、他の VM でもう少し経験を積む前に、独自の仮想マシンを設計して実装することはお勧めしません。この道をたどると、JVM、lua、.NET、およびその他の多くの VM を学習することになります。私はそうするなと言っているわけではありませんが、そうすることは、言語設計を探求するというあなたの明言された目的からあなたを遠ざけてしまうということです。

知識が役に立たないことはめったにありません。何を使うにしても、新しいことを学ぶ必要があります。そして、それはすべて良いことです。ただし、言語設計に専念したい場合は、特に言語設計以外の作業が最も少ない出力形式を選択してください。もちろん、機能と一致しています。

あなたの選択肢の中で、あなたの大学の VM が出ているように見えます。独自の VM を設計することも出てきたと思います。他の 3 つのうち、私はおそらく LLVM を使用します。しかし、私は x86 アセンブリに非常に精通しているので、LLVM を学習するという考えは魅力的です。

于 2012-05-06T20:26:29.617 に答える
5

私のプログラミング言語 ZOOを見てください。いくつかの仮想マシンと構成されたアセンブリ (スタック マシン) を含む、言語のおもちゃの実装が多数あります。始めるのに役立つはずです。

于 2012-05-06T20:45:46.783 に答える
1

言語設計をいじっているだけなら、インタープリター言語はどうですか? 実行時に AST 全体を維持することで、いくつかの非常に優れたことが可能になります。

于 2012-06-19T06:42:56.837 に答える