Computer Programing

2004-01

 プログラム言語とは

 コンピュータは与えられた命令に従って動きます.その命令を書き並べたものがプログラムです. WEB ページを見るための WEB ブラウザ,メールを読み書きするためのメーラ,文章を書くためのワープロなどのアプリケーションソフトウェアも,プログラムによってその動作が定義されて動いています.このプログラムを作るという作業がプログラミングです.

 ここでコンピュータはどのような命令を受け取り,実行することができるのでしょうか.コンピュータは「英単語 apple の意味を教えよ」といった命令を直接実行することはできません.コンピュータは数値の加算や減算などの数値演算命令や数値の保存,取り出し,ある数値が正だったら何個先の指示に飛ぶなどの制御命令しか処理することはできません.そして,この命令もコンピュータの中では数値で表されます.つまり,コンピュータが直接解釈することができるプログラムは数値の集合であり,数値の意味に従って,数値を処理するだけの機能しかありません.先の「英単語の意味を教えよ」に答えてその意味を表示させるようにするには,数値演算や制御命令を組み合わせることになります.

 このコンピュータが直接解釈できる命令を機械語(マシン語)と呼びます.どのような命令があり,その命令がどのような数値であらわされるかは,コンピュータの中央演算処理装置(CPU)によって決まっています.この機械語のプログラムをスムーズに書くには,命令をあらわす数値などを覚えておく必要があり面倒です.またジャンプ命令等の飛び先を直接書かなければならず,プログラムを変更するとその相対距離が変わってしまうため,そのたびに飛び先も変更しなければなりません.これを解決するために作られたのがアセンブリ言語です.たとえば加算命令だったら ADD という語(ニーモニック)を数値の代わりに書くことができます.また,ジャンプ命令の飛び先などにも名前をつけることができ,人が見てその内容を直感的に理解することができます.アセンブリ言語で書かれたプログラムを実行するには,コンピュータが理解できる機械語のプログラムに変換します.ちなみに,この変換を行うのもプログラムであり,アセンブラと呼ばれています.

 アセンブリ言語はコンピュータが理解できる命令を直接指示することができるので,自由度が高いメリットがありますが,簡単にプログラムを作るという面では非力です. 3+5 という計算をしたい場合,アセンブリ言語では,たとえば

 LOADI 3
 ADDI  5

などと書きますが,単に 3+5 と書けたほうが直感的だと思います.このように,より人に分かりやすい文法でプログラムを書けるようにしたものが高水準プログラム言語と呼ばれるものです.たとえば,BASIC と呼ばれる言語で,3+5 の結果を画面上に表示するプログラムは,

 PRINT 3+5

とすればよく,「3+5 の計算結果を表示(PRINT)するんだな」と意味がすぐにわかります.

プログラム言語の種類

 コンピュータ上で動くプログラムには様々な目的のために,様々な動きをするものがあります.その動きによって,プログラムの書きやすい書き方が異なります.そのために,これまで様々なプログラム言語が考え出されてきました.プログラム言語を書き方の種類で分類すると,手続き型言語,関数型言語,論理型言語, オブジェクト指向言語に分けられます.

 手続き型言語は,命令文を実行する順に並べます.その順を変えるには繰り返し文や分岐文などの制御構造を利用します.手続き型言語には FORTRAN や COBOL,PASCAL,C などがあります.関数型言語は,関数を定義することで動作を指示するもので,LISP や ML が代表的な例です.論理型言語は,形式論理,数理論理に基づいたプログラム言語で,事実を定義することである問題を解決することができます.論理型言語には Prolog などがあります.オブジェクト指向言語は,データとそのデータに対する操作をまとめたオブジェクトの性質を定義することで動作を指示します.オブジェクト指向言語には Smalltalk,C++, Objective-C,Java などがあります.

 上記の高水準プログラム言語を実行するためには,アセンブリ言語で書かれたプログラムを実行するためにアセンブラで機械語に変換するように,機械語に変換しなければなりません.この変換作業を行うプログラムを言語処理系と呼びます.代表的な言語処理系にはコンパイラとインタプリタがあります.

 コンパイラは高水準言語を機械語に変換して出力する言語処理系です.実際にはコンパイラはアセンブラ言語までの変換を行います.その後アセンブラによって機械語への変換を行います.また,アセンブラが作成するのはオブジェクトプログラムと呼ぶもので,実際に実行するためには実行時ライブラリと結合する必要があります.この結合にはリンカを利用します.市販されているプログラム開発環境では,コンパイラ,アセンブラ,リンカを意識することなく利用できるようになっています.

 インタプリタは高水準プログラム言語で書かれたプログラムを順次解釈しながら実行していきます.コンパイラの場合,実行するときには機械語にすべて変換してから実行するため,実行速度が速くなるメリットがあります.一方,プログラムを作るたびにコンパイラを使って変換しなければならないという面倒もあります.

 この講義で取り上げるプログラム言語 JavaScript はスクリプト言語と呼ばれているものの一つです.スクリプト言語とは,アプリケーションソフトウェア上で動作し,アプリケーションソフトウェアの機能を拡張するための言語です. JavaScript は WEB ブラウザ上で動作し,WEB ブラウザで見ることができる HTML 文書に動的な効果を補填します.アプリケーションソフトウェア上で動きますので,その解釈と実行はアプリケーションソフトウェアが行います.つまり,アプリケーションソフトウェアがインタプリタとなっています.また,書き方の分類では手続き型言語になります.高度な書き方を利用することでオブジェクト指向言語ということもできるのですが,この分類は重要なことではないので,これ以上は言及しません.

コンピュータ・プログラミング

 この講義:コンピュータ・プログラミングでは,手続き型言語のプログラミングエッセンスを JavaScript を題材にして説明します.説明する文法は JavaScript 独特のものとなってしまいますが,考え方は他の手続き型言語と共通しています.そして,実際にプログラミングをしてもらいます.この作業を通して,プログラミングをすることでコンピュータ上でどのようなことができるかを感じ取ってもらえたらと思います.

 先にも述べたように,JavaScript は HTML では表現しきれない部分を補うための言語です.前半ではプログラミングの本質部分についての説明を行います.後半は,より高度なプログラミング技術の解説,または, JavaScript の特徴である WEB ページの飾り付けを行います. JavaScript を有効に使うためにはどうしても HTML の知識が必要となりますので,余力がある人は HTML の知識も獲得しておいてください.