コンピュータはマシン語しか理解しない

 皆さんは,そもそもコンピュータは何語で動いているのかわかりますか? 日本人にとっての母国語が日本語で,英国人にとってのそれが英語であるように,コンピュータにとっての母国語は機械語(マシン語)です*1。人間は,必要に迫られれば学習し,カタコトでも他国語を話せるようになりますが,コンピュータはちっとも自発的に学習してくれません。何年たっても,マイクロプロセサが直接に解釈・実行できる言語はマシン語だけです(多くの日本人が,中学からずーっと英語を勉強しているわりに,英語を話せないという事実はまあ,それはおいといて…)。

 マシン語というと,何か意味のある言葉のようなイメージがしますが,デジタル機器であるコンピュータの中では,プログラムも含め,あらゆる情報が2進数で表現されています。ですから,マシン語は人間の目には単なる数字の羅列にしか映りません。例えばこんな感じです。

 4D 5A 44 01 12 00 12 00 20 00 FF …

マシン語プログラムを16進数*2で表示させると,上記のように数字が並んでいるだけなのです。

 かつて,「コンパイラ」や「インタプリタ」という名前の便利な道具が存在しない時代がありました。そのころは,人間がこのマシン語でプログラムを記述していたのです。「4D5Aと書くと×××が○○○になるから,次は4401で△△△して…」と人間にとっては意味を見出せない数字の羅列でプログラムを作っていた――今,考えるとぞっとする作業ですね。

 そこで,人間にわかりやすい文字で書いたものをマシン語に変換(翻訳)するプログラムが開発されました。それが「アセンブリ言語」です。アセンブリ言語では「ニーモニック」という英単語を略式化したような記号でプログラムを記述します。例えば以下のような感じです。

 push ebp

 mov ebp,esp

 xor edx,edx

 mov eax,1

 …

このニーモニック・コードで記述されたプログラムを,「アセンブラ」という別のプログラムがマシン語に翻訳するのです。アセンブラは,ニーモニック・コードをマシン語に1対1で翻訳するプログラムです。ADD(加算),CMP(比較),DIV(除算),INC(+1する),DEC(-1する),JMP(無条件ジャンプ),MOV(データの転送)――といった命令が用意されています。

 アセンブリ言語を使えば,数字の羅列に比べてだいぶプログラムを読み書きやすくはなりました。しかし,しょせんアセンブリ言語も,基本的にはマシン語と1対1で対応しているに過ぎません。複雑なロジックを書くには面倒だということは想像がつくでしょう。わかりやすくなったけど,プログラミングはやっぱり大変な作業であるという状態ですね。

C言語はプログラマの共通語

 やがて,大規模なプログラムを,もっと効率よく,もっと簡単に作成できないかと,より自然言語*3に近い言葉でプログラムを記述するためのプログラミング言語(高級言語)の開発が始まりました。科学技術計算に向くFORTRAN,プログラミング初心者に適したBASIC,小数の計算が正確で事務処理に向くCOBOL,明確な文法を持つPascal――など1950年代ごろから,様々な高級言語が生まれました。

 そして1970年ごろ,これから本連載で皆さんが学ぶC言語が登場したのです。C言語は当初,UNIXというOSを開発するために作られました。しかしC言語が備える機能が強力だったため,UNIX上で動作するプログラムの開発や,Windowsにも使われていくようになりました。現在,Windows用のソフトウエア開発で,C言語が一番使われているというわけではありません。それでも,現在利用されている多くのプログラミング言語は,C言語の影響を少なからず受けています。

 C言語をオブジェクト指向化したC++や .NET対応のC#は当然C言語の流れをくんでいます。Javaもそうです。Webアプリケーションで使われているPerl,PHP(PHP:Hypertext Preprocessor),JavaScriptなどもC言語の影響を強く受けています。

 つまりC言語をマスターすれば,プログラミングに必要な基礎が身に付くとともに,現在注目を浴びている言語を学ぶ足がかりができるのです。今のC言語は,プログラミングを深く理解するうえでの共通言語に成っているといえなくもないでしょう。

C言語はコンパイラを使う

 さて,高級言語には,書いたプログラムをマシン語に翻訳するのに大きく2種類の方法,インタプリタとコンパイラがあります(図1)。図1上のインタプリタでは,プログラム実行時に1行ずつ翻訳を行います。翻訳-実行を1ステップ(1行)ごとに繰り返すわけです。実行するたびに翻訳する手間がありますから,処理速度はあまり速くはありません。でも,プログラムのバグ*4を見つけて修正したら,すぐに再実行できるという利点があります。短いプログラムを作成する場合や,プログラミングの学習に適しています。

図1●インタプリタとコンパイラ
図1●インタプリタとコンパイラ

 一方,図1下のコンパイラは,マシン語にプログラムを翻訳して,実行可能なファイルを作成します。プログラムに文法上の間違いがあった場合は,コンパイラがコンパイル・エラーとして出力するので,エラー・メッセージの内容を分析してプログラム上のミスを修正し,再度コンパイルしてプログラムを作っていきます。実行速度は翻訳の手間が必要ないぶんだけ,一般にインタプリタに比べて高速です。C言語は,こちらのコンパイラ方式を採用しています。

 ちなみにJavaや .NETに対応したプログラミング言語(C#,Visual Basic .NETなど)も,コンパイラを利用します。ただし,これらのコンパイラは特定のOSに依存するマシン語を作成するのではなく,代わりに「中間コード」というものを出力します。出力された中間コードは,Javaなら,Java VM*5というJavaプログラム専用の実行環境上で,.NETなら .NET Framework上*6でマシン語に翻訳され実行されます。実行環境がOSの違いを吸収してくれるので,同じプログラムが別の種類のコンピュータ上でも動作できる仕組みなわけです。

なにはともあれ
コンパイラをインストールする

 プログラミング言語の学習で一番大事なことは,実際に“自分の手を使って”プログラムを作成し,コンパイル・実行してみることです。読むだけではだめです。本連載でも,皆さんが実際に手を動かしながら学んでいけるようにしていきますので,どうぞ試してみてください。

 本連載で利用するC言語のコンパイラは「Borland C++ Compiler 5.5」です。ボーランドがWebサイトで無償公開しています。このコンパイラを使えば,Windows 95/98/MeのMS-DOSプロンプトや,Windows XPなどのコマンドプロンプト上で,C言語あるいはC++言語で記述したソース・プログラムをコンパイルできます。