JavaScriptは主に Webブラウザ上などで動作する「オブジェクト指向スクリプト言語」(オブジェクト指向の簡易プログラミング言語)です。
JavaScriptを利用した簡単な例としては、
といったものがあります。また、腕があがれば、ゲームを作ろうと思えば、作れたりします。
HTMLだけで作成された Webページは静的な表現しかできませんが、JavaScriptを利用することでページに動きをもたせた動的な情報を表現したり制御することが可能になったのです。
このように開発当初は Webブラウザで利用することを目的としていましたが、現在では Webサーバ上で Webページを作成するため、あるいは汎用的なスクリプト言語として Webページ以外の分野でも広く用いられるようになっています。
JavaScriptは、主に HTML文書中の script要素の内部に記述するか、スクリプトを記述したファイルを別に保存しておき(拡張子「.js」)これを読み込むことで動作させることができます。コンパイル(プログラミング言語で作成したソースコードをコンピュータが理解できる機械語に変換すること)作業を必要としないインタープリタ言語のため、JavaScriptに対応したブラウザがあれば手軽にスクリプトを実行することができます。
JavaScriptはプログラム言語である「C言語」にそっくりです。C言語をプログラミングできる人は、すぐに対応できます。また変数の型は、プログラム言語である「Visual Basic」ご用達の Variant型を使います。
JavaScriptは、Netscape社が Netscape Navigator2.0(以下NN2)の β版を公開した時に実装された Live Scriptを起源にしています。これが NN2の正式出荷時に JavaScript 1.0として発表されたのが JavaScriptのはじめです。当初、JavaScriptはあまり複雑な処理を行うことを想定して作られたプログラミング言語ではなく、あくまで Webシステムの開発時に「おまけ」として使う程度のものでした。NN2が Webブラウザのシェアの大半を握るに従い、Web上でのスクリプト言語として JavaScriptは重要な役割を担うようになりました。
このあと JavaScriptにとって大きな出来事が起こります。それは 1996年8月に Microsoft社から Internet Explorer 3.0(以下IE3)が出荷された事です。Microsoft社は 1995年12月から急速にインターネットを重要視するようになり、Webブラウザの開発を急いでいたのです。この Webブラウザは Windowsの技術に非常に特化した ActiveXを導入し、さらにスクリプトとしても Visual Basic Scripting Edition(以下VBScript)とともに JavaScript 1.0互換の JScript 1.0を実装していました。IE3は無償ということもあり、急速にシェアを伸ばし始めました。
これに対抗する形で 1996年10月に Netscape Navigator 3.0(以下NN3)が出荷されました。
NN3には JavaScript 1.1が実装されました。JavaScript 1.1はかなり大幅な機能強化が成され、Webページをインタラクティブにする事が出来るようになりましたが、そのため IE3に実装されている JScriptと JavaScript 1.1の互換性の問題が起こるようになりました。JavaScript 1.1で強化された機能を使うと IE3では正常に動作しないのです。これ以後、Webシステムの開発者はブラウザの種類ごとに異なるコードを記述しなければならなくなり、互換性の問題に悩まされるようになりました。
1997年になり、インターネットもかなり一般的に使われるようになりました。Microsoft社、Netscape社はそれぞれ機能強化した Internet Explorer 4.0(以下IE4)、Netscape Communicator 4.0(以下NN4)を出荷し、IE4は JScript 3.0(JavaScript 1.1互換)、NN4 は JavaScript 1.2をそれぞれ搭載しました。JavaScript 1.2はかなりの部分が NN4用の拡張なので、一般的にはなっていません。
1998年8月にリリースされた NN4.06では JavaScript 1.3が実装されました。このバージョンでは Unicodeに対応し、さらに新しいメソッドやプロパティが実装されています。さらに 1998年11月には NN4.5がリリースされました。しかし、JavaScriptについての改良はありませんでした。
1999年に入り、3月に Webブラウザの位置付けを変えるような製品が登場しました。それが IE5です。IE5は見た目こそあまり IE4と変化がありませんが、XML1.0に対応するといったように、Webブラウザの枠に収まらず、アプリケーションのフロントエンドを担える製品になってきました。スクリプト面では JScriptが強化され、アプリケーション作成に堪えられるまでに拡張されています。
JavaScriptを学習したり使用したりしていると、たびたび ECMAScriptという言葉を見聞きしますが、この ECMAScriptとはプログラミング言語の仕様のことを指します。「仕様」ですから、プログラミング言語として満たさなければならない要求事項(決まり事)をまとめたものとなります。
1996年に相次いで IE3と NN3が出荷され、それぞれに強力な JScript、JavaScript 1.1が実装されていました。さぁ、これで JavaScriptを用いて様々な表現手段が使えると思ったのですが、非常に大きな問題が起こりました。それは互換性です。どちらも JavaScriptをベースにしていたのですが、独自の拡張を行なったり、実装の不備があったりなどで、片方の Webブラウザで動いてももう一方の Webブラウザでは動かないということが頻繁に起こりました。そのため、Webページ制作者はページ制作時にそれぞれの Webブラウザで動作確認したり、ひどい時にはそれぞれの Webブラウザ用に別々のページを制作しなくてはなりませんでした。
この状況に困った Webページ制作者は、標準規格を求めるようになりました。そこで Netscape社は JavaScriptの標準化案を情報通信システムの分野における国際的な標準化団体である ECMA Internationalに提出し、Microsoft社も対抗案を提示しました。ECMAの TC39という委員会は両者の標準化案をうまく融合させ、1997年7月に標準規格 ECMA-262として制定しました。これが ECMAScript(エクマスクリプト、JavaScriptの規格)と呼ばれています。以降、ECMAScriptの仕様はたびたび更新され、それに伴って JavaScriptも進化を続けています。
現在、ECMAScriptの仕様をもとにして作成されたプログラミング言語(でメジャーなもの)は JavaScriptのみのため、実質的に ECMAScriptは JavaScriptのために策定されている言語仕様となっています。
上記で触れたとおり、当初は JavaScriptを用いて複雑な機能を実装することは想定されておらず、時代の変化に応じてさまざまな機能が JavaScriptに追加されてきました。
発行年 | バージョン | 通称 |
---|---|---|
: | : | : |
2009 | 5版 | ES5 |
2011 | 5.1版 | ES5 |
2015 | 6版 | ES2015 (ES6) |
2016 | 7版 | ES2016 (ES7) |
2017 | 8版 | ES2017 (ES8) |
2018 | 9版 | ES2018 (ES9) |
2019 | 10版 | ES2019 (ES10) |
2020 | 11版 | ES2020 (ES11) |
2021 | 12版 | ES2021 (ES12) |
2022 | 13版 | ES2022 (ES13) |
: | : | : |
この表は、JavaScriptの仕様である ECMAScriptの直近のバージョンの更新状況です。
2011年にリリースされた第5.1版では、仕様書の修正のみが行われ、新しい機能の追加は行われていません。第6版以降は1年ごとにアップデートされており、ECMAScriptのバージョンはこの発行年をとってES2015、ES2016などのように表記されます。また、第5版から第6版がリリースされるまでにおよそ6年もの歳月がかかっています。そのため、第5版から第6版へのアップデートでは、多くの様々な機能が追加されています。
なお、現在の主要なブラウザは ES6 (ES2015)に対応しているため、ES6の記法は問題なく使用できます。この ES5、ES6というバージョン名は、JavaScriptで開発を行なっていると頻繁に見聞きしますので、覚えておいた方がよさそうです。
では、ES5から ES6までは6年もの歳月がかかったのに、ES7からは1年ごとに順調に新しいバージョンがリリースされています。なぜ、ES7からは1年ごとにリリースできるようになったのでしょうか?
それは、ES6がリリースされたタイミングで仕様策定のプロセスが変わったためです。ES6までの ECMAScriptの仕様策定では、すべての仕様の合意が取れるまで議論を続け、全てが決まってからリリースされていました。そのため、ES5から ES6へのアップデートに6年もの歳月がかかってしまいました。しかし、この反省をもとに ES6以後の仕様策定では、仕様として合意できる部分のみを合意していくことにより、仕様策定にかかる期間を短くすることに成功しています。
例えば、JavaScriptでは ES6からクラスが使えるようになりましたが、ES6で追加されたクラスの仕様は最小限の機能です(private、publicなどのメンバーへのアクセス制御がないなど、クラスの記法もシンプルなものにとどまりました)。その後、ES2022で、より充実したクラスの記法が仕様として追加されています。このように仕様で議論が分かれそうなものを細分化することによって、大きな仕様更新による策定期間の遅延を防いでいます。
また、ES6以降の ECMAScriptの仕様は、GitHub(ソースコードなどを保存、公開し、複数人数で共有できる Webサービス)上で管理されており、最新のものが常に公開された状態で仕様が決定されていきます。この仕様決定のプロセスは Living Standardと呼ばれており、GitHub上に公開されている状態がそのまま ECMAScriptの仕様であることを表しています。
なお、ECMAScriptの仕様決定のフェーズには、Stage 0から Stage4までがあり、Stage 2 (Draft)以降のものが ES2021、ES2022などのように年次の仕様書の草案(Draft)としてまとめられます。
段階 | 通称 | 概要 |
---|---|---|
Stage 0 | Strawman | アイデアレベル |
Stage 1 | Proposal | 機能提案・検討 |
Stage 2 | Draft | 暫定的に仕様決定 |
Stage 3 | Candidate | テスト・実装 |
Stage 4 | Finished | 仕様決定 |
そのため、ECMAScriptの仕様は年に1回更新されるものではなく、あくまでその年に Stage 2まで決まった仕様をまとめたものが ES2020、ES2021といった形で公開されると思ってください。また、基本的に Stage 3まで進んだものに関してはほとんどがそのまま仕様として取り込まれるため、もし使用してもよいか判断に困った場合は Stage 3まで進んでいるかを確認するようにしてみてください。
ここで JScriptについて簡単にまとめておきます。JScriptは Microsoft社が JavaScript互換のスクリプト言語として実装したものです。Microsoft社はスクリプト言語を IE3に実装する際に念入りにアーキテクチャを検討し、非常にスマートな形で実装してきました。それが ActiveX Scriptingです。この技術で重要な事は、Webブラウザからスクリプトの実行エンジンを切り離したという部分にあります。これにより、スクリプトエンジンだけのバージョンを上げるといったことが可能になります。たとえば IE4を使っていたとしても、スクリプトエンジンのバージョンをアップデートすると新しい機能が使えるようになったりします。さらに、複数のスクリプトを動作させるアプリケーション(ホストアプリケーションと呼ぶ)で、1つのスクリプトエンジンを共有する事もできます。また、1つの OS上にそれぞれ異なるスクリプト言語を実行するスクリプトエンジンを用意する事で、ホストアプリケーションに対して複数のスクリプト言語の使用を許可する事ができます。
JavaScriptは名前の示す通りスクリプト言語です。スクリプト言語は以前からあるもので、UNIX環境では非常によく使われてきました。反復的なシステム管理タスクをひとまとめにして、システム管理を簡単にするという目的などに使われています。代表的なスクリプト言語としては Bourne Shell、Cshell、Awk、Sed、Perlなどがあります。これらのスクリプト言語と JavaScriptの大きな違いは、Webブラウザ上で動作するものであるという事です。
JavaScriptには、見てわかるように「Java」という言葉が含まれています。しかし、JavaScriptと Javaはまったく関係がありません。すでに述べたように JavaScriptは開発当初 Live Scriptという名前で Netscape社から発表されました。しかしちょうどそのころ発表された Javaとのマーケティング的な関係から、Javaの構文の書き方を一部取り入れ、JavaScriptという名前で NN2に実装しました。そのため名前に「Java」という言葉が含まれていますが、開発経緯、設計思想などが異なるため、全く別のものとして考えた方がよいでしょう。
ここで少しだけ Javaについても触れておきましょう。Javaはインターネットだけにとどまらず、昨今のコンピュータ業界の中で非常に重要な役割を占めるようになってきています。この Javaにはプログラミング言語としての側面と、実行環境としての側面があります。通常のプログラミング言語、例えば C言語、C++言語、Pascalなどといったものは実行環境ごとに(要するにそれぞれの OS用に)コンパイラが用意され、コンパイルした後の実行ファイルは OSごとにしか動作しません。しかし、Javaは Java VM(Virtual Machine)上で動作するという実装にしたため、どのような OS上であっても Java VMさえ存在すれば実行できます。つまり、どの OS上であっても同じ Javaのプログラムファイルで実行できることになります。
この Javaというのは、実際は Webブラウザ上で動く Java Appletとクライアント Javaプログラム、サーバーサイド Javaプログラムの3つに大きく分ける事ができます。Webページ制作者にとっては、Java Appletとサーバーサイド Javaプログラムに注目する必要があるでしょう。
Java Appletは Webサーバーから Appletと呼ばれる小さな Javaプログラムをダウンロードして Webブラウザ上、または OS上の Java VMの上で動作します。しかし、現状では Java VMの起動、動作が遅いため Java Appletを使う事はほとんどありません。サーバーサイド Javaプログラムはいくつかの技術があるのですが、この中でも Webサーバーの機能拡張として使われている Servletや EJB(Enter prise Java Beans)が注目されています。これらは Java言語の生産性の高さや、安定性から最近の電子商取引の基盤技術として使われ始めています。
少なくとも Javaと JavaScriptが全く異なるものであるという事がおわかりいただけたと思います。
JavaScriptを使うことにより、どのような事が出来るのでしょうか?様々なインターネット関連技術の中でも、JavaScriptは重要な役割を担っています。まず JavaScriptは Webブラウザの中で動作するため、WWWを使っているほとんどの人の環境で動作します。さらに、制作にあたって特別なツールが必要となる事もなく、単純なテキストエディタがあれば作成できます。またスクリプト言語であるため、コンパイルといった作業も必要ありません。そのため、数あるスクリプト言語の中でも非常に敷居の低いスクリプト言語であると言えます。
JavaScriptは Webブラウザ側、要するにクライアント側で動作します。これは、Webサーバーの管理者でなくとも Webページに様々な機能の追加が簡単にできる、という事を示しています。CGIなどと比較して、この部分は非常に大きなメリットであると言えます。そのため、ほとんど同じ事をするのであれば CGIよりは JavaScriptで実装させた方が良いという事になります。ただし、当然 JavaScriptには出来る事と出来ない事があるので、CGIとは機能を分割して使用するのが最も良い制作スタイルである事は間違いありません。
ここで、JavaScriptでは出来ない事を挙げておきます。
1つ目は、セキュリティの関係から、Webブラウザの動作しているマシンから情報を取り出したり、書き込んだりする事ができません(クッキーは除く)。これは、Webブラウザでどこかのページにアクセスしたときに勝手にハードディスク内からデータが取り出されるといった事や、逆にウィルスなどをハードディスク内に書き込まれないための仕様です。
2つ目には、JavaScriptはページを見てくれる人からコードを隠す事が出来ないという事です。JavaScriptは HTML文書内に記述されているため、Webブラウザを使う人は簡単にコードを見る事ができます。Webページ上で、ある機能をどのようにして実現しているか知られたくない時には、JavaScriptではなく、他の方法にした方がよいでしょう。
こういった制約があるため、JavaScriptはクライアント側でのフォームのための事前処理や、ダウンロードしたページの要素をインタラクティブに動作させるといった事などに向いていると思われます。
IE、NNでは両者に Dynamic HTMLという機能が実装されています。これは名前は同じものなのですが、互換性はほとんどありません。しかし、両者とも目指す方向性は同じです。それは GIFアニメーションや Javaアプレットを用いなくても、ページ内で各 HTML要素を Webページの再読み込みなしに動かすというものです。
互換性はないのですが、これら DHTMLはどのように実装されているかというと、Cascading Style Sheets(以下 CSS)と呼ばれるスタイルシートの各要素の属性値をスクリプト言語によりダイナミックに変化させるという方法がとられています。このためスクリプト言語、とりわけ IE、NNの両者で動作する JavaScriptの重要性は増していると言えます。