JavaScriptの簡単な歴史。 パート1

Live Typingフロントエンド開発部門は、Habrの読者向けに、Auth0サービスのブログで公開されているJavaScript言語の起源、開発、および展望に関する多くの資料を翻訳しました。 本日、翻訳の最初の部分を公開します。 NetscapeとMosaicのライバル、インタラクティブなWebの夢、非プログラマ向けのプログラミング言語、クラスからプロトタイプへの移行、JavaScriptとECMAScriptの共通点(ネタバレ:すべて)。



JavaScriptの簡単な歴史。 パート2

JavaScriptの簡単な歴史。 パート3







JavaScriptは、おそらくこれまでで最も重要なプログラミング言語の1つです。 Webの開発のおかげで、JavaScriptは約束しなかった高さに達しました。 この記事では、作成から現在までのJavaScriptパス全体を見て、その将来を検討します。



それはすべて90年代に始まった



JavaScriptをもたらしたイベントは、1995年5月から12月までの6か月間展開されました。 Netscape Communicationsは自信を持ってWebへの道を開いてきました。 彼女のブラウザ、Netscape Communicatorは、最初の人気のあるWebブラウザであるNCSA Mosaicから正常に引き継がれました。 Netscapeは、90年代初期にMosaicの開発に参加した人々によって作成されました。 現在、お金と独立性で、彼らはウェブ技術をさらに発展させる方法を見つけるために必要なすべてを持っています。 これがJavaScriptの誕生のきっかけとなりました。



Netscape Communicationsの創設者であり、Mosaicチームの元メンバーであるMark Andrissenは、Webがよりダイナミックになるべきだと考えていました。 アニメーション、ユーザーインタラクション、およびその他の種類の対話機能は、将来のインターネットの不可欠な部分になるはずです。 Webには軽量スクリプト言語(またはスクリプト言語-ed。)が必要でしたこれは当時標準化されていなかったDOMで機能します。 1つの「しかし」があり、それは当時重大な課題でした。この言語は、大規模な開発者や問題のエンジニアリング側に関係する他の人々を対象としていませんでした。 当時のJavaはすでに積極的に開発されており、このニッチをしっかりと占めていました。 したがって、新しいスクリプト言語は、まったく異なるユーザー、つまりデザイナーを対象としています。 明らかに、Webは静的であり、HTMLはかなり若く、プログラミングに関係のない人でも簡単に習得できました。 したがって、ブラウザの一部になり、Webをより動的にするために想定されていたすべてのことは、プログラミングから遠く離れた人々にとって可能な限り明確でなければなりません。 この仮定から、モカのアイデアが生まれました。これは、シンプルでダイナミックでアクセスしやすいスクリプト言語になることでした。







そして、JavaScriptの父であるBrendan Ikeがストーリーに登場します。 IkeはNetscapeの「Scheme for the browser」を開発することになっていた。 Schemeは、最も単純化された構文を備えた、Lispプログラミング言語の動的で強力かつ機能的な方言です。 ウェブには次のようなものが必要でした。習得しやすく、動的で、簡潔で強力です。 アイクは好きなことに取り組む機会を逃さず、チームに加わりました。







チームは、作業プロトタイプをできるだけ早く準備することを任されました。 Sun Microsystemsは、その時点でOakと呼ばれるJavaプログラミング言語の作業を終えていました。NetscapeCommunicationsは、Javaをブラウザで使用できるようにするための契約を会社と締結する準備ができていました。 では、なぜMocha(JavaScriptのファーストネーム)が必要なのですか? なぜ既製の代替手段を備えたまったく新しいプログラミング言語を作成する必要があったのですか? 実際のところ、Javaは、Mochaが焦点を当てているオーディエンス(スクリプト作成者、アマチュア、デザイナー)を対象としていませんでした。 Javaはこの役割を果たすには大きすぎて洗練されていません。 基本的な考え方は、Javaは大規模な開発者やプロのプログラマー向けであり、Mochaは小さなスクリプト作成タスク向けであるというものでした。 つまり、Mochaは、WindowsプラットフォームでのC / C ++とVisual Basicの対話方法と同様の方法で、Javaのスクリプトコンパニオンになるはずでした。



Netscapeのエンジニアは、Javaの詳細な調査を開始しました。 彼らは独自のJava仮想マシンの開発を始めましたが、プロジェクトはSun Microsystems仮想マシンとの完全な互換性を達成できなかったため、すぐに縮小されました。



