Compiler-design-overview

提供:Dev Guides
移動先:案内検索

コンパイラ設計-概要

コンピューターは、ソフトウェアとハ​​ードウェアのバランスの取れた組み合わせです。 ハードウェアは単なる機械装置の一部であり、その機能は互換性のあるソフトウェアによって制御されています。 ハードウェアは、ソフトウェアプログラミングのバイナリ言語に相当する電子料金の形で指示を理解します。 バイナリ言語には、0と1の2つのアルファベットしかありません。 指示するには、ハードウェアコードをバイナリ形式で記述する必要があります。これは、単に1と0の連続です。 コンピュータープログラマーがこのようなコードを記述するのは困難で面倒な作業になるため、このようなコードを記述するコンパイラーがあるのはこのためです。

言語処理システム

どんなコンピューターシステムもハードウェアとソフトウェアでできていることを学びました。 ハードウェアは、人間が理解できない言語を理解します。 そのため、プログラムを高水準言語で記述します。これにより、理解しやすく覚えやすくなります。 これらのプログラムは、一連のツールとOSコンポーネントに送られ、マシンで使用できる目的のコードを取得します。 これは、言語処理システムとして知られています。

言語処理システム

高レベル言語は、さまざまな段階でバイナリ言語に変換されます。 *コンパイラ*は、高水準言語をアセンブリ言語に変換するプログラムです。 同様に、*アセンブラ*は、アセンブリ言語をマシンレベルの言語に変換するプログラムです。

まず、Cコンパイラを使用するプログラムがホストマシンでどのように実行されるかを理解しましょう。

  • ユーザーがプログラムをC言語(高水準言語)で記述します。
  • Cコンパイラは、プログラムをコンパイルし、アセンブリプログラム(低レベル言語)に変換します。
  • アセンブラーは、アセンブリプログラムをマシンコード(オブジェクト)に変換します。
  • リンカツールを使用して、プログラムのすべての部分をリンクして実行します(実行可能なマシンコード)。
  • ローダーがそれらすべてをメモリにロードし、プログラムが実行されます。

コンパイラの概念に直接入る前に、コンパイラと密接に連携する他のいくつかのツールを理解する必要があります。

プリプロセッサ

一般にコンパイラの一部と見なされるプリプロセッサは、コンパイラの入力を生成するツールです。 マクロ処理、拡張、ファイルの包含、言語拡張などを扱います。

通訳

コンパイラーのようなインタープリターは、高水準言語を低水準機械語に翻訳します。 違いは、ソースコードまたは入力を読み取る方法にあります。 コンパイラは、ソースコード全体を一度に読み取り、トークンを作成し、セマンティクスをチェックし、中間コードを生成し、プログラム全体を実行し、多くのパスを伴う場合があります。 対照的に、インタープリターは入力からステートメントを読み取り、それを中間コードに変換して実行し、次のステートメントを順番に取得します。 エラーが発生した場合、インタープリターは実行を停止して報告します。 一方、コンパイラは、いくつかのエラーが発生した場合でもプログラム全体を読み取ります。

アセンブラ

アセンブラは、アセンブリ言語プログラムをマシンコードに変換します。アセンブラの出力はオブジェクトファイルと呼ばれ、マシン命令とこれらの命令をメモリに配置するために必要なデータの組み合わせが含まれます。

リンカ

リンカーは、実行可能ファイルを作成するために、さまざまなオブジェクトファイルをリンクおよびマージするコンピュータープログラムです。 これらのファイルはすべて、別々のアセンブラーによってコンパイルされた可能性があります。 リンカの主なタスクは、プログラム内で参照されているモジュール/ルーチンを検索および検索し、これらのコードがロードされるメモリ位置を決定し、プログラム命令に絶対参照を持たせることです。

ローダ

ローダーはオペレーティングシステムの一部であり、実行可能ファイルをメモリにロードして実行します。 プログラムのサイズ(命令とデータ)を計算し、そのためのメモリ空間を作成します。 さまざまなレジスタを初期化して実行を開始します。

クロスコンパイラ

プラットフォーム(A)で実行され、プラットフォーム(B)の実行可能コードを生成できるコンパイラーは、クロスコンパイラーと呼ばれます。

ソースからソースへのコンパイラ

あるプログラミング言語のソースコードを受け取り、それを別のプログラミング言語のソースコードに変換するコンパイラは、ソースツーソースコンパイラと呼ばれます。