中間コードとは、
のいずれか、または両方を指す言葉である。
機械語のバイナリデータを直接記述しない限り、人間の書いたプログラム(ソースコード)をコンピュータが直接実行することはできない。従って、プログラミングではソースコードを各コンピュータで実行できる機械語に変換する必要がある。
この変換過程の中間生成物を中間コードと呼ぶことがある。インタプリタ型言語よりもコンパイル型言語で用いられることが多い用語である。
高級言語であるJavaやC#等はそのままではコンピュータが実行できる形式ではない。これらの言語に限らないが、一般的にソースコードの実体は単なるテキストファイルのグループである。実行するには機械語に変換する必要があることは既に述べたが、機械語はCPUアーキテクチャやハードウェア構成などに依存しているので、異なるコンピュータでは実行できない等の問題が起きる。
そこで、JavaやC#ではソースコードを中間コードにコンパイル(変換)して、各コンピュータに導入されている仮想マシン(実行環境)に実行させることで、仮想マシン内で中間コードが各コンピューター向けの機械語に変換されて実行されてどの環境でも同じ結果が得られるようにしている。
そのため、この形式を採用している開発環境で作成されたプログラムを実行するためには、対応する実行環境(仮想マシン)が導入されている必要性がある。ものすごく大雑把にいえば、RPGツクールで作られたゲームを遊ぶにはRPGツクールの実行環境が必要、といったものと同じである。
Javaのバイトコードや.NET FrameworkのCIL(Common Intermediate Language: 共通中間言語)が有名だが、他にはWebAssemblyもこのタイプの中間コードと言える。
C/C++のような高級言語の中でも機械語にコンパイルしやすい言語では、コンパイルの結果として仮想マシンを必要としない実行ファイルを得ることができる。これら言語のコンパイルの際に、ソースコードのファイルやクラス別に一時的なコンパイル結果としてのオブジェクトファイルが生成される。これを指して中間コードと呼ぶ。
また、アセンブリ言語のように機械語(CPUの命令コード)に一対一で対応したプログラムを記述するタイプの低級言語でも、コンパイル(アセンブル)を通して実行ファイル形式を得る必要があるが、これについてもC/C++等と同様の中間コードが生成されることがある。
デバイスドライバ等のハードウェアに依存するコードはこれらの機械語に変換しやすい言語[1]で書かれることが多い。
なお、C/C++やアセンブリ言語に代表される直接実行コードを生成できる開発環境においても、ユーザーインターフェィスを伴うような実行ファイルでは、デバイスドライバ等ハードウェアの差異を吸収するための外部ライブラリを実行時リンクするための動的リンク環境が必要となるケース[2]が多く、開発環境に応じた実行環境(仮想マシンではなく、ライブラリファイル群)が必要となるケースが多い。
かつてのポケットコンピュータ等では命令コードが機械語コードとほぼ一対一で対応しているものがあり、BASICのように見えるが実体はアセンブリ言語に近いといった環境もあった。
LLVMのビットコードは仮想マシンで直接実行するのではなく、最終的に各環境にあわせてコンパイルされるので、このタイプの中間コードと言えよう。
中間コードを保持しておくことで、元のソースコードが変更されていない場合(一部ファイルがリライトされた場合)に、変更された部分だけをリコンパイルしてリンクすることでフルコンパイルするより素早く新しい実行ファイルを得ることができるといった利点がある。
PythonやJavaScript、Rubyのようなスクリプト言語は、プログラムの実行中にプログラミング言語から機械語への変換を行っている。また、コマンドプロンプトにおけるバッチファイルなどのコマンド制御スクリプトは、シェル[3]をスクリプト言語の実行環境として扱ってプログラムを実行する。
一見してどの環境でも実行可能に思えるが、実際には「プログラミング言語から機械語への変換」を行うための実行環境Pythonのライブラリ群やRubyのライブラリ群などが必要である。バッチファイルでもシェルの実装が違えば(Linux等では複数のシェルが提供されている)実行結果も異なる。言ってみれば「ソースコードとなるバッチファイルを逐次コンピュータが理解できる形式にして実行している」わけである。
一部のスクリプト言語はコンパイルを行い実行ファイルを生成することができる。また、スクリプトが変更されていない場合に限り、一度逐次コンパイルした結果をキャッシュしておいて実行速度を上げるといった処理が行われることがある。
しかし、通例としてこのキャッシュされたコンパイル済みコードは中間コードとは呼ばれていない。
掲示板
7 ななしのよっしん
2021/10/09(土) 21:54:39 ID: fluwESJifg
書き直してみたけど20年前の知識なんで現状に詳しい人のリライト求む
8 ななしのよっしん
2021/10/10(日) 11:49:16 ID: Z+25XlT43h
低級言語・高級言語ってアセンブラ言語かそれ以外かで、VM言語かどうかではない、つまりCは高級言語と記憶してたけどちがったっけ?
9 ななしのよっしん
2021/10/10(日) 12:00:59 ID: J8+b7//5SC
>>8
それで合ってるみたい
https://
プロセッサの仕様に依存する言語を低級言語、プロセッサに関係なく記述できる言語を高級言語と言うらしい
C言語のおかげでUNIXが移植しやすくなったみたいな話を聞いたことあるから、そういうことなんだろうな
急上昇ワード改
最終更新:2024/04/25(木) 06:00
最終更新:2024/04/25(木) 06:00
ウォッチリストに追加しました!
すでにウォッチリストに
入っています。
追加に失敗しました。
ほめた!
ほめるを取消しました。
ほめるに失敗しました。
ほめるの取消しに失敗しました。