迅速な言語選択の問題はかつてないほど深刻でした。 可能な候補は、Python、Tcl、およびSchemeでした。 アイクは迅速に行動しなければなりませんでした。 競合他社と比較して、彼には2つの利点がありました。必要な機能セットを決定する自由と、顧客との直接的なコミュニケーションです。 残念ながら、明らかに不便な点がありました。膨大な数の重要な決定を下す時間は事実上ありませんでした。 JavaScript、別名モカは、まさにそのような状況で生まれました。 数週間以内に、実用的なプロトタイプが準備され、Netscape Communicatorに統合されました。



ブラウザのSchemeの類似物であると考えられていたものが、まったく異なるものになりました。 Ikeの手は、Sunとの契約を結び、MochaをJavaのスクリプトコンパニオンにする必要性によって支配されていました。 構文は、できる限りJavaに近いものと想定されていました。 さらに、確立された多数のイディオムのセマンティクスはJavaから継承されました。 そのため、MochaはSchemeとはまったく異なりました。 動的Javaのように見え、そのシェルの下にはSchemeとSelfのハイブリッドが隠れていました。



Mochaプロトタイプは、1995年5月にNetscape Communicatorに統合されました。 非常に短い期間の後、LiveScriptという名前に変更されました。その瞬間、liveという言葉はマーケティング担当者の観点から非常に魅力的に見えたからです。 1995年12月、Netscape CommunicationsとSunの契約は終了しました。Mocha/ LiveScriptはJavaScriptに名前が変更され、ブラウザで小さなクライアントタスクを実行するためのスクリプト言語として提示されました。一方、Javaは複雑なWebコンポーネント。



JavaScriptの最初のバージョンでは、この言語が今日までに有名なすべての基本的な機能を規定しました。 特に、そのオブジェクトモデルと機能的な機能は、最初のバージョンで既に存在していました。



Ikeが期限内に実用的なプロトタイプを提供する時間がなかった場合、イベントがどのように発展したかを言うのは困難です。 Python、Tcl、Schemeは、代替と見なされ、Javaとはまったく異なりました。 Sunが、Javaのコンパニオン言語としてJavaと根本的に異なるバリアントを受け入れることは困難です。 一方、Javaは長い間Webの重要な部分でした。 Sunが決定要因ではない場合、Netscapeは言語を選択する際の自由度がはるかに高くなります。 しかし、Netscapeは独自の言語を開発するのか、それとも既存の言語の1つを使用するのか? 決してわからないこと。



さまざまな実装



SunとNetscapeが契約を締結し、Mocha / LiveScriptがJavaScriptに名前が変更されたとき、非常に重要な疑問が生じました。競合他社はどうなりますか? Netscapeは人気を博し、最も使用されているブラウザになりましたが、MicrosoftはInternet Explorerを積極的に開発していました。 JavaScriptは最初の数日から、ユーザーとの対話の面で驚くべき機会を示したため、ライバルブラウザは、最短時間で機能するJavaScript実装を表す既製のソリューションを見つけるしかありませんでした。 その時点で(そしてその後十分に長い間)Web標準はかなり弱いままでした。 そのため、MicrosoftはJavaScriptの実装を開発し、JScriptと呼んでいます。 名前から「Java」という単語を削除することで、ブランド所有者に起こりうる問題を回避することができました。 ただし、JScriptは単なる名前ではありませんでした。 実装のわずかな違い、特に一部のDOM関数へのアプローチでは、今後何年もの間感じられる波紋が残りました。 JavaScriptの戦いは、名前やタイムラインよりもはるかに多くの面で進んでおり、この言語の癖の多くはそれらのおかげで登場しました。 JScriptの最初のバージョンは、1996年8月にリリースされたInternet Explorer 3.0に登場しました。



JavaScriptの実装は、Netscapeで独自の名前になりました。 Netscape Navigator 2.0でリリースされたバージョンは、Mochaと呼ばれていました。 1996年の秋に、Ikeは技術的な欠陥と開発中のラッシュの結果として生じた欠陥に対処するためにMochaのほとんどを書き直しました。 新しいバージョンはSpiderMonkeyと呼ばれていました。 この名前は現在でも、Netscape Navigatorの孫であるFirefoxのJavaScriptエンジンで使用されています。



数年間、JScriptとSpiderMonkeyが唯一のJavaScriptエンジンでした。 常に互換性があるとは限らない両方のエンジンの機能により、今後数年間のWeb開発のベクトルが決定されました。



アーキテクチャの主な機能



