🌐

ES4の失敗 と TypeScript

2021/02/07に公開

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

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のジェネリクスは型チェックのみに利用されています?
コンパイラ(トランスパイラ)でJSとして妥当な形に変換されているのかも。)

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 から 約13.5年、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