Hatena::ブログ(Diary)

oct inaodu

 | 

2005-08-29

JavaScript: 世界で最も誤解されたプログラミング言語


Copyright 2001 Douglas Crockford. All Rights Reserved Wrrrldwide.


JavaScript(別名:Mocha、LiveScript、JScriptECMAScript)は、世界で最も人気のあるプログラミング言語の一つです。世界中のほとんどのパソコンには、少なくとも1つはJavaScriptインタープリタインストールされ動いていることでしょう。JavaScriptは、WWWのスクリプト言語としての確かな地位により広く利用されるようになったのです。


しかしその高い普及率にもかかわらず、JavaScriptが汎用的でダイナミックな優れたオブジェクト指向プログラミング言語であることはあまり知られていません。

どうして、その素晴らしさが認められないのでしょう?また、なぜ、JavaScriptは誤解されるのでしょうか?


その名前

Javaという接頭語は、Javaと関係があったり、あるいはJavaのサブセット、または性能の低いJavaのバージョンであるかのように思わせます。混乱させるために、わざとその名前がつけられたような気さえします。そして、その混乱が誤解を生むのです。

JavaJava実行環境で動作しますが、JavaScriptは違います*1JavaScriptは、Javaとは異なる言語なのです。


JavaがCに類似する構文を持っているのと同程度に、JavaScriptJavaの構文は似ています。しかし、JavaがCのサブセットではないように、JavaScriptJavaのサブセットではないのです。Java(その当時はOak)が、元々ターゲットとしていたような種類のアプリケーションを構築する場合でも、JavaScriptJavaより優れています。


JavaScriptは、Javaを作ったSun Microsystems社ではなく、Netscape社により開発されました。最初はJavaが先頭に付かずにLiveScriptと呼ばれていましたが、それでも少し紛らわしいと思います。


そもそもScriptという接尾語は、JavaScriptが本物のプログラミング言語ではなかったり、あるいはスクリプト言語プログラミング言語より劣るかのように思わせるふしがあります。

しかし大事なことは、どこに特化するかです。JavaScriptは、C言語の実行速度と引き換えに、表現力とダイナミズムを手に入れたのです。


Cの皮を被ったLisp

JavaScriptには、Cのような中括弧や不格好なforステートメントがあるため、一般的な手続き型言語のように見えますが、それは誤りです。JavaScriptはCやJavaよりも、LispやSchemeのような関数型言語と多くの共通点を持っているのです。JavaScriptには、リストの代わりに配列があり、プロパティリストの代わりにオブジェクトがあります。関数ファーストクラスであり、クロージャも備えています。つまり括弧の対応をとる手間なしに、ラムダを利用できるのです。


固定観念

JavaScriptは、Netscape Navigatorで動くように考案されました。そしてその成功により、JavaScriptの実行環境は、ほぼすべてのウェブブラウザに標準的に装備されるようになったのです。結果として、これによりJavaScriptのイメージが固定化されてしまいました。JavaScriptプログラミング言語スーパーマンです。ウェブではない多くのアプリケーションにも、JavaScriptは良く合うでしょう。


定まらぬ目標

最初のバージョンのJavaScriptは非常に機能が低く、例外処理、内部関数、そして継承もありませんでした。現在のバージョンのJavaScriptは、完全なオブジェクト指向プログラミング言語です。しかしJavaScriptに関する評価の多くは、この初期の低機能なバージョンに基づいたものです。


JavaScriptの管理を行なうECMA委員会は、機能の拡張を続けています。確かにその拡張はよく考えられてはいるのですが、沢山のバージョンがありすぎるという大きな問題を悪化させることになります。これは、更なる混乱を生むことになるでしょう。


設計ミス

完全なプログラミング言語などありません。JavaScriptにも、他言語同様に設計のミスがあります。例えば、型変換によって加算と連結の意味が使い分けられる、 + のオーバーロードが挙げられます。また、エラーを引き起こしやすいwithステートメントは避けられるべきものでした。予約語の規定は厳し過ぎますし、正規表現リテラルの表記方法とセミコロンの挿入も大きな誤りでした。これらの誤りは、プログラミングエラーを引き起こし、言語の設計自体に疑問を抱かせることとなりました。幸い、良い構文チェックプログラム(JSLint)によって問題の多くを軽減することができます。


全般的にはJavaScriptの設計はとても正しいと思っています。でも驚いたことに、ECMAScript委員会は、先ほど挙げたような問題を修正することに興味がないようなのです。多分、彼らは新しい問題を作る方により興味があるのでしょう。


まずい実装

JavaScriptの初期の実装にはバグの多いものがありました。これは、JavaScriptに悪い印象を抱かせることになりました。*2更にまずいことに、その実装は恐ろしくバグの多いウェブブラウザに埋め込まれてしまったのです。


ひどい書籍

