プログラムとは

1.1 プログラムとは

 私たちは毎日、コンピュータを使って、表計算ソフトや文書作成ソフトなど、さまざまな「プログラム」を利用しています。プログラムを使うということは、特定の仕事をコンピュータに指示し、処理させていると考えることができ、プログラムは「この場合にはあれをしなさい」、「あの場合にはこれをしなさい」というように、コンピュータに対して様々な命令をする作業指示書であるとも言えます。
 プログラミングの世界では、この作業指示書のことをプログラムと呼び、プログラムを書く作業のことをプログラミングと呼びます。

1.1.1 プログラムは作業指示書のようなもの

 プログラムとはコンピュータに対して様々な命令をするための作業指示書であると説明しました。これから、このプログラムが具体的にどのようなものであるかを説明していきます。イメージをつかみやすいように、人間が人間に作業を指示する(作業指示書を渡す)場合と比べながら考えていきましょう。

1. 日本語を理解できる人間同士の場合

 作業指示書を出す側(自分)も、作業指示書を受け取る側(相手)も、日本語が理解できるとします。この場合は、日本語で書かれた作業指示書を渡せば良いことになります。

図1.1.1 日本語を理解できる者同士の作業指示書

2. 作業指示書を受け取る側が英語しか理解できない場合

 自分は日本語しか理解できず、相手は英語しか理解できない場合はどうでしょう。この場合は、英語で書かれた作業指示書を渡す必要があります。

図1.1.2 相手が英語しか理解できない場合の作業指示書

 このとき、作業指示書は日本語で書き、それを誰かに英語に訳してもらいます。英語を勉強して、正しい英語をすぐにマスターすることができれば第三者に英訳してもらう必要はありませんが、新しい言葉を勉強するのには多くの労力が必要で、現実的ではありません。

3. 作業指示書を渡す相手がコンピュータの場合

 先ほどの2.の場合、日本語で書いた作業指示書を誰かに英語に訳してもらう必要がありました。これは、コンピュータへの作業指示でも同じことが言えます。コンピュータが理解できる言葉のことを機械語と呼びますが、コンピュータは機械語しか理解できません。そのため、人間がコンピュータに作業を指示する場合、機械語で書かれた作業指示書を渡さなければなりません。

図1.1.3 相手がコンピュータの場合の作業指示書

 しかし、人間が機械語を修得するには、外国語を修得する以上に多くの労力が必要です。機械語という言語は「0」と「1」という数字の羅列からできており、人間が理解するには非常に難解でほぼ不可能です。ですので、人間にとって機械語よりは理解しやすいプログラミング言語で作業指示書を書き、それを機械語に訳してもらってコンピュータに渡すというやり方が現実的です。

 プログラミング言語とは、コンピュータに命令したい作業を書くのに使われる言葉で、Java言語、PHP、C言語など、多くの種類があります。(私たちがこれから勉強していくのは、Java言語という、代表的なプログラミング言語のうちのひとつです。)
 このプログラミング言語で書かれた作業指示書を機械語に訳し、コンピュータに渡すことで、コンピュータは作業指示書に書かれた命令を実行します。プログラミング言語で書かれた作業指示書のことをソースコードと呼び、ソースコードを書くことを「プログラミング」と呼びます。また、プログラミングをする人のことを、プログラマと呼びます。

図1.1.4 プログラマとプログラミングの関係

1.1.2 なぜプログラミング言語が考案されたのか

 先に述べたように、コンピュータは機械語しか理解できません。そして、機械語は人間が理解するにはとても難解です。そのため、人間がコンピュータに作業を命令したい場合は、「機械語よりは理解しやすい」プログラミング言語でコンピュータへの作業指示書(プログラム)を書き、このプログラムを機械語に訳してコンピュータに渡す方法が適切であると説明しました。
 ただし、プログラミング言語が「機械語よりは理解しやすい」と言っても、私たちが普段使っている日本語や英語のような「自然言語」と呼ばれる言葉とは性質が異なります。自然言語は、同じ文言でも状況や受け取る人の解釈によって意味が違ったりする場合がありますが、コンピュータは、人と違って、状況や文脈を判断することができません。そのため、コンピュータへの作業指示書は、誰がいつ解釈しても同じ意味になる必要があります。

 そこで、「誰がいつ解釈しても同じ意味になり、また機械語に翻訳しやすく、かつ人間にも理解しやすい中間言語」が考案されました。
 それが、プログラミング言語です。

 この理由により、人間はプログラミング言語を使ってコンピュータへの作業指示書(ソースコード)を書くようになりました。

図1.1.5 プログラムの動作イメージ

1.1.3 プログラム作成から実行までの流れ

 ここまででプログラムのイメージを見てきましたが、そのなかで、人間がプログラミング言語でコンピュータへの作業指示書(プログラム)を書き、このプログラムを機械語に訳してコンピュータに渡すと説明しました。この「訳す」という作業は、どのようなものでしょう。訳す作業には、コンパイラというものを使う方法と、インタプリタというものを使う方法の、大きく分けて2通りの方法があります。これらを使うことで、プログラミング言語で書かれたプログラムは機械語に訳され、コンピュータは命令を実行することができます。コンパイラとインタプリタのことを、言語処理系と呼びます。プログラミング言語によって、どちらの言語処理系を使うかは異なります。それぞれについて、少し詳しく見ていきましょう。

