我々はすでに、コンパイラで議論している フロントエンド技術 。その焦点は、コンパイラは、プログラムを読むことができるようにすることです。非構造化テキストコードは、フロントエンドのその後の処理の後に、それは構造化された情報トークン、ASTと意味属性、シンボルテーブルと同様になります。この情報に基づいて、我々は、単純な達成することができます スクリプトインタプリタを 。
コンパイラバックエンドの問題が解決すべき:あなたはコンピュータを与えられて、どのように実行することができ、プログラムをビルドしないし、プログラムがコンピュータ上で正しくかつ効率的に実行することができましょうか?
実行メカニズム
私たちの関心は、2つの基礎となるハードウェアです。
- CPU:それは、データと機械語命令、および計算を受け取ることができます。その中に大幅に強化されるレジスタ、キャッシュと操作部、および能力のレジスタ・キャッシュシステムの完全な使用があります。
- メモリ:私たちは、メモリ内にコンパイルされたコードとデータを保存したいのですが、また、プログラムメモリを最も効率的に活用する仕組みを設計します。
コードを生成
バックエンドコンパイラの最終結果は、オブジェクトコードを生成することです。目標は、を参照するオブジェクトコードとしてC言語のプログラムのように、コンピュータ上で直接実行する場合は、アセンブリコード。そして目標は、このオブジェクトコードが参照する、Java仮想マシンを実行するのであれば、JVMバイトコード。
多くの異なるハイレベル言語で書き込みコンパイル、CPUやメモリなど、特定のハードウェアを気にすることとなっている1。例えば、我々はまた、CPUを知っておく必要があり、異なるCPU命令セットの違いを理解する必要があり、64ビットまたは32ビット、各命令は何のために使用などすることができ、いくつかのレジスタがありますされています。しかし、これは問題につながっているそれぞれの異なるハードウェアの各言語、異なるアセンブリコードを生成するということです。
したがって、ソフトウェアの再利用性を向上させるために、後端部の負荷を軽減するためには、導入する必要がある 中間コード(中間表現、IR)である機構、特定のハードウェアに依存し、コードフォーマット。各第一言語の遠位端は、IRに翻訳し、次いでIR異なるハードウェアアーキテクチャからアセンブラコードに変換することができます。n個のフロントエンド言語、m個のバックエンドアーキテクチャがある場合は、今、我々はM + Nの1だけ必要があり、n翻訳プログラム*メートルを行う必要があります。これは、大幅に全体的な作業負荷を軽減します。
全体として、我々はそれに対応するアセンブリコードに中間コードに変換するプログラムを介して、中間コードに変換し、各ターゲット・アーキテクチャのための可能な言語の多様。
コード分析と最適化
直接の翻訳により生成されたコードは単純に十分であることが多いので、正しいコードを生成することは、このようなコード実行の比較的単純な、低効率を実行することができ、一時的な変数の多くを生成するよう、命令の数が多いです。翻訳プログラムの正しさのすべての世話の最初のは困難を考慮に入れて、一方であり、最適化の妥当性があるため。一方、ハイレベル言語のプログラマ自身の限界へと練習をプログラミングにより、コードが最適とは言えない、私たちは、コンピュータのパフォーマンスを十分に発揮することができないためにつながることができます。私たちは、コードを最適化するためにしなければならないので。さまざまな言語プログラマの時間を比較すると、我々は彼らのパフォーマンスの違いを比較します。言語のパフォーマンスの低下は、それがその使用と人気に影響を与えます。
最適化の作業は、「分割され、マシンに依存しない最適化」と「マシン固有の最適化」2。
- マシンの独立した最適化は、IRに基づいて行われます。その代わりに、より効率的なコードで元のコードを、コードを解析することによってです。
- マシン固有の最適化は、ハードウェアに依存する機能です。
- 登録の最適化。変数の場合、頻繁に好ましくレジスタに、アクセス、およびいくつかの空のを防ぐために、レジスタの使用を最大化しようとします。
- キャッシュをフルに活用してください。
- 並列処理。現代のコンピュータは、複数のコア、並列コンピューティングを持っています。
- ライン。異なるCPU命令を扱うには、一定の期間を待つ必要は、いくつかの命令がで終了するのを待っている間、実際には、他の命令を実行することができ、同じではありません。
- 命令選択。時には、CPUの中から選択する複数のコマンドがあり、一つの機能を実行します。そして特定の要求のために、使用命令A命令Bは、時間の効率よりも高くてもよいです。
- その他の最適化。例えば、AIが電力を計算する、というように提供するように最適化AI専用のGPUチップのために行うことができます。
概要
バックエンド技術は、実行中のプログラムを生成し、機械的かつ効率的な操作で適切に彼をサポートすることです。これは、2つのステップに分かれています。最初の作業負荷を軽減し、取るためにソフトウェアを拡張を容易にし、改善するために、中間コードを生成します。一方、コードを最適化することができ、適切に実行するためのプログラムを保証する前提です。最適化は、独立して、マシンの中間コードのために最適化され、2分割に分割され、機種依存最適化は、マシンハードウェアの特徴であろう。
参考:「オタクの時間 - 美のコンパイラの理論」