17. Flash と ActionScript
Macromedia (後に Adobe が買収) の Flash語 はリッチインターネットアプリケーションを構築するための言語の選択肢として 2000 年代初頭には Java と JavaScript に並ぶ人気を持っていた。元々 Flash はタイムラインベースのアニメーションソフトであり、その基礎は Jonathan Gay [2006] によって開発された。Flash はアニメーションベースのアプリケーションをバイナリファイルにコンパイルするビジュアルオーサリングツールとして構成され、そのバイナリファイルは Flash Player によって解釈される。Flash Player はブラウザのプラグイン拡張 API を使ってブラウザに組み込まれるプレイヤーコンポーネントである。最も広く普及した時期には、事実上全てのブラウザユーザーが Flash Player をインストールしていた [Adobe 2013]。
初期の Flash でアプリケーション作成は主に視覚的ツールで行われたものの、様々なタイムラインイベントへの応答を定義するために短いテキストで「アクション」を記述する機能は存在した。Gary Grossman は 1999 年 5 月にリリースされた Flash Version 4 で Flash のアクションを JavaScript に似た構文を持つ動的型付けの簡単なスクリプト言語に進化させた。さらに 2000 年の Flash Version 5 リリースでは、このスクリプト言語が「ActionScript」という名前の ECMAScript 3 の方言になった。ActionScript語 1.0 は ES3 が持つ文形式のほぼ全てとプロトタイプベースのオブジェクトをサポートするものの、正規表現はサポートされず、変数アクセスの式しか評価できない非標準の eval
関数を持ち、他にも細かな意味論の違いがいくつか存在する。ただ ActionScript のコードはコンパイルされて Flash Player 環境でのみ実行されるので、意味論が ECMAScript 仕様に厳密に準拠していなくても問題は起きなかった。例えば ActionScript 1.0 において var
宣言が持つスコープは宣言を囲む最も内側の関数ではなく最も内側のブロックとなる。
ActionScript 2.0 は Flash MX 開発環境と Flash Player 6 のコンポーネントとして 2003 年に公開された。ActionScript 2.0 は ActionScript 1.0 を拡張したものであり、クラス宣言、インターフェース宣言、宣言に対する型注釈、他のスクリプトで定義されたクラスへアクセスするための import
文が追加されている。型注釈、クラス宣言、インターフェース宣言の構文は ES41 (JS2) 仕様のドラフトにあるものと多少似ていたが、意味論は大きく単純化されていた。型注釈は省略可能で、型検査は「コンパイル時にのみ有効な機能」だった [Macromedia 2003]。型注釈を与えると Java 風の名前的な型検査がコンパイル時に行われ、型情報はコードが生成される前に消去される。ActionScript 2.0 は ActionScript 1.0 と同じ仮想マシンを使っており、実行時の安全性検査は基本的なものしか行わない。その検査に引っ掛からない限りプログラマは名前的型システムの規則を破る形で動的にオブジェクトを改変できた。
2003 年、ウェブ開発で Flash が広く採用されたために大規模で複雑な ActionScript アプリケーションの作成が始まっており、一部のアプリケーションではパフォーマンスの問題が起こっていた。当時の ECMAScript の設計者および実装者と同じように、Macromedia チームはパフォーマンスのボトルネックは動的型付け (特にプリミティブ型の動的型付け) であると考えて1おり、ActionScript ランタイムに静的型付けを追加する方法を探っていた。ちょうどこのころ、1998 年から TC39 の委員を務めた Jeff Dyer が Macromedia に加わる。Dyer は TC39 が静的型付けについて Macromedia と同じ視点を持っていたのは確かだと語った。仮想マシンベースの言語における静的型付けに関する広く共有されたこの意見は、静的型付けを持つ Java 仮想マシン (JVM) の設計に大きく影響を受けている。Jonathan Gay と Lee Thornason が手掛けた Maelstorm プロジェクトは Macromedia が行った実験であり、JVM を Flash に統合することで ActionScript の静的型付けバージョンのランタイムとして JVM が使えるかどうかを検証するために行われた。この実験は十分成功し、Macromedia は Java 2 Micro Edition (J2ME) の JVM を Flash で使うためのライセンスを取得しようと Sun に接触した。Macromedia が J2ME を使おうとしたのは、通常エディションの Java ランタイムが Flash のウェブダウンロードに組み込むには大きすぎたためである。しかし Macromedia が提案した J2ME の用途は Sun のライセンス戦略と合っていなかった。
Edwin Smith はスカンクワーク2で概念実証を目的とする仮想マシンをいくつか作成した。これらの仮想マシンがきっかけの一つとなり、Macromedia は AVM2 [Adobe 2007] と呼ばれる静的型付けの JVM 風仮想マシンを独自に作成し、そこで ActionScript の新しいバージョンを実行することを決断した。新しい言語は Gary Grossman, Jeff Dyer, Edwin Smith によって設計され、ES41 (JS2) の仕様に大きく影響を受けた。ただし JScript .NET と同様 ActionScript 3.0 は ES4 の設計を単純化したものであり、JS2 よりは動的性が小さく、JScript .NET と異なり .NET の型モデルの制約を受けなかった。また過去から受け継いだ後方互換性の問題が大きくないという点でも ActionScript 3.0 と JScript .NET は似ていた。将来の Flash は ActionScript 3.0 をサポートする AVM2 と ActionScript 1.0/2.0 をサポートする AVM1 の両方を搭載して出荷されることになった。新しいバージョンの ActionScript と新しい仮想マシンを作る取り組みは完了まで 3 年以上を要した。ActionScript 3.0 と AVM2 は 2006 年に Flash Player 9 のコンポーネントとして発表され、最終的には 2007 年に出荷された。この取り組みが完了するころには Adobe が Macromedia を買収しており、Flash は Adobe Flash になっていた。