はじめにことばがあった。ことばは神と共にあり、ことばは神であった。 -- ヨハネによる福音書

それでは、プログラマーたちはどうやってコンピューターの中に仕組みを作るのでしょう。

ここでレシピが再び登場します。レシピは何で書かれているでしょうか?そうです。言葉です。

料理人は、レシピを読み、レシピにしたがって原材料を調理して料理にします。

上の文章を、以下の表に従って読み替えて見ましょう。

料理人コンピューター
原材料入力
レシピプログラム
調理処理
料理出力

すると、こうなります。

コンピューターは、プログラムを読み、プログラムにしたがって入力を処理し出力にします。

見事な一対一対応です。これほどきれいに対応するのであれば、「レシピは言葉で書かれている」にも「言葉」に相当する「何か」があることは用意に推察できます。

それが、プログラミング言語です。

プログラミング言語という言葉

「プログラムとは仕組みである」「プログラミングとは仕組みを作ることである」と前に言いましたが、これはこう言い換えることが出来ます。

プログラミングとは、プログラミング言語を使ってコンピューターに実行可能な仕組みを教えることである

ここで重要なのは、「コンピューターに実行可能な」ということです。それが、プログラミングをレシピとは少し違ったものにしています。「人参を皮むきして」と日本人なら一言言えば済むことを、コンピューターが相手だと「人参とは何か」「皮むきとはなにか」ということを厳密に定義してやらねばなりません。日本人にとって「人参」も「皮むき」も「言うまでもない」ことですが、コンピューターにはこの「言うまでもないこと」というのが一つもないのです。全て一から教えてあげなければならないのです。

それが、未だにコンピューターにはカレーライスが作れない最大の理由となっています。

その代わり、一度教えたことであれば「忘れろ」と(これまた厳密に)命じるまで忘れることもありませんし、同じ入力があれば必ず同じ出力を返します。これが人間だと、たとえ全く同じ材料を使っても、作る人が変われば出来上がるものも違ってくるでしょう。

はじめてのプログラム

とはいえ、コンピューター言語は、「料理人」はコンピューターでも、「レシピを書く」のはあくまで人間。人間が使う言語からものすごくかけ離れているということはありません。論より証拠。早速一つプログラムを書いてみることにしましょう。

用意するのは、テキストファイルを読み書きできるエディタとWebブラウザー。エディタはWindowsなら「メモ帳」、Macなら「TextEdit」で構いません。そのエディタに一字一句そのまま以下のように打って、それに"hello.html"という名前を付けて保存してください。そうそう。全部半角です。

<input type="submit" value="Hello, World!" onclick="alert(this.value)">

このhello.htmlを今度はWebブラウザで開いてみてください。以下のように表示されるはずです。

このボタンをクリックしてみましょう。こんな感じのダイアログボックスが表示されるはずです。

ブラウザによっては、こんな感じかも知れません。

hello-safari

おめでとうございます。あなたはこれで「Webブラウザーでボタンを表示し、ボタンをクリックするとダイアログボックスにメッセージが表示されるプログラム」を書いたわけです。

それでは、このプログラムをもう少し詳しく見てみることにしてみます。

このプログラム、実は二種類の言葉で書かれています。一つはHTML。名前を聞いたことぐらいあるでしょう。Webページを書くための言語です。<inputで始まるところから、>までが、何を表示するかを指定しています。

<input
 type="submit"                <!--種類はサブミットボタンです-->
 value="Hello, World!"        <!--内容は"Hello, World!"-->
 onclick="alert(this.value)"  <!--クリックされたら、"alert(this.value)"を実行-->
>

そして、このalert(this.value)が、本書でもっぱら使うJavaScriptという言語で書かれています。このわずか一行のプログラムに、二種類もの言語が出てくるというのは驚くべきことですが事実です。

しかし、よく考えれば、普段我々が使っている言語--プログラマーはあえて「自然言語」と呼びます--だって、「日本語で『プログラミング言語』というのは英語では"A Computer Language"である」という具合に、外国語を無理なく「入れ子」にすることが出来ます。ある言語に別の言語は入っていること自体は驚くほどのことではありません。

にもかかわらず、なぜ上の例ではわざわざある言語に別の言語を入れ子にしたのでしょうか?

言語には向き不向きがある

実は、上記のプログラムは、100% JavaScriptで書くこともできます(どうやって書くかは読者の宿題ということにします)。にも関わらず、HTMLの中にJavaScriptが入っているのは、両者がそれぞれ別の目的のために作られた言語だからです。

HTMLは、正式にはHyperText Markup Languageと言います。ハイパーテキスト、すなわち中に画像やリンクが存在するページを、人間にも書きやすくそしてコンピューターにも読みやすくするために考えだされた言語です。このHTMLが登場した当時は、Webページは紙のページに似て、それほど「動き」があるものではありませんでした。

しかし、Webの利用が進むにつれ、Webページを「単なる」ハイパーテキストとして使うのはつまらないと思う人も出てきました。入力フォームをつけたり、ボタンをつけたりといった、「動く」ページを作りたい。しかしHTMLはあくまで「静的」なハイパーテキストを書くための言語。どうしたらよいか。

そこで生まれたのが、JavaScriptです。JavaScriptは、HTMLでは書けなかった、「動き」を書き下すための言語です。HTMLがWebページという「もの」を書くための言語だったのに対し、JavaScriptはWebページをどう「描きかえるか」という「こと」を書くための言語というわけです。

それでは「日本語のように両方いっぺんに書ける言語を最初から作ればいいじゃないか」という意見もありますが、実はコンピューター上で試行錯誤してみると、「もの」と「こと」はきちんと別れていた方が 都合の多い場合も多いことに気がつきます。コンピューターを相手にすると、一つの言語で全てを書くよりも、時と場合に応じて、使う言語を使い分けた方が便利な場合が実に多いのです。

ここで、もう一度プログラムを見てみてください。alert(this.value)this.valueって一体なんでしょうか?これまた論より証拠で、今度は以下のようにプログラムを書き換えてみましょう。

<input type="submit" value="Goodbye, World!" onclick="alert(this.value)">

ボタンをクリックしてみてください。何と表示されましたか?

注意して欲しいのは、ここで書き換えたのはあくまでHTMLの部分であって、JavaScriptの部分、alert(this.value)ではない、ということです。「仕組み」は変わっていないのです。変わったのが何かというと、「入力」です。"Hello"が"Goodbye"になったわけです。このような形で、HTMLとJavaScriptは、単にHTMLがJavaScriptに入っているのではなく、互いに関連しあっているわけです。

まとめ

  • プログラムは、プログラミング言語で書く
    • 以降、本書では「言語」はプログラミング言語を、日本語や英語などは「自然言語」と呼びます
  • プログラミング言語にもいろいろある
  • 言語には向き不向きがある
  • ある言語に別の言語を埋め込むことも可能である
  • ある言語で書かれたものを、別の言語でつかうことも可能である

Dan the Programmer