パーソナル・コンピュータが最初に現れた頃、それら多くは簡単なプログラミング言語、通常BASIC の一種、を備えていました。コンピューターとの対話はこの言語と一体化され、コンピューター・ユーザーは好むと好まざるとに係わらずこれを享受していました。コンピューターの数も増え、廉価になった今、ユーザーはマウスのクリックでことを済ませます。多くの人々にとってこれは結構なことですが、技術的に手を加えたくなる性分の我々にとっては、日常のコンピューター使用にプログラミングが必要ないということに何か限界を感じます。
幸い、World Wide Web 開発の結果、どのコンピューターにも web ブラウザーが装備され、JavaScript でプログラミングできる環境が備わっています。ユーザーに技術的な煩わしさを与えないという今日の精神を温存しつつ、web ページにアクセスし、それをプログラミング学習のプラットフォームとして使うことが可能です。
それがこのハイパーブックの目指すところです。
私は学びたくない者を啓蒙したりはしない。説明を必要としない者を目覚めさせたりもしない。正方形の一角を与え、他の三角を思わない者にはそれ以上を二度と論じない。
― 孔子
JavaScript の説明に加え、本書ではプログラミングの基本原則を紹介します。プログラミングはご承知のとおり難解です。基本ルールはほとんどの場合簡単かつ明瞭です。しかしこれらの基本ルールの上に構築されるプログラムも、そのルールや複雑さを紹介するには込み入ってしまう傾向にあります。そのため、プログラミングは多くの場合簡単でも予測可能でもありません。この分野の創始者の一人である Donald Knuth は、プログラミングは 芸術 であると言っています。
本書をただ読むだけではなく、それ以上の何かを得ることが必要です。シャープな感覚を保ち、練習問題を解く努力を続け、既に出てきた教材が完全にではなくとも満足のいく程度に理解できたと確信するまで継続してください。
コンピューター・プログラマーは自身が責任を負う宇宙の創造者だ。事実上限りなく複雑な宇宙をコンピューター・プログラムという形で創造することができる。
― Joseph Weizenbaum, Computer Power and Human Reason
プログラムは、プログラマーが入力したテキストの断片です。しかしコンピューターに何を実行するかを指示します。またメモリー内のデータでもあり、同じメモリーに及ぼす作用をコントロールもします。身の回りに例えを探すのは困難ですが、一見して近いのはマシンといえましょう。機械時計の歯車は見事に噛み合い、良い時計職人の創った時計は何年もの間正確に時を刻みます。同様に、プログラムの要素は互いに適合し、冷静なプログラマーの創ったプログラムはクラッシュせずに走ります。
コンピュータは複数の実体の無いマシンのホストとしての役割を果たします。そして生真面目なほど忠実に物事をこなします。コンピューターが有益なのは、その信じられないほどのスピードです。一方、プログラムはたくさんの単純なアクションを功名に組み合わせ、非常に複雑なことを行います。
我々のなかにはプログラムを書くことは魅力的なゲームと考える者もいます。プログラムは思考の建築物です。コストもかからず重さもなく、手でタイプするにつれて成長します。しかし夢中になって我を忘れると、そのサイズと複雑さは収拾がつかないほど大きくなり、その作者でも困惑してしまうほどになってしまいます。これがプログラミングの重大な問題で、今日のソフトウェアの多くがすぐにクラッシュしてしまい、機能しなくなる理由です。
プログラムが正常に機能するとき、それは美です。複雑さをコントロールできたプログラムは芸術です。偉大なプログラムは控えめで、その複雑さにもかかわらずシンプルです。
今日多くのプログラマーは、この複雑さをコントロールするにはプログラムに良く理解されているテクニックを小さく組み合わせて使う方法が一番だと信じています。彼らはプログラムが持つべき構造について厳しいルールを設けました。なかでも熱狂的な人たちは、これらのルールを破る者を 悪い プログラマーと非難します。
プログラミングの奥深さに対する何という敵意でしょう! これではプログラミングが単純でありきたりのものになってしまいます。不可思議で美しいプログラムがタブーになってしまいます。プログラミング技術の景観は膨大で多様性に富み、それでいて多くが未開拓です。落とし穴や罠がいくつもあり、それら全てが未経験のプログラマーをひどいミスへと誘います。しかしそれは注意深く冷静な判断力で突き進め、ということです。プログラミングを続けるにつれ、常に新しい挑戦と開拓すべき領域があることに気付きます。探検を拒むプログラマーは必ず成長が止まり、プログラムする喜びを忘れ、意欲が失せます (そして管理側の人間になります)。
私としては、プログラムの正確さが確かな基準だと思っています。効率、明確さ、そしてサイズは共に重要です。しかしこれらのバランスを如何にとるかは常に各プログラマーの判断に掛かっています。経験則は有効ですが、それを破ることを恐れてはなりません。
コンピューティングの誕生当初、プログラミング言語は存在せず、プログラムは次のようなものでした:
00110001 00000000 00000000
00110001 00000001 00000001
00110011 00000001 00000010
01010001 00001011 00000010
00100010 00000010 00001000
01000011 00000001 00000000
01000001 00000001 00000001
00010000 00000010 00000000
01100010 00000000 00000000
上記のプログラムは 1 から 10 までを加算し、結果を印刷します (1 + 2 + ... + 10 = 55)。ごく簡素なコンピューターで実行することができました。初期のプログラミングは、多数のスイッチを正しくセットしたり、細長い厚紙に穴を開けてコンピューターに送り込んだりする必要がありました。それがどんなに面倒で間違いの元になるものであるかは想像に易いと思います。簡単なプログラムを書くのにさえ多くの賢さと鍛錬を必要としました。まして複雑なプログラムなどほとんどあり得ないことでした。
もちろん、このような難解なビット・パターン (上記の 1 と 0 の組み合わせ一般的にこう呼んでていました) を手作業で入力できるプログラマーは並外れた天才の感がありました。仕事の満足感と言う意味では価値があったに違いありません。
プログラムの各行には 1 つの命令が含まれます。日本語に直すと次のようになります:
・0 をメモリーの 0 に保存
・1 をメモリーの 1 に保存
・メモリーの 1 の値をメモリーの 2 に保存
・メモリーの 2 の値から 11 を引く
・メモリーの 2 の値が 0 の場合、命令 9 を続ける
・メモリーの 1 の値をメモリーの 0 に加える
・1 をメモリーの 1 に加える
・命令 3 を続ける
・メモリーの 0 の値を出力
2進数の羅列よりは読みやすくなりましたがまだ満足に足るものではありません。命令と保存場所に数字ではなく名前を使うと良いかもしれません:
Set 'total' to 0
Set 'count' to 1
[loop]
Set 'compare' to 'count'
Subtract 11 from 'compare'
If 'compare' is zero, continue at [end]
Add 'count' to 'total'
Add 1 to 'count'
Continue at [loop]
[end]
Output 'total'
この時点でプログラムの働きがどのようなものかお分かりいただけたでしょう。最初の 2 行で保存場所に値を与えます:
total でプログラムの結果を出して count で現在見ている数字を記録します。恐らく compare を使った行を不思議にお思いでしょう。プログラムは count が 11 に等しいかを見て動作を止めるかどうかを判断します。マシンは非常に原始的で、値がゼロであるか否かしかテストできません。そしてそれに基づいて判断 (ジャンプ) します。そこで compare というラベルの付いた保存場所を使い、count - 11 の値を計算し、その値に基づいて判断します。次の 2 行は count の値を結果に加え、11 でないと判断するたびにプログラムは count の値を増やします。
JavaScript で書くと次のようになります:
var total = 0, count = 1;
while (count <= 10) {
total += count;
count += 1;
}
print(total);
ここには改良点が幾つかあります。最も重要なのは、プログラムにジャンプさせる方法を指定する必要がなくなったことです。while という魔法の言葉がこれを行います。これは count <= 10 ('count が 10 に等しいかまたはそれ以下') という条件が続く限り以降の行を実行し続けます。一時的な値を作成し、それをゼロと比較する手順が必要でなくなったことは明らかです。これは取るに足らない些細なことですが、プログラミング言語の力はこの取るに足らない些細なことを我々に代わってやってくれることなのです。
最後に、range と sum という便利な演算を使った場合のプログラムを紹介します。これらはそれぞれある範囲の数値を集め、それらの合計を出します:
print(sum(range(1, 10)));
これまで話してきたことの教訓は、同じプログラムでも長くも短くも、読み易くも読み辛くも成り得るということです。最初のプログラムは極端に不明瞭でしたが、最後のプログラムはほとんど英語に近くなっています: 1 から 10 までの range の数字の sum を print。(sum と range の使い方は後の章で説明します。)
良いプログラミング言語は、より理論的な自己表現の手段をプログラマーに与えます。面白くない詳細を隠し、(while にような) 便利なビルディングブロックを提供します。そして多くに場合、プログラマーが自分で (sum や range のような) ビルディングブロックを付け足していくことを可能にします。
JavaScript は現在広く使われている言語で、World Wide Web 上のページに対して賢いこと恐ろしいことを含めて全てを行います。JavaScript の次のバージョンは他のタスクも可能にする重要な言語になるだろうと断言する 人達 もいます。そうなるかは定かでありませんが、プログラミングに興味をお持ちなら、JavaScript は学ぶに足る言語であることは確かです。将来ウェブプログラミングには従事しなくても、本書で紹介するドキッとするようなプログラムはあなたの中であなたに付きまとい、他の言語で書いたあなたのプログラムに影響を与えているでしょう。
JavaScript について ひどい ことを言う人達がいます。 言われていることの多くは真実です。私が初めて JavaScript で何かを書かなければならなくなった時、すぐにこの言語に対して敵意を抱きました。この言語は私がタイプしたものを受け付けはするものの、私の意図とは全く異なる解釈をしたのです。自分がしていることが解らなかったという事実によることが大きいのですが、本当に問題なのは JavaScript が愚かなほどに寛大であることです。このデザインの背景には JavaScript でのプログラミングを初心者にも解り易くしたいという考えがありました。実際のところ、システムが指摘してくれないためにプログラムの問題究明を難しくしています。
しかし言語の柔軟さは利点でもあります。より厳格な言語では不可能だった多くのテクニックを可能にするに十分な余地が残されています。これで JavaScript の短所も克服できます。この言語をきちんと学び、しばらくの間一緒に仕事をしているうちに、この言語が本当に 好き になりました。
名前が示唆するものに反し、JavaScript は Java というプログラミング言語とはほとんど関係がありません。的確な判断というよりはむしろマーケティングのことを考えてこのよく似た名前が付けられました。1995 年 JavaScript が Netscape により導入された時、Java 言語は大々的に売り出され、好評を博していました。これに乗じようと考えた人がいたことは明らかです。おかげで今やこの名前から逃れられなくなっています。
JavaScript に関連したものに ECMAScript と呼ばれるものがあります。Netscape 以外のブラウザーが JavaScript、またはそれによく似たもの、をサポートし始めた時、その言語の働きについて精密に記述した一冊のドキュメントが書かれました。このドキュメントで説明されている言語はそれを標準化した団体にちなんで ECMAScript と呼ばれます。
ECMAScript ドキュメントでは汎用プログラミング言語について説明しますが、この言語を Internet ブラウザーに統合することについては何も語っていません。JavaScript は ECMAScript に Internet ページやブラウザー・ウィンドウを扱うツールを加えたものです。
ECMAScript ドキュメントに書かれている言語を使うソフトウェアは僅かです。最も重要なことは、Flash で使われている ActionScript 言語が (標準に忠実ではありませんが) ECMAScript に基づいていることです. Flash はウェブページに動きと音を与えるシステムです。いつか Flash ムービーを制作することになっても、JavaScript を知っていることが害になることはありません。
私がこのドキュメントを書いている時、人々は ECMAScript 4 と呼ばれるものに取り組んでいました。たくさんの機能が ECMAScript 言語の新バージョンで追加されました。この新バージョンによって本書で学んでいることが時代遅れになってしまうのではないか、という心配は無用です。一つには、ECMAScript 4 の大部分が今ある言語の拡張で、本書に書かれているほとんど全てが通用します。加えて、全ての主要ブラウザーがこれらの新しい機能を追加するにはしばらく時間がかかり、それまでは ECMAScript 4 をウェブプログラミングに使うことはあまり実用的ではないでしょう。
本書のほとんどの章に コード1 が含まれます。私の経験では、コードを読みコードを書いてみることがプログラム学習の重要な部分です。例にザット目を通すだけでなく、よく注意して読み理解するようにしてください。最初は時間もかかり分かりづらいかもしれませんが、すぐにこつがつかめます。練習問題も同じです。実際に使える回答が書けるまで理解したとは思わないでください。
ウェブの性質上、ウェブページに誰かの書いた JavaScript プログラムを見ることは常に可能です。そこから学ぶのは手っ取り早い方法です。しかしほとんどのウェブプログラマーが 'プロ' ではないため、また JavaScript プログラミングを真剣に学ぶほど面白いものではないと考えているため、非常に 質の悪いコードが数多くあります。醜いまたは間違ったコードから学ぶと、それらがあなた自身のコードにも伝播してしまいます。誰から学ぶかには気を付けてください。
例やあなたが書いたコード等プログラムを試すことができるように、本書では コンソール と呼ばれるものを使います。最新のグラフィカル・ブラウザ (Internet Explorer バージョン 6 以降、Firefox 1.5 以降、Opera 9 以降、Safari 3 以降) ならば、本書のページの下にバーが表示されるはずです。このバーの右隅の小さな矢印をクリックするとコンソールがオープンします。
コンソールには 3 つのエレメントがあります。エラー・メッセージやプログラムの出力を表示する出力ウィンドウがあります。その下に JavaScript をタイプする行があります。数字をタイプしてエンター・キーを押してタイプしたものを実行してみてください。タイプしたテキストに何か意味があると、その結果が出力ウィンドウに表示されます。wrong! とタイプしてエンター・キーをもう一度押してみてください。出力ウィンドウにエラー・メッセージが表示されます。上向き矢印キーや下向き矢印キーを使って既にタイプしたコマンドを行き来することができます。
複数行にまたがるコードやしばらく手元に置いておきたい大きなコードには、右側のフィールドを使うことができます。'Run' ボタンでこのフィールドに書いたプログラムを実行します。すく数のプログラムを同時にオープンすることも可能です。'New' および 'Load' ボタンで (空のまたはウェブ上のファイルから) 新しいプログラムを追加します。プログラムが複数の時は、'Run' ボタンの隣りのメニューを使うことができます。'Close' ボタンは文字通りプログラムをクローズします。
本書のサンプル・プログラムの右上には常に小さなボタンが表示されていて、これをクリックするとプログラムが実行されます。前に見た例は次のようになります:
var total = 0, count = 1;
while (count <= 10) {
total += count;
count += 1;
}
print(total);
矢印をクリックして実行してください。また、プログラムをコンソールにロードするボタンがあります。ぜひそのプログラムを修正して結果を試してください。無限ループを作ってしまうと厄介です。無限ループは while の条件が false にならない時に起こります。例えば、カウント変数に 1 ではなく 0 を足してしまった場合です。プログラムは永久に走り続けます。
幸い、ブラウザーがプログラムを監視していて、やけに時間がかかるプログラムがあると、中断してよいかを問い合わせてくれます。
以降の章で、複数ブロックから成るプログラムを作ります。プログラムを動かすためにブロックを一つづつ実行しなければならないことが頻繁にあります。お気づきのように、コード・ブロックの矢印は実行後紫色に変わります。章を読む際、出てくる全てのコード・ブロックを実行してください。特に新しいものを '定義' している場合は重要です (次の章で理解していただるでしょう)。
もちろん章を一気に読めない場合もあります。つまり章の途中から読み続ける場合もあります。しかし、章の最初から全てのコード実行しないとうまく働かない場合があります。シフト・キーを押しながらコード・ブロックの 'run' 矢印をクリックすると、それまでの全てのコードも実行されます。したがって、章の途中から始める場合は、最初のコードを実行する時にシフトを押してください。全てが期待通りに動くはずです。
最後に、スクリーンの左上の小さな顔を使って作者である私にメッセージを送ることができます。コメント、ひどく分かりづらい箇所、スペル・ミスなどがあった場合は私に知らせてください。ページを離れずにメッセージを送れるので、読書の邪魔にはなりません。
翻訳元
最終更新:
Kazannonekko452
「プログラミングの奥深さに対する何という敵意でしょう!」というところに、テキスト書きにも通じるものを感じました。
「テキスト作成の景観は膨大で多様性に富み、それでいて多くが未開拓です」と、見事に置き換えられるように。