C++言語講座 導入編
プログラミング言語の歴史
最初は、そもそも、C++ってのは、どんな位置付けにあるのか、と言う事を考えてみましょう。プログラミングには直接関係ない話なので、斜め読みでもOKですが、自分たちが今から何をするのか分からないと不安でしょうから、読むことを推奨。
C++言語までの歴史
機械語
まず、簡単な話。皆さんのパソコンに入っている、いろんなプログラム。これって、どういう仕組みで動いているのでしょう?それぞれのプログラムはディスクの中に拡張子が .exe のファイル(実行可能ファイル)として入っていますが、この .exe ファイルの中身はどうなっているのでしょう?ファイルの中身をそのまま表示・編集できるソフト(一般にバイナリエディタと呼ばれます)で、適当な .exe ファイルを開いてみました。(あ、間違って編集したら大変なので、真似しない方がいいかも)
[List1]
51 56 8B F1 89 75 F0 83 65 FC FF 8B CE E8 80 8F 00 E8 2B CE 01 00 83 4D FC 00 8D 8E AC 00 00 F1
これは、僕の作ったプログラム「GearTask」の一部分 (見易いようにスペースを入れてあります)。 .exe ファイルの中には、パソコンに「○○をしろ。 ××をしろ」というような命令が、パソコンに分かるような言葉で、[List1] のように書かれているんです。パソコンには日本語が分からないので、このように数字とアルファベットの羅列で命令するしかないんです。この、パソコンに分かる言葉を機械語とかマシン語などと呼びます。
アセンブリ言語
遥か昔は皆、この「機械語」を人間も覚えて、プログラムを作ってました (というか「作っていたらしいです」。そんな時代のことは知りません)。人間がコンピュータに合わせていたわけです。でも、これじゃ、いくらなんでも難しい。せめて、ぱっと見て、大体の意味がつかめるようになって欲しいですよね。そこで「機械語」の命令を、一つずつ英単語に置き換えれば、少しはプログラミングが楽になるんじゃないか、ということで作られたのが、アセンブリ言語(assembly language; assembly=組み立て)というプログラミング言語です。以下に、アセンブリ言語で作ったプログラムの例を示します。
[List2]
mov ax , 10 mov dx , 20 add ax , dx
ちょっとは、人間にも判りやすくなったでしょうか?ところで、このプログラム。一体何をしているんでしょうか?実は、10+20=?という計算をしているだけ。この為だけに、3行のプログラム。やっぱり、人間がコンピュータに合わせないといけないのは変わってないようです。
さて、[List2]のプログラムですが、さっきも言ったように、コンピュータは機械語しか理解できません。コンピュータに10+20=?という計算をさせたかったら、[List2]を先に機械語に翻訳しないといけません!このようにアセンブリ言語で書かれたプログラムを機械語に翻訳する事をアセンブル (assemble=組み立てる)。「アセンブル」するためのプログラムを アセンブラ(assembler)といいます。そして、[List2]のように、機械語に翻訳する前のプログラムをソースコード(source code:「元となるコード」の意)と呼びます。
補足) 「アセンブリ言語」の事を「機械語」と呼ぶ場合もありますが、便宜上区別して紹介しました。
高級言語の登場
ここまで見てきた、「機械語」と「アセンブリ言語」はコンピュータに判り易いように作られた、コンピュータのためのプログラミング言語といえるでしょう。だから、「機械語」と「アセンブリ言語」をあわせて、低級言語と呼びます。しかし、10と20を足し算して欲しいときに 10+20と書かせて欲しいのが人間の性という奴です。ここで、もっと人間にとって判り易いプログラミング言語が登場します。一般に高級言語と呼ばれるものです。ここでは、初期の高級言語の代表として、FORTRANのソースコードを見せましょう。
[List3]
PROGRAM LIST3
X=3
Y=4
Z=X+Y
WRITE(*,*) Z
STOP
END
どうでしょうか?ちょっとプログラムが長くて分かりづらいですが、
「X=3でY=4、Z=X+Yの時、Zを表示しろ!」
というプログラムである事は分かってもらえるでしょうか?大事な事は、Z=X+Yと式を書けるようになったことです。アセンブリ言語の時代からは考えられませんね。
高級言語で書かれたプログラムというものは、アセンブリ言語以上にコンピュータにとっては理解不能です。そこで、やはり機械語に翻訳してやる必要があります。高級言語で書かれたソースコードを機械語に翻訳する事をコンパイル (compile=翻訳)といい、そのためのプログラムをコンパイラ(compiler) と呼びます。
高級言語は人間に判り易くて、プログラムも簡単。と良い所尽くめのようですが、残念ながら何にも欠点というものは有ります。普通、FORTRANのような高級言語ではコンピュータのメモリや様々な装置を直接、操作するというようなことは出来ません。
インタプリタ式の言語
コンピュータのスピードがある程度速くなってくると、ソースコードを一気に機械語に翻訳するのではなく、 「少しだけ翻訳」→「実行」→「少しだけ翻訳」→…… と、少しずつ、実行しながら翻訳していく、という方法も考えられました。この方式をインタプリタ方式等と呼び、ソースコードを実行するプログラムをインタプリタ(interpreter:解釈する物)と呼びます。数学の教科書にも載っている、有名な初心者用の言語BASICもこの方式です。BASICのソースコードの例です。
[List4]
10 X=3 20 Y=4 30 Z=X+Y 40 PRINT Z
インタプリタ方式の言語の欠点は実行スピードが遅い事です。一々翻訳しつつなんですから、当然といえば当然です。このため、個人向けのコンピュータ上で、プロ用途で広く使われだしたのは、比較的最近のようです。
C言語
今は、Windowsという、ゲームからビジネスまで使える汎用のOSがありますが、昔はそんなものは有りませんでした。OSを作るにはコンピュータを直接操るプログラミング言語が必要ですが、アセンブリ言語や機械語では、大規模なプログラムを作るのはさすがに難しいです。アメリカにAT&Tという会社があります。AT&Tはビジネスから研究まで、汎用的に使えるOSを作ろうとしていましたが、それまであったようなプログラミング言語では難しい事に気付き、新たなOSを作るためのプログラミング言語の開発を始めます。結果、完成した言語がC言語 (programming language C)。そして、C言語を使って作られた、当時としては革命的なOSがUNIXです。
C言語はどこが他の言語と違うのでしょう?実際にC言語によるソースコードを見てみましょう。
[List5]
#include <stdio.h>
int main()
{
int x, y, z;
x = 3;
y = 4;
z = x + y
printf("%d\n", z);
return 0;
}
ソースコードの見た目は、他の高級言語と同じく、人間にも(ある程度)わかりやすいようになっています。しかし、それでいて、アセンブリ言語や機械語を駆使しないと出来なかった、コンピュータを直接操るような処理ができるんです。つまり、高級言語並の判りやすさで、アセンブリ言語並の機能をもっているわけです。C言語はあっというまに広がり、現在でも世界中の多くのプログラムが(ゲームでもビジネス用のソフトでも)C言語で書かれています。
C++言語
さて、C言語は非常に広まりました。もう、猫も杓子もC言語といった感じです。しかし、やはり問題点も有ります。C言語はプログラムの作りやすさは高級言語並ではあるのですが、機能的には低級言語に近いと言えます。特に、後に考案された、「オブジェクト指向」(obejct-oriented programming:OOP)という新しい手法を活用するには、機能が少なすぎました。この「オブジェクト指向」というのは、より複雑なプログラムをより分かりやすく作るために作られた手法…とでも考えておいてください。このC++言語講座で何度も出てくる単語なので、ゆっくりとマスターしていってください。
ここまで広まっているC言語の事です。「オブジェクト指向」を無視する事も出来ません。そして、紆余曲折を経て、「オブジェクト指向」を使うことのできる新たな言語C++言語(programming language C++)が誕生しました。と、ここまでは良いのですが、残念ながらC++言語はC言語ほどには普及していません。いえ、普及自体はしているのですが、ちゃんと使いこなせていない人も多いらしいです。その最たる理由は、C++言語があまりに難しいという所にあります。つまり、低級言語並みの機能というコンピュータ寄りの部分と、「オブジェクト指向」という人間寄りな部分と、相反する部分を持っているために、C++言語は非常に複雑な言語になってしまったのです。
しかし、これは反対に言えば、C++の利点でもあります。コンピュータに近い機能と、「オブジェクト指向」という最新の機能と、両方を駆使したプログラムを作れるわけですから。それに、C++さえマスターしてしまえば、他の言語など簡単なものです。(誇張)
ここにC++で書いたソースコードの例を示します。
[List6]
#include <iostream>
using namespace std;
int main()
{
int x, y, z;
x = 3;
y = 2;
z = x + y;
cout << z << endl;
return 0;
}
C++言語以後
Java
上で書いたように、C++は非常に高機能な言語ですが、「オブジェクト指向」と「低級言語っぽさ」が混在している所為で、難しくなってしまいました。そこで、アメリカのSun Microsystems社がC++を元に作った言語がJava です。JavaはC++に似た「オブジェクト指向」を備えていて、C++にあった「低級言語っぽさ」を完全に取り除いた言語です。とりあえず、Javaで書いたソースコードを見てみましょう。
[List7]
class List7 {
public static void main(String[] args) {
System.out.println("hello");
}
}
Javaの一番の特徴は、それまで一般的だった普通のコンパイラ型の言語ではないということです。JavaのソースコードはJavaコンパイラによって機械語に似た中間コードに翻訳されます。機械語はコンピュータの機種によって違います。例えば、Windowsパソコン用の機械語のプログラムを、マッキントッシュで動かす事は出来ません。しかし、Javaの場合、中間コードを更にインタプリタ方式で実行することにより、どの機種でも同じプログラムが全く同じように動くということを実現しました。このインタプリタの事を バーチャル・マシン(virtual machine:VM)と呼びます。
また、Javaはインターネットとの相性が良いこともあって、すぐに広まると思われていましたが、様々な理由から普及は遅れています。それに、根本的にインタプリタ方式の言語の宿命として、実行速度が遅いという問題も抱えています。
最近は大規模な業務用プログラムもJavaで書かれ始めているようです。
C#
最近になって、Microsoft社がJavaに対抗して作った言語が C#(シー・シャープ)です。C++を元に、Javaに似たような機能を備え、やはり様々な機種でどうさするプログラムを書くことが出来ます。基本的にWindows環境だけですが、PC上で動くプログラムだけなら、Javaよりも広まっているようです。
C#でのソースコードの例です。
[List8]
using System;
class List8 {
static void Main() {
Console.WriteLine("hello");
}
}
