優れたコンピューター サイエンス学校はすべてコンパイラー コースを提供していますが、それを学部コースの必須の一部にしている学校は比較的少数です。この記事は、「なぜコンパイラの知識を学ぶ必要があるの?」という質問に答えます。たとえコンパイラを書くつもりがないとしても。
この記事を書いた理由の 1 つは、学部時代にコンパイラのコースが大好きだったが、それが実際に使われているところをほとんど見たことがなかったということです。教材のほとんどは単純なものか難解なもののように思えました (実際、私が見つけたコンパイラー教材のほとんどは退屈なものでした)。いずれにせよ、私はこの種のコースが実際になぜそれほど役立つのかを要約するのに数年を費やしました。その理由は次のとおりです。
アナライザーとパーサーはどこにでもあります
真剣な PHP プログラマーは、アナライザーとパーサーを理解する必要があります。なぜなら、常に小さなプログラムを書くだけではないからです。拡張可能なプログラムを作成したり、新しいタイプの入力ファイルを処理したりするたびに、それら (アナライザーとパーサー) について知る必要があります。グリーンスパンの第 10 法則:
「一定のレベルまで複雑な C または Fortran プログラムには、機能が半分しかなく、仕様を完全には満たしておらず、バグが多く、動作が非常に遅い一時的な Common が含まれています。 Lisp の実装。」そうです。重要なことは、どのような場合に既存のコードを借用するか、既存のツールを使用する必要があるかということです。理論的な知識が役立つのはどんな場合ですか?私たちが毎日使用する小規模な言語には、どのような言語設計原則が適用できるでしょうか?
正しいコードを書くことができるようになります
コンパイラは入力言語を正当なプログラムに正しく変換する必要があります。この目標を達成するには、コンパイラー開発者は、通常のプログラマーが目にすることのないいくつかのまれな問題を含め、入力言語全体を理解する必要があります。この理解プロセスは、通常コードを書くときに見るものとは異なり、プログラミング言語の本質に向かう重要なステップです。たとえば、シーケンス ポイント、未定義の動作、および一般的な算術変換の詳細を学んだ後、C 言語に対する私の理解は完全に変わりました。 C コンパイラ作成者はこれらの概念を習得していますが、ほとんどの初級および中級プログラマはこれらの概念を認識していません。言語の性質を知れば、言語についての考え方が変わり、より正確になると言っても過言ではありません。これはあらゆる言語、特に C や C++ のようなセマンティクスが不明確な言語に当てはまります。
より高速なコードを書くことができます
コンパイラーを理解することによって、それがどれほど合理的で単純に見えるかに関係なく、コンパイラーが最適化できる最適化と最適化できない最適化を明確に知ることができます。一般的にどのタイプのコードが最良のコード ブロックを構築するのか、なぜそうするのか、そして何をするのかを学びます。通常のオプティマイザを使用する場合と異なり、レジスタ バンクの半分をフィルタ係数のキャッシュに使用し、レジスタ バンクの半分をサンプルのキャッシュに使用する FIR フィルタなど、一部のコードのパフォーマンスが向上する理由がわかります。あなたとお気に入りのコンパイラは、効率的に作業するために使用したり、先読み最適化などの無意味なトリックを使用してコードを変更したりできる高速コードを作成するチームです。
第 2 に、コンパイラ バックエンドはターゲット アーキテクチャと密接に関連しています。もちろん、最新のアーキテクチャはアセンブリ プログラマに優しいプラットフォームを提供しようとしていますが、そう遠くないところにあります。コンパイラーのバックエンドと、バックエンドがそのようにコードを生成する理由を理解することで、コンピューター アーキテクチャの動作をより深く理解できるようになります。
概要
コンパイラは(理論的には)3つの部分から構成されます:
1.
言語関連のフロントエンド(分析、型検出)
2.言語とターゲットに依存しないミッドエンド(最適化))
3.ターゲット依存のバックエンド(マシンコードを生成)
はここにありますこの記事では、将来的にコンパイラを実装したり変更したりしない場合でも、コンパイラのあらゆる部分を理解することに価値があることを説得しようとしました。
LAMP Brothers オリジナルの PHP ビデオチュートリアル CD/「Essential PHP inDetails」を無料で受け取ります。詳細については、公式カスタマーサービスにお問い合わせください:
http://www.lampbrother.net
|