コンパイラを作成するのにC ++を使用する理由


15

コンパイラを書くのになぜC ++が良い選択なのか疑問に思っていました。もちろん、多くのコンパイラはCまたはC ++で記述されているため、Cもこの目的に適していますが、今回はC ++に興味があります。正当な理由はありますか?インターネットでそれを探していましたが、正当な理由を見つけることができません。


3
「多くのコンパイラは[...] C ++で記述されています」-参照はありますか?どれ?他の一般的な言語よりもコンパイラの構築にC ++が頻繁に使用されると思われる理由は何ですか?
ドックブラウン

4
@DocBrownまあ、ClangとMSVCはほとんどがC ++で書かれており、gccにはC ++が少し含まれています。JavaJVMはC ++で書かれていますstackoverflow.com/questions/410320/what-is-java-written-inそしてスーパーユーザーcom / questions / 136136 /…
クライム

@DocBrown DMD Dの参照コンパイラはC ++で書かれています
ラチェットフリーク

3
誰がそれが良い選択だと言うのですか??
フィル

1
@Phil選択肢を考慮せずにこの選択をしたと思いますか?これは「良い」選択ではなく、「効率的な」選択です。
クライム

回答:


21

C ++には2つの側面があります。低レベルの開発面があるため、コード生成のような低レベルのことを行うための自然言語のように見えます。また、パフォーマンスを維持しながら、論理的なオブジェクト指向の方法で複雑なアプリケーション(コンパイラなど)を構築できる高レベルの側面(Cにはない)があります。低レベルと高レベルの両方の側面があるため、低レベルの機能またはパフォーマンスを必要とする大規模なアプリケーションに適しています。


9
私が知る限り、コンパイラ内部のロジックの多くは機能的な性質(複雑なデータ構造を他のデータ構造に変換する)であるため、オブジェクト指向機能(より大規模なプログラミングを対象とするかどうか) 、アーキテクチャの側面)は、手続き型プログラミングスタイルでコンパイラの構築に真の利点をもたらします。ちょうど2セントです。
ジョルジオ

5
@Giorgioオブジェクトを持つことは、コンパイラー作成の他の多くの側面で役立ちます。たとえば、最適化の際にコンパイラが対処しなければならない状態がたくさんあり、そのようなものはOOPに適しています。また、OOPと関数型プログラミングは非常に補完的である可能性があります。そのため、アルゴリズムがほとんど機能しているからといって、オブジェクトが役に立たないわけではありません。
オレクシ

3
@GiorgioとOleksi:両方確認できます。Haskellで実際の言語用のコンパイラを作成しました。それは本当にぴったりでした。しかし、時々私はいくつかのオブジェクト指向を見逃しました。別のコンパイラを作成する必要がある場合、Haskellを選択することは間違いありませんが、これは本当に特別なケースです。他のタイプのプロジェクトにはためらうことなくHaskellを選択しません。
スカーフリッジ

23
コード生成を行うために「低レベル」の言語が必要なのはなぜですか?これら2つがどのように接続されているかはわかりません。
phant0m

5
ファイルに日本語のテキストを書き込むためにUnicode 識別子が必要な場合を除いて、コード生成を行うために「低レベル側」は必要ありません。
dan04

11

