ホーム第3章: プログラムとメモリ
第3章 1節

ソースコードから機械語へ

第2章では、CPUがメモリから命令を取り出し、解読・実行するサイクルを学びました。しかし、私たちが普段書くPythonやJavaScript、C言語などのプログラムは、0と1の数字の羅列ではありません。人間向けの言葉が、どのようにしてCPUが直接理解できる「機械語」へと姿を変えるのか、その翻訳のメカニズムを解説します。

1. 祖先としての「機械語」と「アセンブリ言語」

CPUが直接理解できる唯一の言語は、0と1のビットパターンだけで構成された機械語(Machine Code)です。 例えば「レジスタ1の値とレジスタ2の値を足す」という命令を送る場合、初期のコンピュータでは以下のような数字を入力していました。

0000 0001 0010 0011

このような入力を人間が間違えずに行うのは不可能に近く、すぐに限界を迎えました。そこで、0と1のパターンに人間が読める短い英単語(ニーモニック)を対応させたアセンブリ言語(Assembly Language)が生まれました。

例えば、上記の機械語に対して、アセンブリ言語では以下のように記述します。

ADD R1, R2, R3

このアセンブリ言語で書かれたコードを機械語に一対一で翻訳するツールのことをアセンブラ(Assembler)と呼びます。

2. 高水準プログラミング言語の登場

アセンブリ言語は機械語よりはるかに読みやすいものの、依然としてCPUの低レベルな命令を1つずつ記述する必要がありました。さらに、CPUのアーキテクチャごとに命令体系が異なるため、別のコンピュータで動かすにはプログラムを書き直さなければなりませんでした。

そこで、特定のCPUの構造に依存せず、人間にとって理解しやすい数式や論理でプログラムを書くことができる高水準言語(High-Level Language)が登場しました。C言語、Java、Python、JavaScriptなどはすべて高水準言語です。

高水準言語で書かれたプログラム(ソースコード)をCPUで実行するには、何らかの方法で機械語に翻訳する必要があります。この翻訳には、主にコンパイル方式インタプリタ方式の2つのアプローチがあります。

3. コンパイル方式:事前の丸ごと一括翻訳

C言語、C++、Go、Rustなどの言語で採用されているのがコンパイル方式です。

プログラムを実行する「前」に、コンパイラ(Compiler)と呼ばれる翻訳ソフトが、ソースコード全体をターゲットCPU向けの実行可能ファイル(機械語ファイル)へ一括変換します。

ソースコード (人間が書いたコード) コンパイラ (一括翻訳エンジン) 実行可能ファイル (純粋な機械語: 0101)
図 3-1:コンパイル方式の基本的な流れ

この方式のメリットは、実行時に翻訳が不要なため実行速度が圧倒的に速い点です。また、配布ファイルには機械語しか含まれないため、ソースコードを隠したまま配布できます。 一方、コードを少し変更するだけでも再コンパイルが必要になり、開発の手軽さに欠けるというデメリットがあります。

4. インタプリタ方式:同時進行の逐次通訳

Python、Ruby、JavaScriptなどの言語で採用されているのがインタプリタ方式です。

こちらは事前の機械語ファイル作成を行いません。プログラム実行時に、インタプリタ(Interpreter)と呼ばれるプログラムがソースコードを上から1行ずつ読み込み、その場で解読・即時実行していきます。

ソースコード インタプリタ 1行読み込み ➔ 解読 ➔ 即座に実行 CPUでの処理
図 3-2:インタプリタ方式の逐次解読フロー

この方式のメリットは、書いたコードをすぐに動かせる軽快さです。エラー箇所がわかりやすく、デバッグも容易です。 一方、実行のたびに1行ずつ翻訳を挟むため、実行速度はコンパイル方式に比べて大幅に遅くなります。また、実行側のコンピュータにもインタプリタのインストールが必要です。

5. まとめと現代の中間アプローチ

現代のプログラミング言語では、両方式がより複雑に融合しています。 例えば JavaやC# では、まず「中間コード(バイトコード)」と呼ばれる仮想CPU向けの命令列にコンパイルし、実行時に「仮想マシン」がそれを解読・実行します。さらに、頻繁に実行されるコードをその場で機械語に変換するJIT(Just-In-Time)コンパイラの技術により、インタプリタの手軽さとコンパイルの高速性を両立しています。

いずれの方式でも、最終的にプログラムはCPUの機械語命令となり、第2章で学んだ「メモリ」からフェッチされて実行されます。 次のセクションでは、CPUにデータを供給し続ける「メモリ」の物理的・階層的な仕組みを詳しく学びます。