1. コンパイラ(compiler)型の言語処理系

 人間が人間に作業を指示する場合の例に戻り、作業指示書を訳す場面を考えてみます。日本語しかわからない人が、英語しかわからない人に作業を指示する場合です。まずは作業を指示する側が日本語で作業指示書を書きます。その作業指示書を翻訳者に渡すと、翻訳者は作業指示書を最初から最後まで全て英語に訳して返してくれます。

 作業を指示する人は、その英語に訳された作業指示書を、作業指示を受ける人間に渡します。

図1.1.6 作業指示書を翻訳して渡すイメージ

 この流れは、そのままプログラムを訳す場合にも当てはまります。人間がプログラミング言語でプログラムを書き、それを翻訳者に渡します。翻訳者は、プログラムを最初から最後まで機械語に翻訳し、人間に返してくれます。そして人間は、機械語に翻訳されたプログラムをコンピュータに渡します。コンピュータは、渡された機械語のプログラムを読み、命令を実行します。
 この翻訳者のことを「コンパイラ」と呼びます。そして、このコンパイラを使ってプログラミング言語で書かれたプログラムを翻訳する作業のことを、コンパイルと呼びます。
 コンパイラ型の代表的なものにはC言語などがあります。

2. インタプリタ(interpreter)

 インタプリタに関しても、人間が人間に作業を指示する場合の例に戻って考えてみましょう。先ほどと同じく、日本語しかわからない人が、英語しかわからない人に作業を指示する場面です。
 作業指示書を英語に訳すのはコンパイラと同じですが、コンパイラが翻訳者であるのに対して、インタプリタは通訳者であると言えます。まず作業を指示する側が日本語で作業指示書を書き、それを通訳者に渡します。そうすると通訳者は日本語で書かれた作業指示書を読み、作業指示を受け取る側の人に対して、作業指示の内容を英語に訳しながら1行ずつ話して聞かせます。

図1.1.7 作業指示書を通訳するイメージ

 この流れも、そのままプログラムに当てはまります。つまり、人間がプログラミング言語でプログラムを書き、それを通訳者に渡すと、通訳者はプログラムを1行ずつ読み、機械語に訳してコンピュータに渡すのです。コンピュータは、渡された命令を実行していきます。この通訳者のことをインタプリタといいます。
 インタプリタ型の代表的なものにはPHP言語などがあります。

3. Javaでの言語処理系

 ここまでで、コンパイラとインタプリタという、2種類の言語処理系を説明しました。プログラミング言語には、コンパイラ型の言語処理系を利用するものも、インタプリタ型の言語処理系を利用するものも、それぞれ数多くあります。
 コンパイラ型の代表的なものはC言語です。また、インタプリタ型の代表的なものには、PHPがあります。
ではJavaはどちらを利用するのでしょう。実はJavaは、コンパイラ型・インタプリタ型の両方を組み合わせて利用します。
 次の図は、Java言語で書かれたプログラムを機械語に訳し実行するまでの流れを、人間が作業指示書を渡す場合の例を使って表しています。

図1.1.8 Javaでのプログラム処理の流れ

 上の図を見ると、日本語で書かれた作業指示書を渡された翻訳者は、それを英語ではなく「中間言語」という特殊な言語に訳しています。そしてそれは通訳者に渡され、通訳者は中間言語を英語に訳します。
 先に述べた、コンパイラ型(翻訳者)とインタプリタ型(通訳者)が組み合わさっている様子がわかるでしょうか。Javaでは、このような流れでプログラムが処理されます。

 これを、プログラマとコンピュータの関係で表すと次の図のようになります。

図1.1.9 Javaでのプログラム処理の流れ

 まずプログラマがプログラムを書き、それをJavaコンパイラというものに渡しています(①)。そしてこのJavaコンパイラは、プログラムをもとにJavaバイトコード(Javaクラスファイルともいう)というものを作成し、プログラマに返しています(②)。
 その後、プログラマは、Javaコンパイラから返されたJavaバイトコードを、JavaVM(Java Virtual Machine:Java仮想マシン)というものに渡しています(③)。そしてこのJavaVMが、Javaバイトコード(Javaクラスファイル)に変換された命令を機械語に訳してコンピュータに伝えています(④)。
 Javaの言語処理系は、コンパイラ型とインタプリタ型を組み合わせたものと説明しました。この図にあるJavaコンパイラが、先に説明したコンパイラに当たります。ただし、「Javaコンパイラ」は、Javaで書かれたプログラムをそのまま機械語に翻訳するのではなく、Javaバイトコードという、Javaならではの特殊な言語に翻訳します。
 このJavaバイトコードが人間に返され、その後JavaVMに渡されます。このJavaVMが、インタプリタにあたります。JavaVMは、Javaバイトコードの内容を1行ずつ読み、機械語に通訳してコンピュータに伝えます。コンピュータは、通訳された命令を実行します。
 このように、Javaではコンパイラとインタプリタを組み合わせてプログラムを実行するのです。

 「バイトコード」、「JavaVM」など、難しい単語がでてきましたが、今の段階では、これらの専門用語を覚えることは重要ではありません。全体の流れをなんとなくつかむことができていれば、それで充分です。

NEXT>> 1.2 Javaの特徴