私の経験はここでのあなたの前提に同意しません。実際、高レベルの汎用言語の場合、ソース言語(コンパイルされている言語と同じ言語でコンパイラーを記述することは非常に一般的な方法です。例えば:

  • SunのJavaコンパイラはJavaで書かれています
  • ScalaコンパイラはScalaで書かれています
  • MonoのC#コンパイラはC#で書かれています
  • SquickのSmalltalkコンパイラはSmalltalkで書かれています
  • ... などなど

例外は、フレームワークの言語で記述されるGCC、LLVM、Polyglotなどの既存のコンパイラフレームワーク用に記述されたコンパイラフロントエンド、またはYaccなどの既存のパーサージェネレーターに依存するコンパイラです。GCC、LLVM、およびYaccは、CおよびC ++で記述された一般的な確立されたツールであるため、コンパイラー作成者がそれらを使用するインセンティブを与えます。


2
これは、客観的な技術的理由よりも、コンパイラを書いている人々がコンパイラを書いている言語をよく知っており、好きなことと関係があると思います。
トーマスボニーニ

1
@Krelp私はそれが客観的な技術的理由ではないことに同意しますが、それは本当に「好き」でもありません-それは単に言語の通過儀礼と考えられています-「それは独自の実装言語として機能できるほど成熟していますかコンパイラ"。
オーク

1
SunのJavaコンパイラはC ++で記述されています:stackoverflow.com/questions/410320/what-is-java-written-in
Klaim

10
@Klaim、ここで2つの製品を混同しています。1つはjavac、JavaをJavaバイトコードにコンパイルするSunのJavaコンパイラ(コマンドライン)です。それはJavaで書かれています-私は何度も自分でそれを修正しました、そしてあなたはそのJavaソースをオンラインで閲覧することができます。もう1つは、Java BytecodeをネイティブマシンコードにコンパイルするHotspot JVMに組み込まれたジャストインタイムコンパイラーです。ほとんどのJVMと同様に、C ++で記述されていますが、Javaコンパイラではありません。実際、Java言語については何も知りません。
オーク

@オーク、絶対に正しい!言い換えると、JVM!= javac
Paul Draper

5

何を何にコンパイルするには?コンパイラは、ソースコードをある言語(ソース言語)から別の言語(デスティネーション言語)に変換します。これは、デスティネーション言語の低レベルについては何も示しません。

  • CoffeeScriptはJavaScriptにコンパイルされ、コンパイラーはCoffeeScriptで作成されます。
  • Script#は、 C#をJavaScriptにコンパイルします。コンパイラーは、C#を覚えている場合は記述されています。

コンパイラを記述するために選択する言語は、コンテキストによって異なります。たとえば、PHPから派生した言語をネイティブPHPコードにコンパイルするプロジェクトに取り組んでいるとき、PHPとC#の混合を使用してコンパイラーを記述しました。別の人は、Python、またはJavaとPHP、または少しのJavaScriptを備えたC ++などを選びます。

CまたはC ++は、コンパイラ関連ツールのサポート(Telastynによる回答を参照)と、これら2つの言語を使用すると本当にネイティブに移行できるため、一般的な選択肢です。しかし、別の言語を選択しても何も問題はありません。

オタクにするには、ソース言語を選択してコンパイラー自体を作成することに注意してください。CoffeeScriptコンパイラーおよび他の多くのコンパイラーで起こったことです。IDEでも人気があります。最初のVisual Studioの1つは、同じVisual Studioを使用して構築されました。


4
セルフホスティングはマニアックではなく、コンパイラを移植するための重要なプロパティです。

4
その理由は、コンパイラー自体がすぐにテストプログラムになることです。また、かなり長い間、そのコンパイラーにとって最大のプログラムになる可能性が高いでしょう。

5

ここで基本的な前提を疑問視する傾向があります。CおよびC ++はコンパイラーの作成には完全に機能しますが、他の多くの言語もタスクに完全に機能するようです。

ただし、コンパイルする言語によって多少異なります。小さくシンプルな言語の場合、CとPascalは非常にうまく機能します。大きく複雑なものをコンパイルする場合、コンパイラも大きく複雑になります。この場合、C ++の大きなプログラムを編成および操作するための追加機能が明らかに役立ちます。ただし、これはコンパイルに固有のものではなく、一般に大規模なプログラムに役立つ機能です。

もう1つの点に言及する価値があると思います。初心者(と思われる)は、コンパイラをほとんどテキスト操作を行うものと考えているため、Perlのようなものがコンパイラの作成に大いに役立つと考えています。実際には、コンパイルの興味深い部分のほとんどは、ASTを構築するまで実際には開始されません。Perlはその仕事を完璧に行うことができると確信していますが、そのテキスト操作機能はそれほど大きな利点も与えません(テキスト操作はほとんどレクサーにあり、CなどのレクサージェネレーターはいずれにせよREをサポートします)。


2
AST =抽象構文ツリー、RE =正規表現
-chaotic3quilibrium

5

コンパイラは、最新の言語で実装できます。ただし、コンパイラの最も重要な要件の1つは高速であることです。

ここでC ++には明確な利点があります。C ++の最適化は安くありません。ただし、この言語の低レベルの性質により、他のどの言語よりもC ++コードを手動で最適化することが可能です(移植性のないアセンブリを除く)。


9
もう1つの重要な要件は、生成されるコードが正しいことです。誤ったコードを生成する高速なコンパイラーよりも、信頼できる低速なコンパイラーが必要です。

1
C ++を非常に大幅に最適化することは確かに可能ですが、かなり多くの…まあ…そこには最適なC ++コードがありません。
ドナルフェローズ

2
@DonalFellows逆に言えば、どの言語でも最適以下のコードを書くことは可能ですが、C ++以外の言語(アセンブラー以外)では有効化できない最適化があります。強力なインライン化を可能にする高レベル構造の)。
クライム

2

それらを使用する主な動機は、Lex / Yacc / Bisonの出力が(主に)Cにあることだと思われます。

これらが特に正当な理由ではない...


実際には満足できませんが、試してくれてありがとう。
コブラ

それは、「コンパイラー構築のためにCでなくC ++を選択する理由」という質問には答えません。
ドックブラウン

2
それはまったく正当な理由ではありません。LexとYaccに類似したツールが多くのプラットフォームに存在します。たとえば、PLYおよびANTLR。
user16764

さらに、最も人気のある実際のコンパイラー(たとえば、ClangやGCCなどについてはかなり確かです)は、手書きのパーサーを使用しています。

@delnan:はい、でも彼らはおそらく生成されたものを使って物事を軌道に乗せたのでしょう。パーサーのハンド生成は、他の機能が動作していることを証明できるまで、本当にしたくない最適化ステップです。
マーティンヨーク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.