🌐

ES4の失敗 と TypeScript

に公開

※ この文章は、ベータ版です。

JavaScript(ECMA Script)には、静的型付?言語化しようとして失敗した歴史があります。

その失敗を教訓として活かして、TypeScript が作られたのだと思います。

ES(ECMA Script)4の失敗

ESベースのActionScript3(Flashの開発言語)の仕様をベースに、静的型付?・クラス・ジェネリックスetcを導入しようと策定されて
いたものの、仕様の機能の取捨選択のコンセンサスが取れず、仕様がまとまらず、ES4.xは欠番になりました。

ActionScript3自体は、擬似的に静的型付のできる動的型付言語にみえます。(今でも、言語仕様?やサンプル・プログラムなどはネット上に転がっています。)

静的型付論者がいて、静的型付の発想から出た機能を提案、実装可能かの判断のないまま、それらが仕様に盛り込まれた結果、擬似的(な)静的型付のはずが、静的型付でないと実現できない機能がてんこ盛りになってしまい、動的型付でも静的型付でも書けるようにみえる、完全に実装無視なOverview (概要)になっていった感じがします。。。

ジェネリックス:
 静的型付でないと無理。
 (型チェックのみに利用なら、疑似的(な)静的型付でも可能?
 TypeScriptでは、コンパイラ(トランスパイラ)で妥当な形に変換している、のではなく、削除しています。)
関数(メソッド)のオーバーロード:
 静的型付でないと無理。疑似オーバーロードは可能。
 (TypeScript では、可能ですが、これはコンパイラ(トランスパイラ)により、擬似オーバーロードに変換されています。)

今までに、動的型付でも静的型付でもある言語は(机上以外で)登場したことはないです。

Overview(概要)の機能の多くは静的型付でないと実現できない機能で、ES4自体が動的型付→静的型付しないと成立しない仕様にみえます。

動的型付のままで行くか、静的型付に移行するか、で、互換性を維持できない静的型付への移行は、過去のコードを引き継げないため、根強い反対にあい、ES4自体、静的型付前提の機能がメインであったため、頓挫したように思えます。

後に、静的型付・ジェネリックス以外のES4で予定されていた機能のうち、クラスetcを盛り込んだES2015(6)が策定、勧告されています。

ECMAScriptの仕様策定は互換性重視です。
(ES6で導入されたclassもシンタックス・シュガー。)

ES4は、型付を強制しない形での緩やかな(動的型付を維持したままのオプション的)型付導入(見た目は静的型付、中味は動的型付、型アノテーション)なら策定に成功したかもしれないけど、動的型付→静的型付しようとして失敗した感じです。

「見た目は静的型付、中味は動的型付」な疑似的(な)静的型付は、以前は採用言語が(ほとんど?)なかったので、(以前は)ESの標準仕様での採用は難しい感じでしたけど、TypeScriptが成功してる今なら、ESの標準仕様での採用、ありえるかもしれません。

疑似的(な)静的型付、では、付加された型は、型チェックのみに利用され、実行時には無視されます。

動的型付言語のまま、擬似的に静的型付のできる言語はいくつか、あります。型アノテーションを導入したPython、タイプヒントを導入したPHP。

TypeScript

ES6のスーパーセットになっています。

トランス(コン)パイラでJavaScript(JS) に変換してから実行する「記述は(オプショナルな)静的型付、実行は動的型付」な言語です。

疑似的(な)静的型付、といえると思います。

型アノテーションによる型付を強制しない形での緩やかな型付になっているのが奏功している気がします。

付加された型はコンパイラ(トランスパイラ)でのコンパイル時の型チェックのみに利用されています。

(JavaScriptへの変換時に型情報は失われます。コンパイラのオプションでd.ts(型定義ファイル)を作成して型情報を残しておくことはできます。)

(TypeScriptのジェネリクスは型チェックのみに利用されています?
コンパイラ(トランスパイラ)で削除されています。)

TypeScriptのES仕様の拡張は、ES4とは違い、JSに変換することを前提に、動的型付言語であるJSの枠組みを保てる形で拡張されています。
(ES4の失敗の轍は踏まないようにしているようにみえます。)

JavaScriptの動的型付ワールド(互換性)を保ったまま、開発時には型付できる、のが、TypeScriptの成功の大きな要因だと思います。

Types as Comments

JavaScriptの標準仕様 (ES) の策定を行う ECMA の TC39 に型付を強制しない形での緩やかな型付導入 を行える仕様「Types as Comments」が提案されました。

マイクロソフト、JavaScriptに型宣言を追加しつつトランスパイラ不要の「Types as Comments」をJavaScript仕様策定会議のTC39に提案へ

https://www.publickey1.jp/blog/22/javascripttypes_as_commentsjavascripttc39.html

TypeScriptでの実装実績のある仕様なので、TC39 での議論により多少の手直しが入るかもしれませんが、割とすんなりと ES 仕様に採用されるのではないかと思います。

ES4 がキャンセルされた 2008/08 から 幾星霜、JavaScriptの動的型付ワールドに 型付 の足音が近づいてきています。

Type Annotations

https://github.com/tc39/proposal-type-annotations

「Types as Comments」→「Type Annotations」に改称されています。

割とすんなりと ES に採用されるかも、と書いていましたが、現在、ECMA TC39 の仕様策定の Stage1 です。

現在の実行環境、構文解析まわり、に、かなり?手を入れることになる仕様なので、他の優先すべき仕様(案)が優先されていて、仕様の検討&実装によるフィードバックがあまり進んでいないようです。

TypeScript には明文化された仕様(書)がないので、ESで Type Annotationsを導入するには、TypeScriptでは明文化されていない仕様を明文化し、JavaScriptランタイム間での互換性を仕様として担保できるようにする必要があります。(Proposalに書かれている内容では、不十分です。)

(TypeScriptでは、明文化された仕様(書)がないため、tsc(公式TS→JSコンパイラ)互換コンパイラを作成中のPJでは、tscのソースコード・挙動を解析し、同じ挙動となるように実装していっている模様。)

Discussion