3

カスタムマークアップ言語用のコンパイラを作成したいのですが、最適なパフォーマンスを実現したいのですが、優れたスケーラブルなデザインも必要です。

マルチパラダイムプログラミング言語(C ++)は、最新のデザインパターンを実装するのに適していますが、パフォーマンスが少し低下し(たとえば、RTTIを考えてください)、多かれ少なかれCがより適切な選択になると思います。

誰かが(ソフトウェアとしての最新のソフトウェアエンジニアリングの原則に準拠するという意味で)高速で効率的で適切に設計された最新のコンパイラを作成したい場合、最高の言語(C、C ++、またはObjective C)は何でしょうか。

4

6 に答える 6

21

C ++の「高価な」機能(例外、仮想関数、RTTIなど)はCには存在しません。Cでそれらをシミュレートするときまでに、少なくともそれと同じくらい高価なものになってしまう可能性があります。 C ++では、あまり知られていませんが、文書化されていません(それに直面しましょう:コンパイラライターは愚かではありません-それらよりも「優れた」機能を実装できる可能性はありますが、実際には特に可能性は低いです)。

反対に、テンプレート(1つの例)を使用すると、Cで実際よりもかなり高速なコードを比較的簡単に記述できることがよくあります。1つの明白な例として、C ++コードを使用std::sortすると、同等のCの2〜3倍の速度になることがよくあります。を使用したコードqsort

結論:C ++プログラムがCで記述された同等のものよりも遅くなる唯一の理由は、(何らかの理由で)より遅いコードを書くことにした場合です。一般的な理由は、単純さと読みやすさです。ほとんどの場合、これら実行速度よりも重要です。それでも、C++を使用しても必ずしも速度が低下するわけではありません。実行速度が遅くなる可能性のあることを行うかどうかは、完全にあなた次第です。

于 2011-01-07T01:47:57.117 に答える
4

OCamlを検討しましたか?関数型言語は、コンパイラーの記述に最適です。パターンマッチングは非常に便利な構成であり、副作用がないため、並列化が容易になります。

OCamlはネイティブコードにコンパイルでき、そのパフォーマンスはCやC++に匹敵します。その標準ライブラリはやや不足していますが、コンパイラを作成することは他にあまりありません。

.NET環境を好む場合、F#は非常によく似た言語です。

于 2011-01-07T01:45:42.687 に答える
4

C ++は、「使用した分だけ支払う」ポリシーに準拠しています。言語の選択によるパフォーマンスの低下は見られません。アプリケーションのパフォーマンスは、純粋に実装に依存します。

于 2011-01-07T01:30:14.227 に答える
1

基本言語としてCでコンパイラーを作成する人は、通常、コンパイラーの特定の部分にツールを使用するのが賢明です。

具体的には、lexとyaccについて調べてください(無料の実装では、flexbison)。

このアドバイスは、C ++、Javaなど、選択した他の言語にもほぼ確実に当てはまります。

于 2011-01-07T01:48:22.450 に答える
1

私はリンクを持っていませんが、私が聞いたことと経験から、C /C++はコンパイラを書くのに貧弱な言語です。まず第一に、あなたは本当にそれがスケーラブルである必要がありますか?または、この段階でスケーラブルですか?特にマークアップ言語の場合は?60 MB以上のソースをコンパイルしていないので、実際にスケーラブルである必要はないと思います。

とにかく私のプログラミング言語では、パーサーにbisonを使用しました(bison + flexを読み取る必要があります。私の言語にはない、すべての競合を回避するようにしてください)。次に、コードにCとC++の両方を使用します。バイソンはCを使用し、私は単純なC関数を呼び出して、構造体を作成および入力して抽象構文ツリーを作成するためです。次に、完了すると、ASTを実行してバイナリを生成するC++コードを呼び出します。

Standard MLは、言語の作成に非常に優れていると思われます。関数型言語を使用しない場合は、考え方に合っているので良い選択です(解析は左から右に行うことができますが、関数呼び出しはその順序にはなりません)。したがって、bisonを使用しない場合(またはC / C ++とbisonを使用して呼び出す方法を知っている場合)に推奨します。

注:コンパイラーを2回作成してみました。バイソンなしのCでの1回目バイソン付きの2回目。バイソンが私のために競合を見つけ、私がデバッグの土地で運命づけられていないという事実のために、私が指数関数的に長くかかったことは間違いありません(私はおそらく実際にコードを書く前に競合を報告する方法を見つけようとしますこれはまさにバイソンが行うことです)

于 2011-01-07T01:52:29.063 に答える
1

使用しているプログラミング言語を忘れてください。また、これらの現代のコンピューター時代に大規模なメモリサポートがあることを考えると、インタプリタ言語を使用して優れた高速プログラムを記述したり、C / C ++(コンパイル言語)を使用して非常に低速で低速なプログラムを記述したりできます。

重要なのは、正しいデータ構造とアルゴリズムを使用し、それを実装するために使用するプログラミング言語のスタイル/パターンに従うことです。「OOは万能薬ではない」と言った人もいれば、「データ構造を表示して、解決しようとしている問題のアルゴリズムをコード化する」と言った人もいることを忘れないでください。

于 2011-01-07T08:29:28.373 に答える