ざっくりわかる JavaScript の歴史

ブラウザで動くほぼ唯一のプログラミング言語 JavaScript です

Web ブラウザ全盛の現在 JavaScript は数あるプログラミング言語の中でも 最も普及していると言っても過言でないです

Web サイトだけでなく サーバー・モバイルアプリまで その気になればなんでも作れてしまう汎用性と

ブラウザの開発者ツールをひらけば とりあえずすぐに動かせる手軽さで

初めてのプログラミング言語に JavaScript を選ぶ初心者の方も多いはずです

しかしこの JavaScript ブラウザ由来であるが故の制限や その複雑な歴史的経緯から 初心者が理解しづらいところが いくつもあります

この動画では これから JavaScript を触ってみようという人や ちょっとやってみたけど本格的な開発は わからない用語があってさっぱりわからないという人向けに 歴史的経緯に触れながら 現在の JavaScript を取り巻く環境をざっくり 紹介したいと思います

JavaScript の歴史

誕生

JavaScript が産声を上げた 1995 年 Web ブラウザは現在のように リッチな UI を持ったものではなく

文書を閲覧するだけの 今で言うとダウンロード機能付き PDF ビューワー のようなものでした

最初の JavaScript は当時使われていた Web ブラウザーの Netscape Navigator に組み込まれる形で実装されましたが

このときはまだ Javacript ではなく LiveScript と呼ばれており のちに Netscape 社と業務提携していた Sun Microsystems が発表して注目を集めていた Java の 人気にあやかる形で JavaScript に改名されました

こういった経緯もあり JavaScript という名前の商標権は Sun Microsystems そして現在ではそれを買収した Oracle 社が保有しています

翌年以降競合となる Web ブラウザー 特に Internet Explorer が JavaScript の導入を 進めますが Netscape 側がライセンスを発行しなかったため 独自実装となる JScript を組み込んで IE3 はリリースされました

これ以降多くの Web ブラウザーが JavaScript を導入しますが そのほとんどが独自実装の JavaScript だったため

あるブラウザでは動くけど他のブラウザでは動かない 文法が多くあるあることが問題となりました

この JavaScript の互換性の問題を解決するために JavaScript の共通の仕様を ECMA International という 標準化団体のもとで決めていくことになりました

この仕様は標準化団体の名前をとって ECMAScript と名付けられ 1997 年に初版が作られてから いくどかの改訂を経て現在でも使われています

なんで JavaScript の仕様なのに ECMAScript という 別の名前が使われているかというと 先に述べたように JavaScript の商標を Sun Microsystems が保有していたからというのが 理由の一つみたいです

成熟

HTML を補助するプログラミング言語として 導入された当初の JavaScript は カーソルをピカピカさせる程度のものでしたが

① JavaScript で動的にデータを取得する Ajax という技術が流行したこと ② 動的なページを作るのに広く使われていた Flash を iOS がサポートしなかったこと などの追い風を受けて 急速に成長していきました

一方で JavaScript を動かすブラウザもたくさん作られ シェアを取り合うブラウザ戦国時代となります

2000 年代には Windows OS に 同梱されていた Internet Explorer が 一強となりましたが

2008 年にリリースされた Google Chrome が 急激に市場を席巻し

現在では 50%以上のシェアをもつ Chrome Internet Explorer の次世代版である Edge MacOS や iOS に搭載されている Safari Netscape Navigator の流れを汲む Firefox が市場を寡占しています

これらのブラウザはもちろん すべて EcmaScript に準拠した JavaScript を実行することができますが

JavaScript を動作させるためのソフトウェア いわゆる JavaScript エンジンは それぞれ独自のものが使われているため

すべてのブラウザが最新の言語仕様や機能に 対応しているというわけではありません

そのため割と最近までこれらの差異をなくすための いわゆる Polyfill と呼ばれるライブラリが よく使われていましたが

特に対応が遅れていた Internet Explorer の 正式サポートが切れた現在となっては Polyfill を使う機会も かなり少なくなってきています

ちなみに JavaScript エンジンには それぞれ名前がついていて Safari のものは JavaScriptCore Firefox のものは SpiderMonkey Chrome のものは V8 と呼ばれています

