独自のC ++コンパイラに、テンプレートやネストされたクラスなど、C ++の強力な機能を理解させるにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/618859

質問

私のグループでは、Cライクな言語のコンパイラを書くことは大学の仕事です。もちろん、私たちの愛するC ++の小さな部分を実装するつもりです。
正確なタスクは絶対にばかげているので、講師は自己コンパイル可能である必要があると言いました(それ自体をコンパイルできるはずです)-したがって、彼はBoostやSTLなどのライブラリを使用しないことを意味しました。
また、実装が難しいため、テンプレートを使用することも望んでいません。
問題は、テンプレートを実装するだけでなく、入れ子にすることも5月の終わり(6月中旬)(6月中旬)にこのプロジェクトを自分で書くつもりなので、私にとっては本当ですか?クラス、名前空間、構文解析レベルの仮想関数テーブル?
PS私はC ++の初心者ではありません

役に立ちましたか?

解決

Cコンパイラの実行にこだわります。

信じてください。まともなCコンパイラを構築するのに十分な労力を費やしています。特に、それ自体をコンパイルすると予想される場合は、 。ネストされたクラスやテンプレートなどのすべてのC ++機能をサポートしようとすると、気が狂います。おそらくグループでできるかもしれませんが、あなた自身では、Cコンパイラで十分だと思います。

これに完全に慣れていない場合、少なくとも最初にCライクな言語を実装してください(そうすれば手に入れることができます)。 次に披露に焦点を当てます。

他のヒント

"正確なタスクは絶対に愚かです" -私はあなたがその判断を公平にする立場にあるとは思わない。そのビューを削除する方が良い。

"このプロジェクトを自分で書くつもりです" -あなたはそれがグループプロジェクトだと言いました。あなたのグループは、C ++に変身するべきだというあなたの見解に沿って進みたくないと言っているのですか?変更することをお勧めします。

C ++についてどれだけ知識があるかは関係ありません。文法、パーサー、レクサー、AST、およびコード生成に関するあなたの能力は、はるかに密接な関係があるようです。

あなたや課題について詳しく知ることなく、5月末までに元の課題をうまくやることができると思います。それは3か月先です。割り当てに固執します。その難しさであなたを驚かせるかもしれません。

早期に終了し、チームに対する義務を果たす場合は、C ++機能を追加するために生成されたものを自由に変更してください。

Bjarne StroustrupがCにオブジェクトを追加するのに3か月以上かかったと思います。自分を過大評価したり、元の割り当てを過小評価したりしないでください。

問題ありません。そして、あなたがそれをしている間に、なぜそれを実行するためのオペレーティングシステムを実装しないのですか?

割り当てに従います。 Cに似た言語のコンパイラを作成してください! 私がやることは、Cのサブセットを選択することです。浮動小数点データ型と、コンパイラの構築に不要な他のすべての機能を削除します。

Cコンパイラの作成には多くの作業が必要です。あなたは数ヶ月でそれを行うことができなくなります。 C ++コンパイラの作成は実に正気ではありません。 5年以内にそれを行うことはできません。

すでに言及したいくつかの点を強調し、いくつかの参考文献を挙げたいと思います。

1)最適化されていない1989 ANSI C規格に準拠。

2)心配しないでください。適切なガイダンス、優れた組織、かなりの努力が必要です。

3) Cプログラミング言語の表紙を読んでください。

4)ドラゴンブックからコンパイラ開発の重要な概念を理解します。

5) lcc のコードと< a href = "https://rads.stackoverflow.com/amzn/click/com/0805316701" rel = "noreferrer"> book 。

6) LexとYacc (またはFlexとBison)

をご覧ください。

7)Cコンパイラーの作成(自己コンパイルできる点まで)は、プログラマーの間の通過儀礼の儀式です。楽しんでください。

クラスプロジェクトの場合、コンパイラに自分自身をコンパイルできるように要求することは、少々質問が多いと思います。私はこれが質問の愚かさによって意味されたものだと思います。つまり、実装するCの正確な量を事前に把握し、それをコンパイラの構築に固執する必要があるということです。したがって、単にSTLマップを使用するのではなく、プリミティブを使用してシンボルテーブルを構築します。これは、データ構造のコースには役立ちますが、コンパイラコースのポイントを逃します。コンパイラに関連する問題を理解し、データ構造をコーディングするのではなく、使用するデータ構造を選択する必要があります。

コンパイラのビルドは、コンパイラがコードを取得した後、コードに何が起こるかを本当に理解する素晴らしい方法です。ターゲット言語は何ですか?コンパイラーを取得したとき、ソルタパスカルからアセンブリーに移行するコンパイラーを構築するのに、全学期のうち3人が必要でした。それは簡単な作業ではありません。最初は単純に見えるものの1つですが、それをもっと理解すればするほど、より複雑なものになります。

時間枠内でcライクな言語を完成できるはずです。あなたが複数のコースを受講していると仮定すると、それはまさにあなたが時間内にできることかもしれません。 C ++も実行可能ですが、それを配置するためにさらに多くの時間が追加されます。 C ++テンプレート/仮想関数の実行を期待することは、自分自身を過度に期待しすぎており、すべて一緒に割り当てに失敗する可能性があります。そのため、cサブセットコンパイラを使用して、時間内に終了することをお勧めします。 QAにかかる時間も考慮する必要があります。 QA自体を徹底的に行いたい場合も、時間がかかります。

名前空間またはネストされたクラス。仮想関数は構文レベルが非常に単純であり、パーサーに対するルールは1つまたは2つだけです。より高いレベルで、どの関数/クラスを選択するか(名前のシャドウイング、名前空間間のあいまいな名前など)、またはバイトコード/ ASTの実行時にコンパイルする場合、より複雑になります。だから-あなたはこれらを書くことができるかもしれませんが、必要でない場合は、それをスキップし、裸の機能モデルを書いてください。

コード生成を備えた完全なコンパイラについて話している場合は、忘れてください。レキシカル&amp;を行うだけの場合構文解析の側面から、使用するコンパイラ構築ツールに応じて、何らかの形式のテンプレートが時間枠内でほぼ実行可能になります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top