JavaScriptは急いで生まれたという事実にもかかわらず、最初からいくつかの強力な機能が組み込まれていました。 これらの機能はJavaScriptを言語として定義し、JavaScriptのすべての癖にもかかわらず、独自の境界を超えることを可能にしました。



「独自の言語を発明する代わりに既製の言語を使用するという決定は、決して私に依存していませんでした。 最上部からのインストールは、次のように聞こえました。「言語はJavaのように見えるはずです。」 これにより、SchemeとともにPerl、Python、およびTclがすぐに削除されました。 その後、1996年にJohn OusterhoutがTkを見せに来て、Tclの機会を逃したことを嘆きました。 私は誇りに思っていませんが、Schemeのようなファーストクラスの機能とプロトタイプのセルフプログラミングを主要な要素として選んだことを嬉しく思います。 Javaの影響、特に2000年の日付と大文字と小文字の区別があるバグは、迷惑な誤解になっています。」 - Brendan Eichのブログ:人気


Javaに可能な限り近い構文を作成することはJavaScriptの主なアイデアではありませんでしたが、市場は調整を行いました。 おそらく、特定の問題を解決するために別の構文がより適しているかもしれませんが、使い慣れた構文を使用しているおかげで、JavaScriptは簡単に人気を得ました。



Javaで記述されたこの例を比較します。



public class Sample { public static void main(String[] args) { System.out.println("Hello world!"); try { final MissileSilo silo = new MissileSilo("silo.weapons.mil"); silo.launchMissile(args[0]); } catch(Exception e) { System.out.println("Unexpected exception: " + e); } } }
      
      





JavaScriptで記述されたこの例では:



 console.log('Hello world'); try { const silo = new MissileSilo('silo.weapons.mil'); silo.launchMissile(process.argv[0]); } catch(e) { console.log('Unexpected exception' + e); }
      
      





オブジェクトとして機能



JavaScriptの関数は、別の種類のオブジェクトです。 他の要素と同様に、それらを操作できます。 これらを変数にバインドし、JavaScriptの以降のバージョンでは、例外としてスローすることもできます。 ほとんどの場合、SchemeにはこのJavaScript機能があります。



 var myFunction = function() { console.log('hello'); } otherFunction(myFunction); myFunction.property = '1';
      
      





機能がオブジェクトと見なされるという事実により、さまざまな機能パターンが可能になりました。



 var a = [1, 2, 3]; a.forEach(function(e) { console.log(e); });
      
      





これらのパターンは、 アンダースコアimmutable.jsなどの多くのライブラリで正常に使用されています。



プロトタイププログラミング



プロトタイププログラミングはJavaScriptで一般的になりましたが、最初にSelfで導入されました。 Ikeはこの特定のスタイルのプログラミングを好みました。これは、JavaやC ++などのSimulaに似た言語のより伝統的なアプローチをシミュレートするのに十分強力であることが判明しました。 概して、JavaScriptの最新バージョンに実装されているクラスは、プロトタイプシステムに振りかける構文糖にすぎません。



IkeがJavaScriptにプロトタイプを導入するきっかけとなったプログラミング言語Selfの作成者は、Simulaに似た言語のオブジェクトに関連する問題を回避しようとしました。 特に、クラスとインスタンス間の分岐は、Simulaに似た言語に固有の多くの問題を引き起こしました。 プログラムコードが開発されて大きくなったときに発生した問題は繰り返し議論されました:クラスはすべての新しいオブジェクトの原型であったため、コードが成長するにつれて、プロセスで生じた新しい要件に基本クラスを適合させることがより困難になりました。 同様の問題は、新しいプロトタイプインスタンスを作成することで回避できます。このインスタンスから、新しいオブジェクトが作成されます。 これがプロトタイプの主要な概念です。独自のパラメーターを設定できるサンプルです。 プロトタイプが新しいオブジェクトに適していない場合、他の子インスタンスに影響を与えることなく複製および変更できます。 クラスベースの言語では、このアプローチの実装は非常に困難です。



 function Vehicle(maxSpeed) { this.maxSpeed = maxSpeed; } Vehicle.prototype.maxSpeed = function() { return this.maxSpeed; } function Car(maxSpeed) { Vehicle.call(this, maxSpeed); } Car.prototype = new Vehicle();
      
      





プロトタイプの力のおかげで、JavaScriptは非常に柔軟であることがわかりました。 インスピレーションを受けて、開発者は独自のオブジェクトモデルを使用して膨大な数のライブラリを作成しました。 人気のあるStampitライブラリは、従来のクラスベースの言語では不可能だった方法でオブジェクトを操作するために、プロトタイプシステムから可能な限りすべてを絞り出します。



