Javascript
「1994年、NetscapeはNavigatorブラウザのバージョン0.9をリリースしました。これは史上初の比較的成熟したウェブブラウザであり、センセーションを巻き起こしました。しかし、このバージョンのブラウザはブラウジングにしか使えず、訪問者と対話する機能はありませんでした。ネットスケープは、ブラウザがウェブページと対話できるようなウェブスクリプティング言語をどうしても必要としていました。"
ウェブスクリプティング言語とは?ひとつは、Perl、Python、Tcl、Schemeなどの既存の言語をウェブページに直接埋め込めるようにすること、もうひとつは、まったく新しい言語を発明することでした。
どちらの選択肢にも利点と欠点があります。最初の選択肢は、既存のコードやプログラマーのリソースをフルに活用しやすく、普及させやすい。2番目の選択肢は、完全に適用可能な言語の開発を容易にし、実装しやすい。
ネットスケープの経営陣は、どちらの選択肢を採用するかで頭を悩ませました。
1995年、サンはオーク言語をJavaと改名し、正式に市場に導入しました。
サンは「一度書けば、どこでも実行できる」ことを売りにしており、この言語が未来を支配する可能性は高いと思われました。
ネットスケープは動き、サンと提携することにしました。アプレット形式のJavaプログラムをブラウザで直接実行できるようにしただけでなく、Javaをスクリプト言語としてウェブページに直接埋め込むことも検討しましたが、HTMLページが複雑になりすぎるため、後に断念せざるを得ませんでした。
要するに、ネットスケープの全経営陣がJava言語の信奉者であり、サンはウェブスクリプト言語の意思決定に完全に関与していたという状況でした。したがって、Javascriptは後にネットスケープとサンが一緒になって市場に投入したものであり、この言語が「Java+script」と名付けられたのは偶然ではありません。
この時点で34歳のシステム・プログラマー、ブレンダン・アイヒがデビューし、1995年4月にネットスケープが彼を採用。
Brendan Eichの主な志向と関心は関数型プログラミングで、NetscapeはSchemeをウェブスクリプト言語として使う可能性を調査するために彼を採用しました。Brendan Eich自身も、新しい会社に入ったら主にSchemeを使って仕事をすることになるだろうと思っていました。
わずか1ヵ月後の1995年5月、Netscapeは、将来のウェブスクリプト言語は「Javaのように十分に見える」必要があるが、Javaよりも単純でなければならないという決定を下しました。この決定は、Perl、Python、Tcl、Schemeなどの非オブジェクト指向プログラミング言語を事実上排除するものでした。
ブレンダン・アイクは、この「簡易版Java言語」の設計者に指名されました。
しかし、Javaにはまったく興味なし。会社から出された課題に対応するため、わずか10日間でJavascriptを設計。
設計期間があまりに短かったため、言語の細部のいくつかが十分に厳密に検討されず、後にJavascriptが混乱した書かれ方をする長い期間が生じることになりました。もしBrendan Eichが、将来この言語がインターネット上で一番の言語になり、世界中に何百万人もの学習者がいることを予見していたら、もう少し時間をかけていたでしょうか?
一言で言えば、彼のデザインはこうです:
C言語の基本構文を利用;
データ型とメモリ管理にはJava言語を使用しています;
Schemeの言葉を借りれば、機能は「一等市民」の地位に昇格;
Self言語からプロトタイプベースの継承メカニズムを借用。
つまり、Javascript言語は、関数型プログラミングとオブジェクト指向プログラミングという2つの言語スタイルのハイブリッド製品なのです。これはBrendan EichとNetscapeによって決定されました。
数年後、Brendan Eichは今でもJavaを軽蔑しています。
彼は言いました:
"Javaの影響は、とりわけ、文字列と文字列オブジェクトのように、データを基本型とオブジェクト型の2つに分けたことと、Y2K問題の導入です。残念なことです"
一方、Y2K問題はJavaに直接関係します。構想通り、Date.getYear()は西暦の下2桁を返すべきです:
しかし実際には、2000年の場合は100を返します!
この関数を使って年を生成すると、ページによっては "19100 "のような結果が表示されることがあります。というのも、Javascriptの日付クラスはjava.util.Dateライブラリを直接使用しており、Brendan Eich氏はこの結果に非常に不満だったようで、4桁の西暦を返すDate.getFullYear()関数を追加するに至りました。
Brendan Eichは、会社の決定がなければ、JavaをJavascriptのデザインのプロトタイプとして使うことはなかったでしょう。デザイナーとして、彼は自分の仕事をまったく気に入っていません。
Javascriptにおける10の設計上の欠陥
背景
Javascriptには名前空間がないためモジュール化が難しく、複数のファイルにコードを分散させる方法が指定されていません。また、同じ名前の関数を重複して定義することができ、後の定義が前の定義を上書きする可能性があるため、モジュールロードには不利です。
JS
Javascriptが提供する標準関数ライブラリは非常に小さく、一部の基本的な操作しか行えないため、多くの関数が利用できません。
- nullおよび未定義
nullはオブジェクトの型であり、オブジェクトが空であることを意味します。undefinedはデータ型であり、未定義であることを意味します。
この2つは非常に混同しやすいのですが、意味はまったく異なります。
プログラミングの実践では、nullはほとんど役に立たず、まったく設計すべきではありません。
ECMAScript標準の発展
Javascriptには、すべてのモジュールで表示されるグローバル変数があります。グローバル変数は、任意の関数内で生成することができ、プログラムの複雑さを大幅に増加させます。
JS
Javascriptでは、すべての文はセミコロンで終わらなければなりません。しかし、セミコロンを付け忘れても、インタプリタはエラーを報告せず、自動的にセミコロンを付けてくれます。時々、これは見つけるのが難しいエラーにつながることがあります。
例えば、以下の関数は単に望む結果を得られません。
インタープリターが自動的にreturn文の後にセミコロンを付けるからです。
- 追加アルゴリズム
演算子としての+記号には2つの意味があり、数字と数字の和を表す場合と、文字と文字の連結を表す場合があります。
一方のオペランドが文字で、もう一方が数値の場合、数値は自動的に文字に変換されます。
このような設計は不必要に操作の複雑さを増長させますし、文字連結演算子を別に用意することも十分可能です。
- ナン
NaNはインタープリタの限界を超えていることを示す数値です。非常に奇妙な性質を持っています:
NaNを設計する代わりに、インタプリタがエラーを直接報告することは、プログラムを単純化する代わりに有益でしょう。
- 配列とオブジェクトの区別
Javascriptの配列はオブジェクトでもあるので、オブジェクトが配列かどうかを区別するのはかなり面倒です。ダグラス・クロックフォードのコードは次のようになります:
- == と== ==は、2つの値が等しいかどうかを判断するために使用されます。2つの値が異なる型である場合、自動変換が行われ、得られる結果は非常に直感的ではありません。
したがって、常に"==="コンパレータを使用することをお勧めします。
- 基本型のラッパー・オブジェクト
基本データ型に対応するオブジェクト型は、小さな目的しか果たさず、多くの混乱を引き起こします。
Javascriptの奇妙な動作については、Javascript Gardenとwtfjs.comをご覧ください。