本文へ移動

コンパイル型プログラミング言語:仕組み・特徴・解釈型との違い

コンパイル言語とは何かを解説。ソースコードが機械語の実行可能ファイルへ変換される仕組み、特徴、歴史、代表例、利点、解釈型言語との違いを紹介する。

コンパイル型プログラミング言語とは、通常、プログラムをあらかじめプロセッサが直接実行できる低水準の命令へ変換する言語である。この手順では、人間が読めるプログラミング言語のソースファイルをコンパイラに渡す。コンパイラは解析とコード生成を行い、機械語などの機械水準の出力を生成する。コンパイルの結果は、多くの場合、元のソースを再び読み込まなくても読み込んで実行できる実行可能ファイルまたはライブラリとしてパッケージ化される。

コンパイルの仕組み

コンパイルは複数の段階から成る処理である。一般的な段階には、字句解析、構文解析、意味チェック、最適化、コード生成が含まれる。コンパイラはプログラムを読み取り、抽象構文木や中間コードといった内部表現を構築する。それらを変換した後、対象ハードウェアが理解できる命令へと低水準化する。ツールチェーンによっては特定のプロセッサ・ファミリー向けのネイティブ機械語を生成し、別のものは仮想マシン向けの中間バイトコードを生成する。

特徴とトレードオフ

  • 性能:コンパイル済みコードは、追加の変換なしで実行できる機械水準の命令があらかじめ用意されるため、通常は高速に動作する。
  • 移植性:ネイティブ・コンパイルは特定のアーキテクチャを対象とする。移植するには再コンパイルするか、アーキテクチャ非依存のバイトコードを生成する必要がある。
  • ビルド時間:プログラムは実行前にコンパイルしなければならず、一部の解釈型のワークフローと比べて独立したビルド工程が加わる。
  • ツール:コンパイル言語用ツールチェーンでは、静的解析、最適化、リンク時の検査、実行前のエラー検出が一般に利用できる。

歴史と発展

コンパイルは、初期のコンパイラが高水準の構文をアセンブリまたは機械命令へ翻訳した1950年代から、プログラミングの中心的な技術であった。数十年にわたり技術は発展し、コンパイラの最適化はより高度になり、複数のバックエンドをサポートするようになった。また、コンパイル型と解釈型の境界を曖昧にするジャストインタイム・コンパイルのような概念も導入された。

用途と例

コンパイル言語は、性能や低水準での制御が重要となる場面、すなわちシステムソフトウェア、デバイスドライバ、高性能アプリケーション、多くのデスクトッププログラムで広く使われる。よく知られた言語の中には通常コンパイルされるものがある一方、いずれの方式でも実装可能なものもある。コンパイル実装の例としては、バイトコードにコンパイルしてからVMで実行するJava、多くの実装が機械語またはバイトコードへコンパイルするLisp、一般には解釈されるが専用コンパイラによりバイトコードまたはネイティブコードにもコンパイルされるPythonが挙げられる。実装の多様性により、ある言語をどのように分類するかは、実際の使用方法に左右されることがある。

区別と主な事項

コンパイル型と解釈型は便利な分類だが、絶対的なものではない。事前コンパイルを行う環境もあれば、ジャストインタイム・コンパイルを行う環境もあり、柔軟性と性能を得るために解釈とコンパイルを組み合わせる環境もある。スクリプト言語は対話的に使いやすいことから解釈方式と結び付けられることが多く、システム水準の言語はより一般的にコンパイルされる。コンパイルモデルの選択は、起動時間、実行時速度、移植性、開発者のワークフローに影響する。

言語が用いるコンパイルモデルを理解することは、開発者がツールを選び、性能を最適化する助けとなる。コンパイラ、ビルドシステム、実行時のトレードオフについてさらに調べるには、言語の文書およびコンパイラ・プロジェクトのページを参照できる。言語の概要、コンパイラの内部構造、実行可能ファイル形式、ならびにJava、Lisp、Pythonの実装に関する注記が参考となる。

関連項目

著者

AlegsaOnline.com コンパイル型プログラミング言語:仕組み・特徴・解釈型との違い

URL: https://ja.alegsaonline.com/art/22239

共有

出典