プログラミングの「は・て・な」

第2回 命令とは何だ? 〜鉄腕アトムは命令されるのか?〜

長谷川裕行
2008/4/4

CUIもGUIも結果は同じ

 先に示した「cp〜」といったコマンドは、WindowsやX Window SystemなどのGUI環境では、ファイルのアイコンをフォルダのアイコンまでドラッグ&ドロップ(あるいは右クリック+コピー&ペースト)する操作に該当する[注15]。このときユーザの行う操作は、ディスプレイ上に描かれたビットマップ画像をマウスポインタで指し、左ボタンを押さえたままそれを移動……という、きわめて感覚的なものとなる。しかし実は、OS内部ではキーボードから「cp abc.txt...」と入力した場合と、ほとんど同じ処理が行われている。

 人間とOSとの間には、シェルプログラムが介在している。これは、OSによってはOSの機能の一部として搭載されていることもあり(WindowsやMac OSなど)、外部プログラムとして別に機能している場合もある(UNIX系OSのコマンドシェルやX Window System、DOSのCommand.comなど)。

 いずれにせよ、シェルプログラムがユーザの入力(キーボードからのコマンド文字列やマウスの操作)を、OSに対する処理命令に置き換えていることに変わりはない。最終的に、OSはこれらをCPUに対する命令に変換する。こと「機械に対する命令」というレベルでは、CUIかGUIかというユーザインタフェイスの違いは、元が文字列かマウスの動き(マウスポインタの座標変化とボタンの押し下げ状態)かという違いでしかないのだ。

[注15]厳密にいえば、WindowsなどのGUIベースのOSでは、アイコンをドロップした先が同じドライブかどうかによってコピーか移動かを決定するなど、文字による命令に比べればもう少し複雑な判断が行われている。

プログラミングと命令

 ここまでのことは、コンピュータを使う側(ユーザ)の視点からのものである。プログラミング、つまりコンピュータを制御する側(プログラマ)から見れば、「命令」の意味合いはちょいと変わってくる。

 ユーザが「ファイルを開け」と命じたら、プログラムはそれを受けて《実際にファイルを開く制御命令》を発する。ユーザはシェルプログラムに対して命令し、シェルプログラムはOS(これもプログラム)へ、OSはアプリケーションへ……と命令が伝えられ、アプリケーションはOSに対して『ファイルを開くための命令』を発する。この段階では、命令というより『制御依頼』といったニュアンスが強いが、お茶の水博士の「〜してくれんか」と同じで、これもまた指示・命令である。

 ここで用いられるのが「ステートメント」や「関数」などの命令語である。forもifもprintfもfopenも、プログラミングではすべて『命令』という概念でくくることができる。「forやifは制御構造を作るためのキーワードであって、命令じゃないだろう」と、思う人もいるだろう。しかし、判断した結果で処理を切り替えたり(if)、指定回数繰り返したり(for)する構造を《構築せよ》という立派な命令なのである。

命令とは意図の伝達

 コンピュータに与える命令とは、立場がユーザであってもプログラマであっても、人間の意図であることに変わりはない。使用言語の異なるもの同士の意図伝達には、変換作業が必要だ。

 人間同士(たとえば日本人とアメリカ人)のコミュニケーションなら、会話の場合は通訳(インタプリタ)を介し、文書の場合は翻訳(コンパイル)を行うことになる。なんだ、プログラムと同じじゃないか。

 ただ、人間の場合は自然言語というきわめてあいまいな言語体系を用いているため、会話なら発話者が身振り手振りや表情をつけ加え、文章なら読者が前後の文脈から推測を行って、正しいイメージの送受信を行わなければならないことが多い。

 一方、コンピュータは、今のところそこまでインテリジェントではないため、身振り・表情の読み取りはおろか、前後の文脈判断もできない[注16]。逐一、こと細かに動きを指示しなければならない。

[注16]かな漢字変換や音声認識処理では、文脈判断の機能がある程度実用化されている。ただ、本当の意味での『意味の認識』とはまた異なる技術だ。

ステートメントの誤解

 さて、プログラミングではコンピュータに対する命令、あるいは動作の指示を「命令語」「関数」「ステートメント」などと呼ぶ。計算を指示する「演算子」もこの仲間に入る。当然、これらはそれぞれ異なる機能を持っているのだが、ときとしてあいまいに使われる。とくに「ステートメント(statement)」という表現はクセモノだ。

 一般に、BASICの命令語全般を「ステートメント」と呼ぶことが多い。if、forなどの制御命令を「ifステートメント」「forステートメント」などと表現することがある。

 しかし、この「ステートメント」という言葉は非常にあいまいで、「if」という1つの予約語に対するものなのか、「If <条件> Then<命令文>」という「構文」に対する呼称なのか、厳密に区別して使われることは少ない。

 たとえば「If statement is ...」という文は「Ifという命令語単体は……」とも、「If命令を使った構文は……」とも受け取ることができる。しかし、実際には、ここで使われているstatementは、後者の意味である。

 statementは「声明/宣言/陳述文」といった意味で、基本的なニュアンスとして「単語」は示さない。先に例にあげた「Ifステートメント」といったカタカナ語の使い方が、誤解を生んだのかもしれない[注17]。

[注15]Visual Basicのオンラインヘルプ(MSDNライブラリ)には、ステートメントに対して次のように解説されている。『Visual Basicのステートメントは、完結した命令です。ステートメントには、キーワード、演算子、変数、定数、および式を含めることができます』つまり、1つの文ではあるがIf〜Then〜Elseのような構文全体ではない、ということである。IfやThenなど単体の『語』は予約語あるいはキーワードと呼ばれる。

関数とプロシージャ

 「関数」はC言語の用語だ。僕自身がC言語のプログラマだったこともあって、この「関数」という表現は個人的に親しみがあって好きだ。英語のfunctionの訳で、数学では昔は「函数」と書いた。「函」は「はこ(箱)」の意味であり、そこに値を投げ入れれば答え(計算結果)が返される。文字どおりブラックボックスの意味だ。

 Visual Basicでは「プロシージャ」がこれに該当する。procedureとは「手続き」の意味である。COBOLでは、実際の処理手順を記述する部分をPROCEDURE DIVISION
という。

 内部で処理を行った結果、値を返さない関数もある。C言語では、値を返すか返さないかを関数定義時の『型』で明示する。値を返さない関数はvoid型として宣言すればいい。

 一方、Visual Basicでは、値を返さないプロシージャはSub、返す場合はFunctionという修飾子をつけて定義する。

 また、Visual Basicでは、処理系にあらかじめ用意された関数とユーザの定義したプロシージャが、意味的に区別されている。C言語の関数は処理系に用意されたライブラリ関数もプログラマの作った関数も基本的に等価である。

 こういった使用上の差異は多少あるけれども、両者は本質的には同じととらえてかまわない。同じAlgolを祖に持つプログラミング言語のPascalの「手続き」も、C言語と同じだ。


演算子という命令語

自分戦略研究所、フォーラム化のお知らせ

@IT自分戦略研究所は2014年2月、@ITのフォーラムになりました。

現在ご覧いただいている記事は、既掲載記事をアーカイブ化したものです。新着記事は、 新しくなったトップページよりご覧ください。

これからも、@IT自分戦略研究所をよろしくお願いいたします。