4

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

4

9 に答える 9

28

C コンパイラに固執します。

私を信じてください、特にそれ自体をコンパイルすることが期待されている場合、まともなCコンパイラを構築するのは十分に難しい作業です。ネストされたクラスやテンプレートなどのすべての C++ 機能をサポートしようとすると、気が狂ってしまいます。おそらくグループならできるかもしれませんが、個人的には C コンパイラで十分だと思います。

これに固執している場合は、少なくとも最初に C に似た言語を実装してください (そうすれば、何かを手に入れることができます)。次に、見せびらかすことに集中します。

于 2009-03-06T13:35:49.230 に答える
22

「正確なタスクは絶対にばかげている」-私はあなたがその判断を公平に行う立場にあるとは思わない. その見方はやめたほうがいい。

「私はこのプロジェクトを自分で書くつもりです」 - あなたはそれがグループプロジェクトだと言いました. あなたのグループは、C++ に変形する必要があるというあなたの見解に同調したくないので、離陸して自分で作業していると言っているのですか? 変更することをお勧めする別のビットがあります。

C++ についての知識がどれだけあるかは問題ではありません。文法、パーサー、字句解析器、AST、およびコード生成に関するあなたの能力は、はるかに密接に関連しているように見えます。

あなたのことや課題について詳しく知らなくても、最初の課題を 5 月末までに終わらせるにはうまくいっていると思います。それまであと3か月です。課題に固執する。その難しさに驚くかもしれません。

早期に終了し、チームへの義務を果たすのであれば、生成されたものを自由に変更して C++ 機能を追加する必要があると思います。

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

于 2009-03-06T13:38:06.010 に答える
11

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

于 2009-03-06T14:07:24.553 に答える
7

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

Cコンパイラを書くのは大変な作業です。数ヶ月でそれを行うことはできません。C++ コンパイラを作成するのは、まったく正気ではありません。5年では無理でしょう。

于 2009-03-06T13:56:26.793 に答える
5

すでに述べたいくつかの点を強調し、いくつかの参考文献を示したいと思います。

1) 最適化せずに 1989 ANSI C 規格に固執する。

2) 心配しないでください。適切な指導、優れた組織、そしてかなりの労力があれば、これは可能です。

3) The C Programming Languageを最初から最後まで読んでください。

4) Dragon Bookからコンパイラ開発の重要な概念を理解する。

5)コードとの両方のlccを見てください。

6) Lex と Yacc (または Flex と Bison)を見てみましょう

7) C コンパイラーを (自己コンパイルできるようになるまで) 書くことは、プログラマーにとって通過儀礼です。楽しめ。

于 2009-03-06T15:32:33.117 に答える
3

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

コンパイラを構築することは、コンパイラがコードを把握すると、コードに何が起こるかを本当に理解するための素晴らしい方法です。ターゲット言語は何ですか?私がコンパイラを使っていたとき、私たち 3 人全員が 1 学期かけて、一種のパ​​スカルからアセンブリに移行するコンパイラを構築しました。それは簡単な仕事ではありません。一見簡単そうに見えて、慣れてくると複雑なことのひとつです。

于 2009-03-06T15:13:12.100 に答える
2

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

于 2009-03-06T14:50:49.503 に答える
1

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

于 2009-03-06T13:37:41.333 に答える
1

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

于 2009-03-06T13:41:32.227 に答える