プロトタイプによりJavaScriptは一見シンプルになり、ライブラリ開発者に大きな力を与えています。



大きな癖:プリミティブとオブジェクト



おそらく、JavaScriptの開発が急増したために犯した最大の間違いの1つは、まったく同じように動作するオブジェクトがさまざまなタイプになる可能性があることです。 たとえば、文字列のタイプ(Hello world)は、新しいStringオブジェクトのタイプ(new String( 'Hello world'))と一致しません。 これにより、混乱を招く可能性のある望ましくない結果が生じることがあります。



 > typeof "hello world" < "string" > typeof new String('hello world') < "object"
      
      





しかし、それはJavaScriptの歴史のほんの始まりに過ぎませんでした。 性急な開発は多くのアーキテクチャ上のエラーを引き起こし、それが本当の悪夢になる可能性がありました。 しかし、締め切りは厳しく、すべてをそのままにしておかなければなりませんでした。



「他のすべては倒錯した、冷酷な物語です。 JavaScriptは、JavaScriptの直接の子孫であるActionScriptをサポートするものとFlashだけが競合できる最も人気のあるJavaクライアント実装でした。」 - Brendan Eichのブログ:人気


私の記憶の波から:Netscape Navigator 2.0および3.0の概要



JavaScriptの最初の公開バージョンは、1995年にリリースされたNetscape Navigator 2.0に組み込まれました。 仮想化の素晴らしさと、時代遅れでサポートされていないサイトのおかげで、私たちはこれらの幸福の瞬間を追体験することができます。







残念ながら、当時、多くの基本的なJavaScript関数は機能しませんでした。 最も強力な2つの機能である匿名機能とプロトタイプチェーンは、現在の動作とは異なります。 それでも、当時のこれらの機能はすでに設計されていて、今後数年で実現するはずです。 JavaScriptインタープリターのこのバージョンはアルファバージョンと見なされていたことに注意してください。





嬉しいことに、Netscape Navigator 3.0は1年後にリリースされ、前身とは大きく異なりました。





エラーメッセージは、何が起こっているかについてのより多くの情報を提供することに注意してください。 これにより、インタプリタがプロトタイププロパティを独自の方法で認識することを理解できます。 オブジェクトをObjectのベースインスタンスに置き換え、わずかに変更します。 少なくとも部分的に。 どうやら、テスト関数内の割り当てはまったく何もしません。 今後多くの作業が行われることは明らかですが、それにもかかわらず、現在の状態のJavaScriptはほとんどのタスクに十分に使用でき、その人気は高まり続けています。



正規表現、JSON、例外などの機能はまだ利用できませんでした。 その後の数年間、JavaScriptの開発は非常に高速でした。



ECMAScript:標準化されたJavaScript



JavaScriptのリリース以来の最初の大きな変更はECMA標準化でした。 ECMAは、情報および通信システムの標準化を目的として1961年に設立された協会です。



JavaScriptの標準化作業は1996年11月に始まりました。 TC-39チームが取り組んでいた標準には、ECMA-262識別番号が割り当てられていました。 その頃には、JavaScriptは多くのWebページで積極的に使用されていました。 この 1996年のプレスリリースでは、JavaScriptを使用して300,000ページが示されました。



JavaScriptおよびJavaは、インターネットおよびイントラネットアプリケーションを開発するためのプラットフォームであるNetscape ONEの中核にあります。 昨年の導入以来、短期間で新しい言語が開発者の間で受け入れられましたつまりwww.hotbot.comによると、 現在 、インターネット上でJavaScriptを使用している175,000以上のJavaアプレットと300,000以上のページがあります。 -Netscapeプレスリリース


標準化は、若い言語にとって重要なステップであるだけでなく、深刻な課題にもなっています。 JavaScriptをより多くの人に公開し、サードパーティの開発者が言語の開発に参加できるようにしました。 彼女はまた、他の開発者を揃えるのを助けました。 当時、Microsoftや他の誰かが言語の元の実装から逸脱しすぎて、断片化につながる恐れがありました。



商標の問題により、ECMAはJavaScriptを名前として使用できませんでした。 短い議論の後、標準で記述されているプログラミング言語はECMAScriptと呼ばれることになりました。 今日、JavaScriptはECMAScriptの単なる商号です。



JavaScriptの簡単な歴史。 パート2

JavaScriptの簡単な歴史。 パート3



All Articles