Edge は Internet Explorer から引き継いだ Chakra と呼ばれるエンジンを使っていたのですが 2020 年から コア部分を Chrome と全く同じものに変更したので 現在は V8 を使っています

多様化

ブラウザの JavaScript が成熟していく一方で JavaScript をもっと色々な場所で使える ようにしようという動きも始まりました

その主役となったのが 2009 年にリリースされた Node.js です

Node.js は Chrome から V8 だけを 引っこ抜いてきて

ブラウザに存在しない 例えばファイル操作やプロセス管理のような機能を つけることによって

コンピューターの上で直接 JavaScript を使える ようにしたものでした

Node.js はすでに浸透していた JavaScript で書けて さらに当時話題になっていたクライアント 1 万台問題 をクリアできるという利点もあったため サーバーの開発言語として急激に広まっていきました

さらに Node.js を使ってデスクトップアプリを作る Electron や

JavaScript でモバイルアプリを作れる React native などが登場し

JavaScript は一気に多様化していきました

そんな Node.js が JavaScript の世界に持ち込んだ 大きな概念がモジュールシステムです

JavaScript はブラウザでは HTML の script タグに 読み込ませて使うものだったため

ファイルの分割という概念がほとんどありませんでした

大きくなりすぎたら別のファイルを別の script タグに 読み込ませればよかったからです

jquery などのライブラリを使うときも script タグで 読み込んでおけば問題ありませんでした

しかし Node.js ではそうはいきません 複雑なサーバーのロジックを一つのファイルに 閉じ込めるのはとても現実的でなく

またブラウザのように複数のファイルを 一つの HTML で使うこともできません

そこで Node.js は require という関数に ファイルパスを渡すことで 別のファイルの JavaScript を使うことのできる システムを導入しました

外部のライブラリは package.json というファイルに まとめて書いておくことで node_modules という フォルダに自動でダウンロードできて それらも同じように require できるようになりました

これらの仕組みは Node Package Manager 略して npm として Node.js に同梱されました

複雑化

Node.js に導入されたモジュールシステムが とても便利だったので これをブラウザの JavaScript でも使いたい という人が現れました

しかし当然ブラウザの JavaScript には そんな機能はありません

そこでモジュールに分けた JavaScript を 一つのファイルにまとめてしまって ブラウザでも使えるようにしてしまおう! というツールが登場します

この複数の JavaScript をまとめて一つのファイルに するツールのことをバンドラーと呼びます

最も有名なバンドラーは Webpack ですが そのほかにも Rollup や parcel つい最近発表された turbopack などもあります

バンドラーの登場によってサーバー開発だけでなく フロントエンドの開発にも npm が 使われるようになり フロントエンドもサーバーサイドも npm を使った JavaScript で書くことが一般的になりました

しかしまだ厄介な問題が出てきます それが ESModules の登場です

Node.js で生まれたモジュールシステムは EcmaScript(さっき話した標準仕様)の 2015 年にリリースされたバージョンである ES6 に取り込まれましたが

Node.js の require キーワードを使った 記法ではなく 新たに import という記法を追加する形で 取り込まれました

こうして生まれた EcmaScript のモジュールシステムを ESModules それに対して Node.js に元々あった モジュールシステムを CommonJS Modules と呼びます

ESModules の方が新しく また標準化された仕様なので Node.js でも ESModules を使った書き方が 取り入れられ始めます

しかし当然 CommonJS を前提に作られた Node.js 上でそのまま ESModules を 動かすことはできないため

ESModules で書かれた JavaScript の ファイルを CommonJS に変換する トランスパイラというツールの利用が一般的になりました 最も有名でよく使われているトランスパイラは Babel です

このような経緯を経て JavaScript の開発は サーバーサイドの場合 ESModules で書いた JavaScript を Babel で CommonJS に変換して実行 フロントエンドの場合 ESModules で書いた JavaScript を Babel で CommonJS に変換し さらに Webpack でバンドルしてブラウザで実行 というスタイルで行われるようになりました

