10年以上のC/C ++コーディングの後、私は次のパターンに気づきました。非常に優れたプログラマーは、コンパイラーの内部について詳細な知識を持っている傾向があります。
私はかなり優秀なプログラマーであり、コンパイラーの「迷信」のアドホックなコレクションを持っているので、知識を再起動して基本から始めたいと思います。
誰かがオンラインリソースやお気に入りの本へのリンクをお勧めできますか?特に、C / C ++のコンパイル、最適化、GCC、LLVMに興味があります。
10年以上のC/C ++コーディングの後、私は次のパターンに気づきました。非常に優れたプログラマーは、コンパイラーの内部について詳細な知識を持っている傾向があります。
私はかなり優秀なプログラマーであり、コンパイラーの「迷信」のアドホックなコレクションを持っているので、知識を再起動して基本から始めたいと思います。
誰かがオンラインリソースやお気に入りの本へのリンクをお勧めできますか?特に、C / C ++のコンパイル、最適化、GCC、LLVMに興味があります。
ドラゴンブックから始めましょう...(コードの最適化とコード生成にもっと重点を置きます)
DecafやCoolなどの教育用プログラミング言語用のおもちゃのコンパイラーを作成します。フロントエンドにパーサージェネレーター(lexとyacc)を使用できます(作業を楽にし、より多くのimpに集中するため)。
次に、gccソースコードを参照しながらgcc内部の本を読みます。
コンパイラテキストは優れていますが、自分で教えるには少し重いです。Jack Crenshawは、ダウンロードして読むことができる一連の記事である「Book」を持っています。これは「LetsBuildaCompiler」と呼ばれます。これは、「Learn By Doing」の方法論に従っており、このテーマに関する正式なクラスを受講しても何も得られなかった場合、または受講してからかなりの年月が経過している場合に最適です(私の場合)。それはあなたの手を握り、ラムダ計算と学界だけが気にする深い理論的問題であなたを襲う代わりにコンパイラを書くことを通してあなたを導きます。それは、何ヶ月も前に学校でVax(そう、VAXだ!)に何かを書いたというあいまいな記憶しか持っていなかった脳細胞をかき混ぜる良い方法でした。それは非常に会話的に書かれていて、ただ座って読むのが簡単です、最初の章を通過するためだけに数杯のコーヒーを必要とするほとんどの教科書とは異なります。理解の基礎ができたら、ドラゴンブックなどのより伝統的なテキストは、理解を深めるための優れた参考資料です。(個人的には、デッドツリーバージョンが好きです。ジャックを印刷しました。ラップトップよりも快適な位置で読む方がはるかに簡単です。また、電子ブックリーダーは、実際に読んでいるように感じられないものには高すぎます。まだ本物の本です。)ラップトップよりも快適な位置で読むのがはるかに簡単です。そして、電子ブックリーダーは、実際にはまだ本物の本を読んでいるようには感じられないものには高すぎる。)ラップトップよりも快適な位置で読むのがはるかに簡単です。そして、電子ブックリーダーは、実際にはまだ本物の本を読んでいるようには感じられないものには高すぎる。)
「欠点」と呼ばれるかもしれませんが、それはPascalで書かれているということですが、誰かが最初に動作するCプログラムを私にくれた場合よりも、それについて考えさせられたと思いました。それからAppartは、現時点では組み込みシステムでのみ使用されている68000を念頭に置いて作成されました。繰り返しますが、これは問題ではありませんでした。68000asmと68000asmは他のasmよりも読みやすいことを知っていました。
デッドツリー版が必要な場合は、The Art ofCompiler Design:TheoryandPracticeをお試しください。
Pete Eddyが指摘したように、JackCrenshawのチュートリアルは初心者に最適です。しかし、実際の本番Cコンパイラー(何かがスタックするまでコードを壁に投げることによって作成されるのではなく、優秀なエンジニアによって設計されたもの)がどのように機能するかを知りたい場合は、FraserとHansonのA Retargetable CCompiler:Designのコピーを入手してください。および実装。これには、非常にクリーンなlcc
コンパイラのソースコードが含まれています。設計と実装の説明がコードに組み込まれています。初心者向けの最初の本ではありませんが、慎重に勉強することで報われるので、35ドルで中古本を手に入れることができます。
についてのより長い宣伝文句については、 LinuxでのCの高速コンパイルlcc
を参照してください。
lccのWebページには、多くの優れた教科書へのリンクもあります。しかし、私が本当に好きなイントロテキストを知りません。
PS申し訳ありませんが、Uniで引き裂かれました。
FabriceBellardのotccソースコードを参照してください
正確に知りたいことに応じて、パイプとフィルターのパターンを確認する必要があります。これは、私が知る限り、これ(または同様のもの)が過去数年間に多くのコンパイラーで使用されているためです。
私のコンパイラの知識が古すぎない場合は、次のように機能します。
ソースコードをシンボリック表現に解析します
シンボリック表現をクリーンアップし、正規化を行います
特定のルールに基づくシンボリックツリーの最適化
シンボリックツリーに基づいて実行可能コードを書き出す
もちろん、依存関係なども解決する必要があります。
そしてもちろん、gccまたはjavacのソースコードを見ると、より詳細な理解を得るのに役立つ場合があります。
ソースコードを取得してコンパイラに読み取ることも役立つ場合があります。GCCは、20年以上にわたる言語の進化との完全な互換性を備えているため、最初の選択肢としては最適ではないと思います。しかし、内部リファレンスマニュアルの1つに基づいて、そのソースを読むことは教育的であると確信しています。
仮想マシンのバイトコードに内部的にコンパイルされたスクリプト言語のソースを検討することを真剣に検討したいと思います。いくつかの言語がその説明に当てはまりますが、私はLuaから始めます。言語は小さく、VMは斬新です。ソースコードも小さく、コメントは少ないですが、私が見たビットは非常に明確です。
万華鏡をご覧ください。LLVMを使用すると、わずか数日で独自のコンパイラを作成できます。