ECMAScript 4 の概要

ECMAScript Edition 4 の language overview whitepaper が出てる。

Proposed ECMAScript 4th Edition Language Overview

簡単に言うと、既存のスクリプト言語にできることは全部詰め込んだ感じ?

Python, VB Script 辺りは確実に意識してて、それに C/C++ 系の {} 文化を盛り込んだら C# 3.0 っぽい雰囲気も出てきたような。それから、(JavaScript は元々結構そうなんだけど)関数型言語的な機能も少々。

正直、詰め込みすぎ感が否めない。
いろんな言語の面白そうな機能を取り込んでるのはよさそうなんですけど、ところどころ、あんまりいい感じに統合できてるようには思えないんですよね。クラス関係の仕様はかなりいい感じだと思うけど、例えば、var と let、for-in と for-each-in みたいに違いの微妙な構文もあって混乱しそう。それに、for-in ループの終了条件を、StopIteration 例外を throw する形で実装するってのが嫌。
あと、とにかく言語仕様が馬鹿でかいのが不安。ユーザが使いこなせるのかって意味でも、こんなのがブラウザに載るのかって意味でも(サポートされる率的にも互換性・性能的にも)不安。

新規の仕様が多すぎて、これを ECMAScript って名前で出すのも微妙な感じ。いっそ、JavaScript ベースじゃなくて、Dynamic C# みたいな言語作った方が多くのプログラマにとっては幸せな気もする。まあ、用途を考えると JavaScript の正統後継者って路線が一番普及を見込めるんだろうけど。

以下、ざっと overview.pdf を眺めてみたのをまとめてみる。

  • (静的言語と比べて動的言語では遅れてる)構造化・OOP 機能の充実
    • クラスの継承、メソッドの上書き
    • 名前空間
    • interface
    • プロパティ(setter/getter)機能
    • 構造化例外
      • Java, C# 的な try-catch-finally 構文
  • 可能な限り静的型付け(+型推論)、必要に応じて動的型付け
    • メンバ固定の class と、動的にメンバを足せる dynamic class を両方定義可能
      • dynamic class には、meta プロパティ(Python の __getattr__, __setattr__ みたいなの)も定義可能
    • parameterized class 機能(C# でいうところの Generics)もある
    • 静的クラス C を定義すると、動的クラス C' が暗黙に作られて、C のインスタンスは C' としても利用可能
    • prototype(動的に上書きされることを前提としたメソッド)
  • イテレータ
    • C# で言うところの GetEnumerator, MoveNext 相当のものを実装すると for-in 構文が使える
    • move() メソッド(C# の MoveNext() + Value 相当)中で、StopIteration 例外を throw することで反復終了
    • generator(C# 2.0 のイテレータ相当の機能、yield)
    • for-in と for-each-in
      • for-in は Enumerable 向けの列挙、get() メソッドでイテレータを取得
      • for-each-in は Itemizable 向けの列挙、getValues() メソッドでイテレータを取得
  • 関数型言語的機能
    • var v = function fact(n) n < 2 ? n : n * fact(n-1)
      • 値を返す1文だけの関数は {} と return を省略可能
      • closure がちゃんと再帰呼び出し可能
    • tail call の最適化がかかる
    • 変数の型に基づいて条件分岐する switch type
  • その他
    • {x, y} みたいな感じでレコード(匿名クラス、tuple)を作れる
    • 変数宣言時、変数名の後ろに ! をつけると、常に非 null を保証(non-nullable)
      • 逆に、? をつけると nullable に
    • ... で可変長引数
      • ...args とすると、args が可変長引数を受け取る配列型の変数に
    • VB っぽい with statement あり
    • array comprehensions
      • [i * i for (i in naturals(10))] みたいなやつ
    • Destructuring assignment (配列代入)
      • [x, y] = [y, x + y] で、x1 = y; y1 = x + y; x = x1; y = y1 扱いの代入
    • let キーワードは、関数型言語みたいな immutable 変数定義じゃなくて、単に変数のスコープをブロック内に限定するキーワード