追悼 E4X (仮) : ATND に参加してきたメモです。

(bug/バグはチケット的な意味で使われてます)

E4X って何? – @makoto_kato

  • SpiderMonkeyからは削除済み

JDK 6

  • 対応しないよ的なコメントあり

ActionScript 3

  • Flash 9+
  • AIR 1.0+

JavaScript Core

  • 2005年にbugが上げられてたけど放置

V8

  • 2009年にbugがあげられて、not standard!!との返答

実装しなかったエンジン

  • V8
  • Webkit
  • IE
  • Opera

実装したエンジン

  • Firefox
  • ActionScript

時代背景

なんでE4X実装されたのか?

  • SOAP
  • サーバのやり取りはXMLでやろう!
  • XHTML 1.0

時代的に

  • XMLはウェブサービスで使われる重要なフォーマットだった
  • HTMLもXMLへ移行しようとしてた

XHTML仕様書のcontirbutedにある企業の残存率とE4Xの未来の予感

セキュリティバグ

E4Xの使い方

  • XMLオブジェクトを作成
    • new XML()
    • ここまでは良かった気がするね
  • XMLリテラル < – ここから何かおかしいね
  • a.*
  • for each

フィルタ

a.($id == "abc")

idがhogehogeのものを取り出す

Node.js

  • V8が実装しないなら使えない

E4X とパフォーマンス

  • E4Xは遅い
  • 今の正規表現はJITになってる
  • E4Xにパフォーマンス求めるならJITが必要な気がする

Vimperator での E4X @teramako

  • ヒアドキュメント
  • XMLテンプレート

として利用されてた

ヒアドキュメント的に

  • スタイルシートのテキスト生成

スタイルシートなどに使ってた

XMLテンプレートとして

  • XMLオブジェクト — DOM変換 -> DOM
    • コマンドライン出力
    • 補完リスト生成
    • Hit-a-Hintの要素生成
  • XMLオブジェクト – - XSLT -> DOM

便利メソッド

  • template.map()

E4X 廃止

ES.nextのTemplateLiteralへ

  • ES.next として提案されていた構文
  • Template literal(Quasi-literals)へ
  • パーサーを書いて、動的に生成する
  • E4Xからの変更が小さくて済む

コンバート要件

  • プラグインファイルの様に動的に読み込まれるスクリプトもある
    • 独自プロトコルを使用
    • liberator://template を使ってコンバートして詠み込む
    • 一種のリダイレクト的な感じで動的に変換

まとめ

  • Vimperator はE4Xをディープに使ってた

E4X昔話

  • @ を属性値に入れたりすると勘違いする
  • 勝手にできる謎の名前空間
  • function:: というMozilla独自実装
  • __defineGetter__ なおかしな挙動
  • E4Xのパフォーマンスについて
  • DOM APIとE4Xのパフォーマンスの比較
  • 正しいXMLとして大体保証されるもの(制御文字などはあれかも)を吐き出してくれるE4X

Esprima 上での E4X parsing と ECMA 357 spec bugs – @Constellation

スライド : E4X parser implementaion & ECMA 357 spec issues // Speaker Deck

ECMA357 パース問題

  • Final draft 2nd edition of ECMA-357 – Ecma-357.pdf
  • パースがとてもむずかしい
  • XMLWhitespaceがトークンになってる(whitespaceがトークンだ!!)
  • laxerのモードを変更してE4Xに対応するしかないようなレベルの仕様
  • 特定の<がきたらこれE4Xだ

WhiteSpace

  • <XMLTagContent XMLWhitespace /> という感じにワカれてる
  • whitespaceの扱いが独特

Special Nodes

  • コメントをXMLComment というオブジェクトとして保持する必要がある
  • CDATA section
  • < ?xml ...>
  • 特殊な並びをしてるので1つのトークンとして持っていける

new tokens

var encodingStyle = message.@soap::encodingStyle;

order.@*;

:: 、 @ 、 . 、 * などの新しいtoken

syntax extention

  • Ordinary mode “`::“

statements

default xml namespace = "";

for each (var p in e.employee){}

ステートメントが増えた

XML

  • スキャナモードを変更する必要が出てくる場面

< がきたら、スキャナモードを変更する

スペースをtokenとして必要になるので、

var xml = <customer>
;

< がきたら、E4Xモードになってspaceのために1つ戻ってスキャンする。

XMLEscape

<customer>{var}

{}がきたら、ECMAScriptモードに戻してスキャン

function::

function:: だけは特別

// NG
default::test;
// OK
function::test;

Esprima with E4x

  • 仕様に書いてあるsyntaxを全てサポートしたEsprima
  • Esprima: E4X
  • 仕様書自体にbugあり

私とE4X – @nanto_vi

  • Mozilla Relase Note @ 新聞

E4X と autovivification – @nanto_vi

XMLオブジェクトのプロパティ代入

  • 存在しないプロパティへ文字列を代入すると、自動で新たな要素が作られる
  • [[Put]] によるもの 入れ子になった要素が一度に作成される

  • XMLListオブジェクトの[[ResolveList]] によるもの

    [[ResolveValue]] 内部メソッドは、再帰的に呼ばれることもある

Perl

Perl も存在しないハッシュ値などに代入すると入れ子のハッシュを作れたりする

autovivification という機能という名前になってる

E4X

::get 名前空間を使ったautovivification の応用

他LT

  • [はてなのE4X][10]
  • VimperatorのDescriptionパーサ

おわりに

メモ

[10]: http://b.hatena.ne.jp/nanto_vi/?fragment=main ""