web-dev-qa-db-ja.com

C / C ++コンパイラはどのように機能しますか?

10年以上のC/C++コーディングの後、次のパターンに気づきました。非常に優れたプログラマーは、コンパイラーの内部について詳細な知識を持っている傾向があります。

私はかなり優秀なプログラマーであり、コンパイラーの「迷信」のアドホックなコレクションを持っているので、知識を再起動して基本から始めたいと思います。

誰かがオンラインリソースやお気に入りの本へのリンクをお勧めできますか?特にC/C++のコンパイル、最適化、GCC、LLVMに興味があります。

33
Justicle

ドラゴンブックから始めましょう...(コードの最適化とコード生成についてもっと強調してください)

DecafやCoolなどの教育プログラミング言語用のおもちゃのコンパイラを作成します。フロントエンドにパーサジェネレータ(Lexとyacc)を使用できます(作業を楽にし、より多くのインプに集中するため)。

次に、gccソースコードを参照しながらgcc内部の本を読みます。

28
sourabh jaiswal

コンパイラテキストは優れていますが、自分で教えるには少し重いです。 Jack Crenshawは、ダウンロードして読むことができる一連の記事である「Book」を「Lets BuildaCompiler」と呼んでいます。これは、「Learn By Doing」の方法論に従っており、このテーマに関する正式なクラスを受講しても何も得られなかった場合、または受講してからかなりの年月が経過している場合に最適です(私の場合です)。それはあなたの手を握り、ラムダ計算と学界だけが気にする深い理論的問題であなたを襲う代わりにコンパイラを書くことを通してあなたを導きます。それは、何ヶ月も前に学校でVax(YEAH、まさにVAX!)に何かを書いたというあいまいな記憶しか持っていなかった脳細胞をかき立てる良い方法でした。最初の章を通過するためだけに数杯のコーヒーを必要とするほとんどの教科書とは異なり、非常に会話的に書かれており、座って読むだけで簡単に読むことができます。理解の基礎ができたら、ドラゴンブックなどのより伝統的なテキストは、理解を深めるための優れた参考資料です。 (個人的には、デッドツリーバージョンが好きです。ジャックを印刷しました。ラップトップよりも快適な位置で読む方がはるかに簡単です。また、電子ブックリーダーは、実際に読んでいるように感じられないものには高すぎます。まだ本物の本です。)

「欠点」と呼ばれるかもしれませんが、それはPascalで書かれているということですが、誰かが最初に実用的なCプログラムをくれた場合よりも、それについて考えさせられたと思いました。それからAppartは、現時点では組み込みシステムでのみ使用されている68000を念頭に置いて作成されました。繰り返しますが、これは問題ではありませんでした。68000asmと68000asmは他のasmよりも読みやすいことを知っていました。

11
NoMoreZealots
10

デッドツリー版が必要な場合は、 コンパイラ設計の芸術:理論と実践 を試してください。

9
J-16 SDiZ

Pete Eddyが指摘したように、JackCrenshawのチュートリアルは初心者に最適です。ただし、実際の本番Cコンパイラがどのように機能するかを確認したい場合は、設計されたもの何かがスタックするまで壁にコードを投げることによって作成されるのではなく、優秀なエンジニアによって作成されました。FraserとHansonの リターゲット可能なCコンパイラ:設計と実装 のコピーを入手してください。これには、非常にクリーンなソースコードが含まれています- lcc コンパイラ。設計と実装の説明がコードに混在しています。初心者向けの最初の本ではありませんが、慎重に検討することで報われるため、35ドルで中古本を入手できます。

lccに関するより長い宣伝文については、 LinuxでCをより速くコンパイルする を参照してください。

LccのWebページには、多くの優れた教科書へのリンクもあります。しかし、私が本当に好きなイントロテキストを知りません。

P.S.申し訳ありませんが、Uniで引き裂かれました。

4
Norman Ramsey
3
jens

fabriceBellardのotccソースコードを参照してください

http://bellard.org/otcc/

3
plan9assembler

正確に知りたいことに応じて、パイプとフィルターのパターンを確認する必要があります。これは、私が知る限り、これ(または同様のもの)が過去数年間に多くのコンパイラーで使用されているためです。

私のコンパイラの知識が古すぎない場合は、次のように機能します。

ソースコードをシンボリック表現に解析します

シンボリック表現をクリーンアップし、正規化を行います

特定のルールに基づくシンボリックツリーの最適化

シンボリックツリーに基づいて実行可能コードを書き出す

もちろん、依存関係なども解決する必要があります。

そしてもちろん、gccまたはjavacのソースコードを見ると、より詳細な理解を得るのに役立つ場合があります。

2

ソースコードを取得してコンパイラに読み取ることも価値がある場合があります。 GCCは、20年以上にわたる言語の進化との完全な互換性を備えているため、最初の選択肢としては最適ではないかと思います。しかし、内部リファレンスマニュアルの1つに基づいて、そのソースを読むことは教育的であると確信しています。

仮想マシンのバイトコードに内部的にコンパイルされたスクリプト言語のソースを調べることを真剣に検討したいと思います。いくつかの言語がその説明に当てはまりますが、私は Lua から始めます。言語は小さく、VMは斬新です。 ソースコード も小さく、私が見たビットは、軽くコメントされていますが、非常に明確です。

1
RBerteig

カレイドスコープ をご覧ください。 LLVMを使用すると、わずか数日で独自のコンパイラを作成できます。

0
name