【人間と機械の通訳】プログラミング言語を機械語に翻訳するしくみ

コンピュータが理解できる言語は機械語です。機械語とは、

11001010001010101111101001000

みたいな、「0」と「1」の2進数です。

機械に命令するときは、2進数で伝える必要があります。しかし、私たちが2進数で様々な命令を伝えるのは至難の業です。

ではどうするのかということで、私たちの指示を機械語に翻訳して伝えようという考えに至るわけです。

こうして生まれたのがプログラミング言語です。

プログラミング言語は機械語に翻訳しやすく、かつ人間が理解しやすい中間の言語なので、私たちが普段使う言葉と同じというわけではありません。

しかし、機械語よりは遥かに理解しやすく、多くの人が扱うことができます。

プログラミング言語は1つじゃない

人間が使う言葉に日本語や英語、中国語などがあるように、プログラミング言語にも様々な言語が存在します。


人間の言語は地域によって変わりますが、プログラミング言語は目的や用途によって変わります。代表的な言語として、C言語やJava、Pythonなどがあります。

言語プロセッサ

プログラミング言語で記述されたソースコードは、機械語に翻訳する必要があります。翻訳作業を行うプログラムをまとめて、言語プロセッサと呼びます。


言語プロセッサにはいくつか種類がありますが、特によく出てくる「インタプリタ方式」と「コンパイラ方式」を紹介します。

インタプリタ方式

インタプリタ方式では、ソースコードに書かれた命令を、1つずつ機械語に翻訳しながら実行していきます。そのため、作業途中のプログラムであっても、作ったところまで実行といったことが可能です。


逐次機械語に翻訳していくため、処理速度は遅くなります。
Pythonなどがインタプリタ方式の言語にあたります。ちなみに筆者は普段Pythonを使っています。

コンパイラ方式

コンパイラ方式では、ソースコードを最初にすべて翻訳し、機械語のプログラムを作成します。最初にすべて翻訳するため、処理速度は速いです。

一方、作業途中に処理を確認するために動かしてみるといったことができません。(昨今では、統合開発環境を使うことで作業途中の処理確認ができます。)
C言語やJavaはコンパイラ方式の言語です。

言語プロセッサには、その他に「プリコンパイラ」や「クロスコンパイラ」、「エミュレータ」などがあります。

コンパイラ方式におけるプログラム実行

ここからは、コンパイラがどのような手順でプログラム言語を機械語に翻訳していくのかを見ていきましょう。

コンパイラの処理手順

コンパイラでは、ソースコードを以下の手順で処理することで、機械が解釈できるプログラムを生成します。ここで、機械が解釈できるプログラムのことを目的プログラムと呼びます。

1.字句解析

ソースコードに書かれたプログラムを、トークン(字句)単位に分解します。

例) y = ax + b というコードがあれば、

と、1つ1つ分けていきます。

2.構文解析

トークンを解析して、構文木と呼ばれるデータ構造を生成します。構文木とは、以下のような木構造を指します。

英語の構文木の例
wikipediaより引用

3.意味解析

変数の型およびトークンがプログラミング言語の仕様と一致するかをチェックします。

4.最適化

処理効率の向上を目的として、プログラムの質の向上を図ります。最適化のアプローチには、大きく2つあります。

コードサイズから見た最適化

生成される目的プログラムのサイズを小さくすることを目標として最適化を図ります。

実行速度から見た最適化

実行速度をなるべく早くすることを目標に最適化を図ります。

5.コード生成

目的プログラムを生成します。

リンカ(連携編集プログラム)の役割

プログラムが1つのモジュール(目的プログラム)で動くことはほぼありません。多くの場合、自身で作成したモジュールや、ライブラリなど提供されているモジュールを組み合わせることで、1つのプログラムとして動作します

ここで登場するのが「リンカ」です。

プログラムが使用しているすべてのモジュールを結合することで、実行可能なファイル(ロードモジュール)が出来上がります。この、モジュールを結合する役割を担うのがリンカです

モジュールをリンクさせるから「リンカ」と呼ばれるんですね。

ローダの役割

ロードモジュールを主記憶装置に読み込ませる作業をロードと呼びます。この作業を行うのが「ローダ」です。

ロードが完了すると、あとはCPUにプログラムを実行してもらうのを待つのみです。

まとめ

言語プロセッサは、人間と機械の間に入る通訳の役割を担っているということですね!プログラミング言語についても、今回上げたもの以外にたくさん種類があるので、是非調べてみてください(今後記事で紹介する予定です!)。


プログラミングの勉強始めようかなと考えている人は、それぞれの言語がどういった目的や用途で用いられているかを参考にするとよいと思います。

↑↑この内容についても今後書きます。


ではでは👋