さてこれでようやく JavaScript の最近の開発スタイルに 追いつくことができました

色々と便利な補助ライブラリが出てきているので もしかしたらあまり意識しなくても JavaScript をかけちゃう場面があるかもしれませんが

最近の JavaScript 開発ではほとんどの場合この トランスパイル → バンドル まとめて「ビルド」というステップが行われています

ここまでで 書いたものを直接動かせるはずの JavaScript 開発が なぜこんなに複雑化しているかが なんとなくわかったと思いますが 最後に避けては通れない Typescript の話をしましょう

とその前に四方山話のコーナーです

四方山話

今日の雑談テーマは「WebAssembly」です JavaScript はブラウザで動くほぼ唯一の言語ですが 実は JavaScript 以外の言語を ブラウザ上で動かす仕組みがあります それが WebAssembly 略して WASM です

WebAssembly はざっくりいうと Javascript 以外の言語で 書かれたプログラムを ブラウザ向けに変換することで ブラウザでも動かせるようにしちゃおうぜ! というもので

機械が直接読み取れるバイナリ形式なので 文字列を読み込んで実行しないといけない JavaScript と比べてパフォーマンスに優れる という特徴があり

また WebAssembly にさえ変換できれば C 言語や Rust で書かれたソースコードを そのまま動かすことができるため 過去に C 言語で書かれた多くのライブラリを そのままブラウザ上で使えるという 大きなメリットもあります

ただしこれは JavaScript に とって代わるためのものではなく あくまで JavaScript と併用するための 技術だとされています

これまでのような HTML を書き換えたり サーバーと通信するような処理は JavaScript で書いて 一部の重い処理や 既存の別言語の実装を利用したい場合に WebAssembly を使う という使い分けをしていくのが良さそうです

実際に Unity で作ったゲームを WebAssembly 向けにビルドして ブラウザで遊べたり デザインツールの Figma が 読み込みの重い処理に WebAssembly を 使っていたりなど すでに実用化されているケースも あるようなので 気になった人は ぜひ調べてみてください

Typescript の登場

Node.js や各種ツールのおかげで サーバーサイド フロントエンド アプリなど 多くの環境で使われるようになった JavaScript ですが

大規模開発に使われるようになるにつれて 言語仕様自体の貧弱さが問題になるようになりました

それを補うために ECMAScript に新たな文法が 導入されたり JavaScript 自体を置き換えるために Dart という 全く新しい言語が作られたりしましたが

各種ブラウザに組み込まれている JavaScript を 更新したり置き換えたりすることは容易ではなく 開発者が満足する言語仕様を満たすことはできませんでした

そこで JavaScript を置き換える代わりに トランスパイラ使って JavaScript に変換することで 機能を拡張した新しい言語が登場しました これらをまとめて AltJS と呼びます

CoffeeScript や Elm PureScript などそれぞれ特色を持った 多くの AltJS が登場しましたが

中でも Microsoft が開発した Typescript は 既存の JavaScript の文法をほとんど変更せずに 静的型付けが行えるということで大流行し 現在では多くの大規模プロジェクトで 導入されるようになりました

Typescript は Babel のように ESModules を CommonJS に変換する機能も備えていたため トランスパイラを Babel から Typescript に 置き換える、もしくは併用して ビルドされるようになりました

まとめ

歴史的経緯から複雑になった JavaScript 開発ですが 現在では Typescript をトランスパイラで JavaScript に 変換したあとバンドラを使って一つのファイルにまとめる という開発スタイルで一旦は落ち着いています

しかし Typescript を最終的に一つの JavaScript に まとめるという目的は同じでも 使いやすさや速度の改善のため 毎月のように新しいツールが出続けています

また Node.js の後継として Typescript を 直接実行できる Deno というツールが開発されたり

ブラウザがバンドルされていない ESModules を 直接読み込める Native ESM に対応し始めたりと

JavaScript を取り巻く環境は ずっと日進月歩で変わり続けています

追いつくのは大変ですが常に新しいものが 生まれ続けるのが JavaScript の醍醐味でもあるので 一緒に JavaScript の未来に期待しましょう

それではまた次回