[2015-02] 最近のJavaScript AST標準化の動き
以前書いた記事からのどんな感じの動きがあったのかまとめたものです。
2015年の1月前後の内容が中心です。
前回のに比べ、JavaScriptのエコシステムの根幹でもあるパーサやASTの仕様まわりについての動きが最近活発なので、その辺を中心にまとめています。
RReverser
RReverserさんはここ最近のJavaScript ASTに関係するところならどこでもみかけると思うので紹介。 主にacornのコミッターでもありますが、後ほど出てくるESTreeやBabelなど色々なところで活動しています。
またasterというASTの効率的に処理できるツールチェインを出したりしています。
AST周りでよく見る人やパーサをいかにまとめてあります。
estools
estoolsはASTを使って作るツールを補助するライブラリなどをまとめたGitHub Organizationです。
元々はConstさんが色々作ってたツールのリポジトリをまとめたいという話になってできたものです。
escodegen の module とか esutils とかどっか organization に移したいんですけど, なんかいい名前募集で
— utatane (@Constellation) November 22, 2014
6to5
もう大分使われるようになってきて有名ですが、6to5(現Babel)が出てきたのが2014年10月8日ごろです。
ES6のコードをランタイムなしのES5に変換するツール。
SourceMap対応、BrowserifyからGrunt等のpluginが用意されてる。
他のES6コード変換との比較表も載せている "sebmck/6to5" https://t.co/iATEMW1fHk
— azu (@azu_re) October 8, 2014
大体初日に20コぐらいissueとか立てたり立ったりしましたが、その日のうちに全部closeされるようなスピードでした。 Babelとなった今でもそのペースが落ちずに進んでいるので、すごい勢いで開発されてることがわかると思います。
Espree
EspreeはESLintプロジェクトでES6対応やJSXのオプショナルサポートをするためにEsprimaをフォークしたものです。
Espreeがリリースされた頃(2014年12月6日) Esprimaは動きが遅かったのと、ES6の対応はHarmonyブランチで行われていましたがComment Attachのアルゴリズムの違いもあって、masterブランチのforkとして作成が開始されました。(Esprima 2.0でHarmonyはmasterにマージされています)
ESLintはASTだけではなく少し細かい単位のtokenなどにも依存したLintを行っているため、acornなど別のパーサへ移行することが難しいのでforkした感じでした。
なぜforkしたのかはespreeのREADMEや[2015-01] 最近のASTパーサの動きなどを見てみるといいかと思います。
基本的にはEsprimaが吐き出すASTと互換性を持ちながら、ES6のサポートなどを追加していってます。 Esprimaと相互参照するIssueも多く、ライブラリとしては別ですがAST的には大体同じです。 (Espreeはどの機能/構文をパース可能にするかがオプショナルになっているのでかなり細かい作り)
Shift AST Specification
- Announcing the Shift JavaScript AST Specification
- A Technical Comparison of the Shift and SpiderMonkey AST Formats
Esprimaの@ariyaやCoffeeScriptReduxの@michaelficarraがいるShape SecurityからShift ASTというASTの仕様策定と実装が2014年12月23日に公開されました。
基本的には、Esprimaなどで使われていてデファクトだったSpiderMonkey ASTから変換できる程度にはベースは同じですが、ES6などの対応を含め進められています。(まだ進行中の仕様です)
Shift ASTの仕様策定、パーサ、ジェネレータ、バリデータ、SpiderMonkey ASTからの変換ツール、Javaの実装が公開されています。
SpiderMonkey ASTはもともとFirefoxのJavaScriptエンジンであるSpiderMonkeyの内部表現として始まったため、ツールとして扱うASTとしては微妙な部分などが存在しました。
また、SpiderMonkey ASTはES6への対応やドキュメントの更新が疎かになっていたため、各パーサがES6対応をする際に参照するものがなかったのもひとつの理由です。
詳しくはThis doesn't exist already?にかかれていますが、その扱いにくくなっているASTの部分の整理などをする目的もあります。
「SpiderMonkey ASTからShift ASTに乗り換えるべきなの?」という疑問も生まれるかもしれませんが、現在ある意味安定してるSpiderMonkey ASTを扱った方がツール間の連携も上手くいくので、実験目的以外ならShift ASTをまだ使う理由はないと思います。
進行中の仕様なので実験してIssueとかを立てたりするのは、歓迎されると思うので後述するESTreeと共に見ていくのがいいと思います。
jQuery Foundation adopts Esprima | Official jQuery Blog
2015年1月26日 上記の記事で書かれているように、ariya/esprimaがjquery/esprimaへとリポジトリが移管されました。
@ariyaがEsprimaの開発を辞めたという感じではなく、よりパーサ周りの開発を活性化、集中化するためにjQuery Foundationに移管されてjquery/esprimaとなりました。
Esprimaのプロジェクトリーダは変わらずAriyaです。
[2015-01] 最近のASTパーサの動き
ここまでのASTの話をパーサ中心にまとめたスライドです。
EsprimaがjQuery Foundationに移譲されたばかりの時でまだはっきりとした動きはわかってなかったので、2015年1月までの現状をまとめたという感じです。
ここまでが[2015-01] 最近のASTパーサの動きのスライドの振り返りです。
jQuery Foundationの手腕
先ほども書いていましたが、JavaScriptのパーサで最も使われてるEsprimaがjQuery Foundationに移管されました。
移管後の2015年2月4日のミーティング Esprima Meeting Agenda - Google ドキュメント で、移管の目的について以下のように書かれています。
- Why the jQuery Foundation adopted this project
- Lots of fragmentation in this task space
- Effort being spent in duplicated efforts
- Not seeing progress on important common needs
- Philosophy - What the Foundation would like to encourage
- Be the “main fork” for a JavaScript parser in JavaScript
- Have a multi-person core team run by consensus
- Be open to contributions from the community
- Do work and make decisions in public
[2015-01] 最近のASTパーサの動きでも登場していたJavaScriptパーサが色々あることからわかるように、2015年1月をピークにパーサ周りでは労力が分散していました。(同じ機能について各パーサで考えて実装したり、estools/escodegenがその分散を吸収してたり)
実際にjQuery Foundationが間に入ったことで開発速度は大幅に改善されていて、後述するESTreeなどのAST標準化作業も始まり、jQuery Foundationがやったことは大きかったと思います。
ここまででjQuery Foundationがやったこと
- Esprima 2.0のリリース
- 主なコミットはAriya
- EsprimaがGoogle CodeからGitHub Issueを中心に回るように
- @dhermanを召喚してESTreeの作成
- Ariyaを含めEsprimaについての定期ミーティング
- Esprima Meeting Agenda - Google ドキュメント アジェンダ
- IRC logsにログ
- @ariya(Esprima/Shift AST)、@ikarienator(Shift AST)、@michaelficarra(Shift AST)、@mikesherov(JSCS/jQuery Foundation)、@jeffmo(esprima-fb/facebook)、@nzakas(espree/ESLint)が主となって定期的にIRC/Skypeでミーティングをやっています
この中でもAST全体で見て大きいのはあやふやだったMozilla ASTのドキュメントを整備するESTreeというプロジェクトを作ったことだと思います。
ESTree
基本はSpiderMonkey ASTと同じものだと思ってもらって問題ないですが、SpiderMonkey ASTをそのまま維持しつつ、ES6についてなどの未定義だった部分の仕様を整理していくコミュニティプロジェクトです。(仕様といってもECMAみたいな標準化団体としてやったりしてるわけではないです)
SpiderMonkey ASTじゃなくてESTreeという名前になってるのには、あまり大きな意味はなくて単純にSpiderMonkeyの内部表現以外でも使われる仕様ということなので、ESTreeという名前に変わった感じだと思います。
@rauschma Note that this is not a "new" standard, but simply the original SpiderMonkey standard (https://t.co/LObMtM6xEq) now on Github.
— Michael Ficarra (@jspedant) February 15, 2015
Participating Membersには以下のメンバーが主となって議論していることが書かれています。
- Dave Herman (Mozilla)
- Ingvar Stepanyan (Acorn)
- Mike Sherov (Esprima)
- Michael Ficarra (@michaelficarra)
- Sebastian McKenzie (Babel)
先ほどのEsprima Meetingのメンバーを合わせると、JavaScriptパーサに関係する人はだいたい関わってることがわかると思います。
パーサの実装に関わる人が仕様を決めるオープンなコミュニティができたことで、今後パーサ間でどのようなASTを吐くかのズレなどが少なくなっていくと思います。(少なくともECMAScriptの範囲では)
ESTreeとShift ASTの目的の違い
Shift AST SpecificationとESTreeはどちらもASTの仕様を決めているのでどちらも同じように見えます。この2つの違いは何でしょうか?
Shift ASTの@michaelficarraさんが次のように書いています。
@py RE: ESTree, I think it's great that there's finally a canonical spec, but I look at it as legacy; I'm confident Shift will be the future
— Michael Ficarra (@jspedant) February 21, 2015
先ほども述べたようにESTreeは新しい仕様ではなくて、既存のSpiderMonkey ASTで未定義だったES6についてを後方互換性をできるだけ維持しながら、コミュニティレベルで標準化していくプロジェクトです。
現在作られてるパーサの結果を仕様に落としたりしてるので、既に動いてる仕様です。
一方、Shift AST Specificationが現在のASTの扱いにくい部分がある問題などを修正した未来の仕様を目指していて、後方互換性よりもその修正を優先しています。
また、SpiderMonkey AST(ESTree)からShift ASTに変換するモジュールも公開しています。
Shift ASTの人もESTreeの目的は分かって一緒にやっていて、今すぐ使える仕様が複数存在するという感じではないので、基本的にはESTreeを参照してツールが作られています。
Babel
2015年2月15日に6to5がBabelへとリネームされました。
Babelはbabel/acorn-babelというacornをベースにJSXやES7+の対応をしているパーサを使っています。
そのため、@sebmckも先ほど紹介したESTreeでのASTの標準化にも関わっていて、特にES6やES7+を中心にコミットされています。
おまけ: mdast
これはJavaScriptのASTではありませんが、MarkdownをパースしてASTにしてくれるmdastが最近公開されています。
JavaScript ASTと同じようにNodeに分けられて、それぞれのNodeの位置情報もあるため色々使い道がありそうです。 ASTからMarkdown文字列を生成することもできるので、Markdownツールのエコシステムとしてかなり有用な気がします。
今後の見どころ
2015年2月26日現在のAST周りの動きについて書きましたが、まだまだ決めるべきことは色々あると思います。
- ESTreeによる標準化作業
- ASTより粒度が小さいtokenの扱い
- 以前CST(getify/concrete-syntax-tree)というのが考えられたけど頓挫した
- 拡張仕様(JSXなど)をどう扱うのか
この記事ででてきたリポジトリやJavaScript AST Links.で紹介してる人などを追ってみると良さそうな気がします。
お知らせ欄
JavaScript Primerの書籍版がAmazonで購入できます。
JavaScriptに関する最新情報は週一でJSer.infoを更新しています。
GitHub Sponsorsでの支援を募集しています。