【長女に教えるPart1】コンパイル言語とインタプリタ言語の話

この記事の内容

  • コンパイル型言語とインタプリタ型言語の違いをわかりやすく解説します
  • .exe(実行ファイル)がどういうものかを丁寧に説明します
  • Pythonのようなインタプリタ言語が実際にどのように実行されるかを説明します
  • コマンドプロンプトとPowerShellの違い、そして.NETフレームワークについても触れます
  • 情報学系の大学1年生に向けた、プログラムの基本的な仕組みの入門解説です

はじめに

この動画は、情報学系の学部に入学した大学1年生の長女からの質問に答える形で始まっています。前回の会話でコマンドプロンプトとWindowsパワーシェルの違いについて話したことをきっかけに、今回はより深いテーマへと話が広がっていきます。


コマンドプロンプトとPowerShellの違い

長女の理解によれば、コマンドプロンプトは昔からある古いシェルで、PowerShellはより新しく、世界中の人が作った新しい機能も使えるものということでした。この理解はほぼ正確です。

PowerShellの大きな特徴として、.NETフレームワーク(現在は「.NET」)が使えるという点が挙げられます。


.NETフレームワークとは

.NETは、Microsoftが中心となって開発しているソフトウェアを作るための便利なライブラリ集です。

  • Webアプリケーション
  • モバイルアプリ
  • デスクトップアプリ
  • クラウドサービス
  • 人工知能

これらを開発する際、すべてをゼロから自分で作るのは非常に大変です。.NETはそういった開発作業を助けるために、「ウィンドウを表示する」「文字を出す」「音楽を鳴らす」などの機能をあらかじめ用意してくれています。

元々はWindowsアプリ開発向けでしたが、現在はLinuxでもmacOSでも動作するクロスプラットフォームな環境として進化しています。JavaやRubyなどと同様に、開発者が便利に使える部品を提供するエコシステムのひとつです。


実行ファイル(.exe)とは何か

コンピューターが何かを実行するとき、すべての動作の根本にあるのが実行ファイルです。Windowsでは拡張子 .exe(EXEcutionの略)が付いたファイルがそれにあたります。

メモ帳でこの .exe ファイルを開いてみると、人間には読めない文字化けのような内容が表示されます。これは実行ファイルが人間のために書かれたものではなく、コンピューター(CPU)が解釈・実行するために書かれた0と1の並びだからです。

コンピューターの中で「何かが動いている」とき、それはすべて .exe のような実行ファイルが動いています。

  • メモ帳 → notepad.exe
  • コマンドプロンプトの dir コマンド → dir.exe

シェル(コマンドプロンプトやPowerShell)は、こうした実行ファイルを次々に呼び出すためのしくみとも言えます。


コンパイル型言語の仕組み

プログラムを作る方法のひとつが、コンパイル型言語を使う方法です。

人間が書いた読みやすいプログラム(ソースコード)を、コンピューターが実行できる形式にあらかじめ変換してから実行します。この変換作業をコンパイルと呼び、変換するプログラムをコンパイラと呼びます。

.exeCPU01

C言語やC++などがコンパイル型言語の代表例です。コンパイル後にできた .exe ファイルは、そのままWindowsで実行できます。

今回の動画では、コマンドプロンプトでWebからファイルをダウンロードするツール「Wget for Windows」を例として使いました。このツールも、誰かがソースコードを書いてコンパイルした実行ファイルを、インターネットからダウンロードして使うものです。

コマンドプロンプトはインターネットが普及していない時代からある古いツールのため、Webのコンテンツを取得するようなコマンドは標準では含まれていません。そこで wget.exe のような別途用意された実行ファイルを使うことになります。


インタプリタ型言語の仕組み

もうひとつの方法が、インタプリタ型言語を使う方法です。Pythonがその代表例です。

Pythonのプログラム(.py ファイル)を実行するとき、私たちは次のようなコマンドを使います。

pythontest.py

ここで重要なのは、コンパイルという操作を行っていないという点です。では実際には何が起きているのでしょうか。

pPPyyyttthhhooonnn..teeexxseet.tpeyst.py1

つまり、Python.exe という実行ファイルが、人間が書いた .py ファイルを読み取り、解釈しながら動かしてくれているのです。

ここでひとつ重要なことがあります。Python.exe 自体はコンパイルして作られています。PythonはC言語などで書かれたソースコードをコンパイルして作られた実行ファイルです。インタプリタ型言語を「実行する側のプログラム」は、コンパイル型で作られているのです。


コンパイル型とインタプリタ型の整理

種別仕組み代表例
コンパイル型言語ソースコードをあらかじめコンパイルして実行ファイルを作り、それを実行するC言語、C++
インタプリタ型言語インタプリタ(実行ファイル)がソースコードを1行ずつ読んで解釈・実行するPython、Ruby

どちらの形態であっても、コンピューターが最終的に実行しているのは実行ファイルです。インタプリタ型言語の場合も、裏側では必ず実行ファイルが動いています。


コンパイラはどこから来るのか

「C言語でプログラムを書きたいとき、コンパイルするための .exe はどこにあるの?」という疑問が生まれます。

答えは、コンパイラも実行ファイルであり、インストールして使います。最初からOSに入っている場合もありますし、後からダウンロードしてインストールする場合もあります。コンピューターで何かを実行しようとすれば、必ず実行ファイルが関わってくるのです。


コンピューターの根本にあるもの

最後に、コンピューターのCPUが実行できるのは0と1の並び(機械語)のみです。レジスタと呼ばれる場所に値をセットしたり、足し算・引き算をしたりといった、非常に低レベルな命令の組み合わせがすべての動作の根本にあります。

では最初のコンパイラは誰が作ったのか。コンパイラもコンパイラがなければ作れないように思えます。答えは、最初の人が0と1を直接手で入力して作ったということです。パンチカードやスイッチを使って、機械語を直接記述することから、現在のような便利な開発環境が積み重ねられてきました。


まとめ

  • コンピューターが実行できるのは実行ファイル(.exe など)のみであり、中身はCPUが解釈できる0と1の並びです
  • コンパイル型言語では、ソースコードをあらかじめコンパイルして実行ファイルを作成してから実行します(C言語、C++など)
  • インタプリタ型言語では、インタプリタ(実行ファイル)がソースコードを1行ずつ読み取りながら実行します(Pythonなど)
  • Pythonを実行するとき、実際に動いているのは Python.exe という実行ファイルであり、.py ファイルはそれに「食わせる」ソースコードです
  • Python.exe 自体はコンパイルによって作られた実行ファイルです
  • コマンドプロンプトで使う dir などのコマンドも、すべて実行ファイルが実体です

プログラムの仕組みを理解する第一歩として、「コンピューターは最終的に実行ファイルしか動かせない」という原則を押さえておくと、さまざまな概念がつながりやすくなります。