コンパイラを書くのになぜC ++が良い選択なのか疑問に思っていました。もちろん、多くのコンパイラはCまたはC ++で記述されているため、Cもこの目的に適していますが、今回はC ++に興味があります。正当な理由はありますか?インターネットでそれを探していましたが、正当な理由を見つけることができません。
コンパイラを書くのになぜC ++が良い選択なのか疑問に思っていました。もちろん、多くのコンパイラはCまたはC ++で記述されているため、Cもこの目的に適していますが、今回はC ++に興味があります。正当な理由はありますか?インターネットでそれを探していましたが、正当な理由を見つけることができません。
回答:
C ++には2つの側面があります。低レベルの開発面があるため、コード生成のような低レベルのことを行うための自然言語のように見えます。また、パフォーマンスを維持しながら、論理的なオブジェクト指向の方法で複雑なアプリケーション(コンパイラなど)を構築できる高レベルの側面(Cにはない)があります。低レベルと高レベルの両方の側面があるため、低レベルの機能またはパフォーマンスを必要とする大規模なアプリケーションに適しています。
私の経験はここでのあなたの前提に同意しません。実際、高レベルの汎用言語の場合、ソース言語(コンパイルされている言語)と同じ言語でコンパイラーを記述することは非常に一般的な方法です。例えば:
例外は、フレームワークの言語で記述されるGCC、LLVM、Polyglotなどの既存のコンパイラフレームワーク用に記述されたコンパイラフロントエンド、またはYaccなどの既存のパーサージェネレーターに依存するコンパイラです。GCC、LLVM、およびYaccは、CおよびC ++で記述された一般的な確立されたツールであるため、コンパイラー作成者がそれらを使用するインセンティブを与えます。
javac
、JavaをJavaバイトコードにコンパイルするSunのJavaコンパイラ(コマンドライン)です。それはJavaで書かれています-私は何度も自分でそれを修正しました、そしてあなたはそのJavaソースをオンラインで閲覧することができます。もう1つは、Java BytecodeをネイティブマシンコードにコンパイルするHotspot JVMに組み込まれたジャストインタイムコンパイラーです。ほとんどのJVMと同様に、C ++で記述されていますが、Javaコンパイラではありません。実際、Java言語については何も知りません。
何を何にコンパイルするには?コンパイラは、ソースコードをある言語(ソース言語)から別の言語(デスティネーション言語)に変換します。これは、デスティネーション言語の低レベルについては何も示しません。
コンパイラを記述するために選択する言語は、コンテキストによって異なります。たとえば、PHPから派生した言語をネイティブPHPコードにコンパイルするプロジェクトに取り組んでいるとき、PHPとC#の混合を使用してコンパイラーを記述しました。別の人は、Python、またはJavaとPHP、または少しのJavaScriptを備えたC ++などを選びます。
CまたはC ++は、コンパイラ関連ツールのサポート(Telastynによる回答を参照)と、これら2つの言語を使用すると本当にネイティブに移行できるため、一般的な選択肢です。しかし、別の言語を選択しても何も問題はありません。
オタクにするには、ソース言語を選択してコンパイラー自体を作成することに注意してください。CoffeeScriptコンパイラーおよび他の多くのコンパイラーで起こったことです。IDEでも人気があります。最初のVisual Studioの1つは、同じVisual Studioを使用して構築されました。
ここで基本的な前提を疑問視する傾向があります。CおよびC ++はコンパイラーの作成には完全に機能しますが、他の多くの言語もタスクに完全に機能するようです。
ただし、コンパイルする言語によって多少異なります。小さくシンプルな言語の場合、CとPascalは非常にうまく機能します。大きく複雑なものをコンパイルする場合、コンパイラも大きく複雑になります。この場合、C ++の大きなプログラムを編成および操作するための追加機能が明らかに役立ちます。ただし、これはコンパイルに固有のものではなく、一般に大規模なプログラムに役立つ機能です。
もう1つの点に言及する価値があると思います。初心者(と思われる)は、コンパイラをほとんどテキスト操作を行うものと考えているため、Perlのようなものがコンパイラの作成に大いに役立つと考えています。実際には、コンパイルの興味深い部分のほとんどは、ASTを構築するまで実際には開始されません。Perlはその仕事を完璧に行うことができると確信していますが、そのテキスト操作機能はそれほど大きな利点も与えません(テキスト操作はほとんどレクサーにあり、CなどのレクサージェネレーターはいずれにせよREをサポートします)。
コンパイラは、最新の言語で実装できます。ただし、コンパイラの最も重要な要件の1つは高速であることです。
ここでC ++には明確な利点があります。C ++の最適化は安くありません。ただし、この言語の低レベルの性質により、他のどの言語よりもC ++コードを手動で最適化することが可能です(移植性のないアセンブリを除く)。
それらを使用する主な動機は、Lex / Yacc / Bisonの出力が(主に)Cにあることだと思われます。
これらが特に正当な理由ではない...