追悼 E4X (仮) アウトラインメモ
追悼 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の未来の予感
セキュリティバグ
- セキュリティバグの色々
- hasegawayosuke’s fotolife – 20101116112317
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
- VimperatorのDescriptionパーサ
おわりに
E4Xフォーエバー #RIPE4X twitter.com/saneyuki_s/sta…
— さねゆき (@saneyuki_s) May 19, 2013
メモ
お知らせ欄
JavaScript Primerの書籍版がAmazonで購入できます。
JavaScriptに関する最新情報は週一でJSer.infoを更新しています。
GitHub Sponsorsでの支援を募集しています。