Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

中間言語(チュウカンゲンゴ)とは | 意味や読み方など丁寧でわかりやすい用語解説

中間言語(チュウカンゲンゴ)の意味や読み方など、初心者にもわかりやすいように丁寧に解説しています。

作成日: 更新日:

読み方

日本語表記

中間言語 (チュウカンゲンゴ)

英語表記

intermediate language (インターミディエイト ランゲージ)

用語解説

プログラミング言語のコンパイラやインタプリタ、仮想マシンといったソフトウェアの実行環境において、プログラムの処理過程で生成される特定のコード形式を中間言語と呼ぶ。これは、人間が記述する高級プログラミング言語のソースコードと、コンピュータが直接実行可能な機械語との中間に位置する、一種の抽象的なコード形式である。中間言語の導入は、ソフトウェア開発における複数の重要な課題を解決するために考案された技術であり、現代の複雑なソフトウェアシステムを支える不可欠な要素となっている。

中間言語が解決する主要な課題の一つは、プログラムの移植性の向上である。プログラミング言語が特定のCPUアーキテクチャやオペレーティングシステムに依存することなく、多様な環境で動作できるようにするためには、各環境固有の機械語を生成する必要がある。この際、もしコンパイラが一度ソースコードを共通の中間言語に変換し、その中間言語から各ターゲット環境に特化した機械語を生成する構造になっていれば、コンパイラ開発の労力を大幅に削減できる。具体的には、コンパイラの処理を、ソースコードの解析から中間言語の生成までを担当する「フロントエンド」と、中間言語から特定の機械語を生成する「バックエンド」に分離することが可能になる。これにより、一つのフロントエンドで多様なプログラミング言語を処理し、一つのバックエンドで多様なターゲットアーキテクチャに対応するといったモジュール化が容易になり、結果として一つのプログラミング言語が様々なプラットフォームで動作したり、一つのプラットフォームが多様なプログラミング言語をサポートしたりすることが容易になる。

もう一つの重要な目的は、プログラムの実行効率を最大化するための最適化である。人間が読み書きしやすいソースコードは、多くの場合、冗長な記述や非効率な処理を含んでいる可能性がある。一方で、最終的に生成される機械語は非常に低レベルであるため、その段階での最適化には限界がある。中間言語は、ソースコードよりも低レベルで、しかし機械語よりも抽象度が高いという、最適化処理を行うのに最適な粒度でプログラムの構造を表現できる。この中間言語の段階で、コンパイラはコードの冗長性の排除、共通部分式の計算、ループ構造の効率化、未使用コードの削除、メモリアクセスの最適化など、多岐にわたる複雑な最適化処理を適用する。これらの最適化によって、最終的に生成される機械語はより高速に、より少ないメモリ使用量で動作するようになり、アプリケーション全体の性能が向上する。

コンパイラがソースコードを機械語に変換する典型的なプロセスを追うと、まずソースコードは字句解析(トークンへの分解)、構文解析(抽象構文木ASTの構築)、意味解析(型チェックなど)を経て、プログラムの内部表現へと変換される。この抽象構文木は、中間表現の一種とも言えるが、そこからさらに、より低レベルで仮想マシン命令に近い形式の中間言語が生成される。この中間言語が、様々な最適化処理の対象となり、最終的にターゲットアーキテクチャ固有の機械語に変換されるのである。

具体的な中間言語の例は数多く存在する。Java言語の場合、ソースコードはJavaバイトコードと呼ばれる中間言語にコンパイルされる。このバイトコードはJava仮想マシン(JVM)の命令セットであり、JVMはバイトコードを直接解釈実行するか、または実行時にJIT(Just-In-Time)コンパイラを用いてネイティブ機械語に変換しながら実行する。JITコンパイラは、プログラムの実行中に頻繁に呼び出されるコード部分を特定し、その場で機械語にコンパイルすることで、高い実行性能を実現する。同様に、C#やVisual Basic .NETなどの.NET系言語は、共通中間言語(CIL、旧称MSIL)にコンパイルされ、このCILが共通言語ランタイム(CLR)上で実行される。CILもまた、JITコンパイラによって実行時に機械語へと変換されることで、クロス言語間での相互運用性と高い性能を両立させている。

コンパイラ基盤として広く利用されているLLVM(Low Level Virtual Machine)は、LLVM IR(Intermediate Representation)という非常に強力で最適化に適した中間言語を核としている。LLVM IRは、ソース言語の種類やターゲットアーキテクチャに依存せず、プログラムの制御フローやデータフローを詳細に表現できるため、高度な最適化を適用した上で、様々なCPUアーキテクチャ向けの高性能な機械語を生成することを可能にしている。また、近年ではWebブラウザ上で高性能なアプリケーションを実行するためのバイナリ形式であるWebAssembly(Wasm)も、C、C++、Rustといった言語からコンパイルされる主要な中間言語として注目されている。WasmはJavaScriptと連携し、Webアプリケーションの性能を劇的に向上させるための基盤となっている。

インタプリタ型のプログラミング言語においても、内部的に中間言語が利用されるケースは少なくない。例えばPythonでは、ソースコードが直接解釈されるのではなく、一度Pythonバイトコードと呼ばれる中間言語にコンパイルされ、このバイトコードがPython仮想マシンによって実行される。この方式は、毎回ソースコードを解析するよりも実行効率が高まるという利点があり、言語の起動時間を短縮したり、実行速度を向上させたりする効果がある。

中間言語の表現形式には、いくつかの種類がある。最も基本的なものの一つに、一つの命令が最大三つのオペランドを持つ「三番地コード」があり、これは命令のアドレス指定が明確で、データフロー分析に適している。また、スタックマシン向けの「スタックベースコード」は、オペランドをスタックから取得し、結果をスタックに積むシンプルな形式である。さらに、最適化を容易にするために、変数への代入が一回しか行われないことを保証する「静的単一代入形式(Static Single Assignment, SSA)」のような、より高度な形式も存在する。これらの様々な中間言語の形式は、コンパイラがプログラムの構造を効率的に分析し、最適なコードを生成するために重要な役割を果たしている。

このように、中間言語は、プログラミング言語のコンパイラや実行環境における中核技術であり、ソフトウェアの移植性、実行性能、そしてコンパイラ開発の効率性を飛躍的に向上させる。異なるプログラミング言語が異なるプラットフォームで協調して動作する現代の複雑なソフトウェアエコシステムにおいて、中間言語は、その基盤を支える目に見えないが極めて重要な要素なのである。

関連コンテンツ

関連IT用語