JavaScriptに関する書籍の大半は非常にひどいものです。それらの書籍は間違いと下手な実例を記載し、悪い習慣を助長しています。たいていの場合、JavaScriptの重要な特徴の説明が不十分か、または完全に省略されています。私は沢山のJavaScriptの本を読んできましたが、お勧めできる書籍は2冊しかありません。『JavaScript』著:デイビッド・フラナガンと、『Dynamic HTML (2nd Edition)』著者:Danny Goodman*3です。両方ともオライリーから出版されています。


標準以下の標準

JavaScriptの公式仕様書ECMAが発行しています。この仕様書の品質は非常に悪いです。これを読み進めるのは難しく、内容を理解するのは極めて困難です。JavaScript関連書籍の作者達が、自分自身の理解を深めるためにJavaScriptの公式仕様書を使用できないことが「ひどい書籍」の問題を引き起こしているのです。ECMAとTC39委員会は、深く反省するべきだと思います。


アマチュア

JavaScriptを書く人の多くはプログラマではありません。彼らは良いプログラムを書くための教育と規律が欠如しています。しかしJavaScriptの豊かな表現力を使って、彼らはやっつけで仕事を片付けることができます。そのため、JavaScriptが完全にアマチュア向けであり、プロフェッショナルプログラミングには適していない、という評判をもたらしました。これは事実とは全く異なります。


オブジェクト指向

JavaScriptオブジェクト指向でしょうか?

JavaScriptにはオブジェクトがあり、オブジェクトはデータと、データに作用するメソッドを含むことができます。オブジェクトは他のオブジェクトを含むこともできます。

JavaScriptにはクラスがありませんが、クラスに相当する機能としてコンストラクタが存在します。コンストラクタは、クラス変数とメソッドのコンテナとして機能します。また、JavaScriptはクラス指向の継承ではなく、プロトタイプ指向の継承を備えています。


オブジェクトを組織する2つの主な方法に*4継承(is-a)と集約(has-a)があります。JavaScriptでは両方を使うことができるのですが、この言語の持つ動的な性質を考えると、集約の利用が勝っているでしょう。


JavaScriptは情報の隠蔽を行なえないので真のオブジェクト指向ではない、という主張があります。この主張は、オブジェクトがプライベート変数とプライベートメソッドを持てず、すべてのメンバがパブリックになってしまうというものです。


しかしJavaScriptオブジェクトも、プライベート変数とプライベートメソッドを持てることが分かりました。(ここをクリックして、確認してください。)もちろん、JavaScriptは世界で最も誤解されたプログラミング言語であるため、理解している人はほとんどいません。


JavaScriptには継承がないので、真のオブジェクト指向ではない、という主張もあります。


しかしJavaScriptが古典的な継承だけでなく、その他のコード再利用パターンも使えることが分かっています。

*1JavaScript is not interpreted Java.Java is interpreted Java.

*2:This reflected badly on the language.

*3:日本語版の存在不明。同著者の『JavaScript & DHTMLクックブック』が出版されている。

*4:The two main ways of building up object systems

mputmput 2005/09/04 08:14 semicolon insertionはセミコロンの「挿入」という意味だと思います。改行前にセミコロンがない場合にセミコロンが補われるかもしれないという機能です。常に補われるわけでもないため、間違った設計と目されるのでしょう。

nunanuna 2005/09/04 12:15 「JavaScriptの関数は一流で」ですが、first class (object) は特定の訳語が定着してませんので、ファーストクラスとカタカナにしておくのが良いかと思います。あと aggregation は集約と訳すことが多いですね。

brazilbrazil 2005/09/04 12:40 誤訳の御指摘ありがとうございます!早速、反映しました。ほんと、嬉しいです。良く調べずに書いていることを反省しています。
す、すいません、あと、「Semicolon[-],as was the notation for literal[-].」の部分、asを「同じく」で訳しているんですが、自信がありません。正規表現の表記法が、文字列リテラルとしてではなく、「match(/ABC/i)」みたいに書けるのが気持ち悪いという指摘なんでしょうか?

mputmput 2005/09/06 11:11 原文が何を指して問題と言っているのかは確かではありませんが、JavaScript正規表現の嫌なところといえば、正規表現リテラルのなかに/を含みたいときにきれいに書く方法がない(/<¥/tag>/みたいな。perlならqr!</tag>!で回避できる)とか、空の正規表現が書けない(//ではコメントの開始になっちゃうから。perlではそのまま//と書ける)とかの点があげられると思います。そういうことが言いたいんじゃないかなぁ。違ってたらすいません。

brazilbrazil 2005/09/06 15:13 mputさん、ものすごく勉強になりました! なるほど〜。
これですね、http://www.mozilla-japan.org/js/language/js20/rationale/syntax.html。セミコロンの暗黙の挿入と、正規表現の空文字の両方が記されておりました。
また、nanaさんのファーストクラスの指摘は、ここで勉強いたしました。http://sky.zero.ad.jp/~zaa54437/programming/concepts/index3.htm#f0。
皆様、ありがとうございます、m(_ _)m。

phph 2005/09/09 11:52 『アプリケーションを構築する場合でも、元々アプリケーション用にデザインされたJava(元Oak)より、JavaScriptは優れています。』は、「(あらゆる)アプリケーション開発において、JavaScript は Java より優れている」という変な意味に読めてしまいます。
原文の意図するところは、おそらく
『Java(その当時は Oak)がもともとターゲットとしていたような種類のアプリケーションを構築する場合、JavaScript は Java より優れている』
ということだと思います。訳としてはいまいちこなれていませんが……。
ここでいう「もともとターゲットとしていたような種類のアプリケーション」というのは要するに ウェブアプリケーションでしょうから、それをはっきり訳に入れてしまった方が分かりやすいかもしれません。
……といいつつ、JavaScript はあまり経験がないので、見当違いだったらすみません。

brazilbrazil 2005/09/09 15:02 うっ、元の翻訳文が意味不明でしたね〜(^_^ゞ。修正いたしました!fkaも『その当時』にしないと、『元々意図していた』と繋がらないですね。
ただ、『ウェブアプリケーション』の記述については、一応見合わさせて頂きました。後に、「JavaScriptはジョージ・リーヴス(スーパーマン)だ」という文もあるため、広い範囲を含む可能性も残されているためです。
ご指摘、どうもありがとうございました。みんなに宿題見てもらってる感じっす。

phph 2005/09/09 17:30 せっかく直していただいたところすみません、ちょっと訂正が。
「その当時 Oak と呼ばれていた」という表現ですが、あまり考えなしにそう訳したので、調べてみますと、どうも私の方が誤訳のようです。(まだ Web ブラウザでは実行できなかった)Oak を Web 向けにシフトさせ、改称したのが Java、という位置づけなのですね。Web アプリ専用だった時代の Java は Oak と呼ばれていたのだ、と思い込んで、ああ書いてしまいました。混乱させてしまってすみません。(^^;
なおすとしたら、直訳の「(その前は Oak だった)Java が、〜」か、もうちょっと日本語らしく「(Oak から発展した)Java が、〜」とかでしょうか。(後者の方が個人的には好み)

brazilbrazil 2005/09/09 18:25 度々、ありがとうございます〜。
私は、「その当時はOak」を展開すると、「通常のアプリケーションのみを対象としていたころはOak」となり、意味的に繋がるため、これで結構いけてるんじゃないかなぁと思っちょりますが、いかがでしょうか?

brazilbrazil 2005/09/09 18:29 話が突然変わりますが、この文の趣旨「JavaScriptはAjaxやウェブアプリケーションとは本質的には関係がない、汎用的な言語だ」というメッセージを翻訳できていないような気がしてなりません。各サイトの反応を拝見して、「誤解された」ではなく、今、正に「誤解されている」なぁと、少し思ったりもしました。

phph 2005/09/09 20:29 う〜む、なるほど。やっと分かりました。たしかに ”formerly”の基準時点を現在と見れば、それでつながりますね。JavaScriptが汎用的な言語、というのは十分承知できたつもりですが、どうも思い込みも抜けきっていないようです。(^^;

phph 2005/09/09 20:32 ところで、その「誤解された」ですが、”misunderstood” は特に時を示さない受動態ですから、「誤解されている」と訳してもよいのでは?

brazilbrazil 2005/09/09 20:40 やっぱり!!そうなんですか?ozaccさんが、2003/10/14に取り上げているのですが
http://blog.ozacc.com/archives/000122.html、そこで「誤解されている」になってて、ず〜〜〜と気になっていたんです。そ、そうか...。そーと、アクセスが減った時に変えようかな...。くまったなぁ。

studiokingyostudiokingyo 2006/04/03 22:50 >JavaScript
なるほど。確かに・・・と感じました。とても興味深い読み物です。

amachangamachang 2006/09/07 05:34 JavaScript の歴史を見ました。ありがとうございます。

narinari 2006/10/23 09:56 面白いですね。
今時オブジェクト指向で作られてるのウェブではあまり見ませんしね。

hnagoyahnagoya 2007/11/18 23:08 「ひどい書籍」の「2冊しかありません」という部分ですが、2007年11月現在の原文を眺めると”I can only recommend one:”と書いてあります(修正された?)。”Dynamic HTML(2nd Ed)”はなかったことにされちゃったのでしょうか。

Dr_RadialistDr_Radialist 2007/12/21 08:08 とても分かりやすい解説ありがとうございます。僕も久しぶりにJavaScriptに戻ってきて、このページにめぐり合いました。

AndyAndy 2009/06/03 10:10 JSはWEBのために設計されたので、わざObj指向になる必要がないと思う

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/brazil/20050829/1125321936
 |