なぜAltJSだったのか、そしてこれからもAltJSなのか [東京Node学園2013]
東京Node学園でライトニングトークをしてきました。下がその資料です。
まずは、スタッフの方々、LTをAcceptして頂き、ありがとうございました(ちなみにPythonではPycharmのコミュニティーエディションを使ってます)。
ちょっと酔っ払って書いてるので、少し「クサい」ところもありますが、お付き合いして頂ければと思います。
全体の感想
まず、自分の話をするまえに、礼儀として全体の感想から。
で、感想なのですが、個人的に一番面白かった発表はECMAScript6が、現状としてどのような仕様になっているかという話でした。実はひっそりと『ECMA-262 Edition5.1を読む』という本を買っていて、ECMAScriptってJavaScriptが元にしている仕様でしょー、くらいの浅はかな理解だったのですが、その浅はかさを吹き飛ばしてくる発表でした。
基本的には、AltJSがJavaScriptに「物足りなさ」を感じている部分をかなり補強している感じで、こういうのも恥ずかしいのですが、かなりイケてました。たぶんそのうちスライドが共有されることを期待していますが、とりあえずの凌ぎとして、下のスライドを見ると雰囲気がわかるんじゃないかと。
基調講演については、恐らく「Node.jsを実プロダクトで採用するのが怖い」となる部分、例えば後方互換性であったり、あるいは安定性の部分であったりするところに、いわゆるちゃんと成長させていくという意志が感じられていいと思ったし、Node.jsを採用できないで見送ってた人たちも、だんだんと「ならやってみようか」と思えるのかなあ、と思った。
ただ、一方でこれはNode.js側の問題ではないのだが、JavaScriptのコード・プラクティスは、なんとかやっと枯らしつつある(『メンテナブルJavaScript』とか『JavaScriptデザインパターン』とか『ステートフルJavaScript』とか、そのあたり)部分なので、そこが今後はポイントになっていくのかな、という気はする。
各種プラクティスに関しては、あとでいろいろ共有されると思うので、そこは外しつつ、全体的に雰囲気がよかったと思う。
特に、飛び入りLTを募る場合においては、酔っ払いながらもライトニングトークに挑戦する人たちが次から次へと現れて、そういうところに、「Node.jsのコミュニティーって雰囲気いいなあ」と凄く好感を持ったりした(個人的に、言語のよさの半分というのは、そのコミュニティーの雰囲気に左右されていると思う。例えば最近ならClojureを書き始めたのもその理由)。
自分もそうだけど、人を傷つけずに自分が傷つくだけだったら、不格好でもいいからやればいいと思うし、そういう場を用意し、そういう雰囲気があるコミュニティーというのは、潜在力があると思う。
なぜAltJS
基本的にAltJSというのは、元々のJavaScriptがイケてないからこそ、「JavaScriptに変換する言語を作ろうや」という話としてあるわけだったんだが、かなりそのAltJS側のアプローチがECMAScript6によって採用されていたので「あれっ」という感じになった。
元々、いろいろな言語を触ることは好きで、遊びでFizzBuzzを書いたり、Hello, World!を書いたりしているし、ちょっとPrologも面白いから書いていた。
Rubyのまつもとさんも引用する話として、サピア・ウォーフ仮説というのがある。サピア・ウォーフ仮説は言語学の話であるが、それについては色々なサイトで解説があるから置いておこう。簡単に説明すれば、要するに「言語は思考に影響する」という話だ。
逆に、プログラミング言語を眺めるということは、それはプログラミング言語に対して「何を見出すか」という人々の問題があると思う。例えば批判されがちなPHPという言語は、個人的には「現実の泥臭さを反映している言語」だと感じている。
AltJSが面白いのは、逆説的に「人々がJavaScriptに対して何を不満に思って、それを解決する手段としてどのようなSyntaxを採用するのか」ということにつきる。よくわからないが、Syntaxというのは恐らくはメンタルモデルとの整合性が関わってくるように感じる。
例えば、GorillaScriptは、あまりにも変な言語で、どう変かというと、Syntaxがマシマシでどうしようもないことになっている。例えば、トークでも紹介したのだが、配列はこんな書き方ができる。
const FizzBuzz = * "Fizz" * "Buzz" * "FizzBuzz"
ちょっとMarkdownっぽい。またトークの都合上、省いたのだけれども、GorillaScriptおすすめのSyntaxはCascadeだ。
let array = [\a, \b, \c, \d, \e] ..push \f ..reverse() ..sort()
これは何をしているのかといえば、要するにarrayにたいして、逐一Methodを実行するというものだ。もちろんメソッドチェインがあるのは知っているが、メソッドチェインは、そのインスタンスがリターンとして何かしらのインスタンスを返すことを前提としている。何もインスタンスを返さない場合、メソッドチェインが出来ない。当然、そのインスタンスに対して副作用をおこしたいときはメソッドを呼ばなければならない。そういうときにCascadeする。
ちなみに、GorillaScriptのCascadeは、ネストも出来る(!?)。
document.query-selector \h1 ..style ..color := \red ..font-size := "200%" ..inner-HTML := "Hello, world!"
こういうわけで、こんな変な言語もある一方で、逆にKalやRoyを紹介したのは、少なくともプログラミング言語というのは、その言語だけではなく、その周辺との関わりによって、パラタイムが変わってくるというのを示したかったからだ。
Kalは、非同期処理のために、ある処理を待ち受けて一回ブロックするSyntaxを採用しているが、これは実はGo言語のgorutineだし、それを参考にしたと言われているClojureのcore.asyncも同じような実装だ。それがKalという形でNode.jsに持ち込まれている。
また、Roy(この作者、かなり面白くて、実はaltjs.orgのホスティングしている。会場のウケもよかった)は、型推論をNode.jsで実装したりしている。elmやFayの場合は、Haskell(あるいはGHC)を使っているが、そもそも関数型的な処理をNode.js上に作ろうとしているところが、凄く他と違うところであり、いいところである。
ちなみに、作者もたぶんいい人で、Replの機能をちょろちょろと手直した自分にコミット権をくれたりしているし、コントリビューターも30人を越え、未だにPull Requestとメンテナンスを繰り返している。また、アメリカのJSCON上では、「Monad Syntaxはコールバック地獄に対する解決になる」ということも述べている。近い将来、ECMAScript7あたりに、コールバックの解決としてMonadに近いものを作れるSyntaxが採用されるかも知れない。
そして、もう一つ、ClojureScriptを紹介したのは、確かに言語ポーティング的なものなら、OCamlをJSにしたり、あるいはScalaをJSにするライブラリはある。しかし、それってScala全体のエコシステムを巻き込んだものではないし、OCamlを巻き込んだものではない。もしかしたらHaxeに近いかもしれないけど、ClojureScriptのいいところは、そもそもClojureのエコシステムの中にあり、お互いが関係しあっているという部分にある。そもそもClojureの公式グループに、ポートされているくらいだ。とするならば、これもAltJSの一つの解答だ。例えば、想像してみよう。RubyのGemsがJavaScriptにそのままコンパイルされるとするなら、かなりイケてると思わない?
これからもAltJS
一言云うとするなら、これらのAltJSについては、プロダクトでつかうことは、あまり考えられない。少なくとも採用するなら、CoffeeScriptか、TypeScriptか、Haxeになると思う。それは、端的に言ってしまえば、プレイヤーと情報量、あとちゃんとした実績あるところがメンテしているからだ。
しかし、にも関わらず、AltJSは追いかけてみると面白いと思うのは、それはECMAScriptの未来であり、そしてJavaScriptの未来である可能性を秘めている、それこそスライドで書いた通り、「原石」だからだ。少なくとも上で紹介したアプローチは、どれも未来に「普通になっても」おかしくないものだと、自分は考えている。
あと、もう一つ。AltJSが流行るのは、JavaScriptが辛いからというのもあるが、もう一つの理由は、JavaScriptが、いざとなったらいろんなアプローチを取り入れられるくらいにはパワフルで柔軟だからだ。例えばAltPHPがあまり出てこないのは、やはりPHPの柔軟性は、JavaScriptに比べれば、というのがあるからだろう。そして、逆説的に、AltJSを見ることで、その問題に対して、どういう解決が考えうるかというのを、Syntaxを通して学べる(もちろん、それがベストじゃないにしても)。
だから、もっと「おれがかんがえたさいきょうのJavaScript」という話はあってもいいし、もしかしたらデザイナーさんが考えたオレオレJavaScriptみたいな話も聞きたいと思った。下の発言じゃないけど、そういう話ができるのはいいことだと思う。
#nodefest Ashekenasもaltjsどんどん作りまくってJS本家のたたき台にしようぜって言ってましたね
— 性格は糞 (@mizchi) 2013, 10月 26
Node.jsも、JavaScriptもどうなるかはわからない。あるいは余計かもしれないが、V8も。しかし、Node.jsは愛されている。それがたぶんパワーなのだろうと思う。
蛇足
ClojureScriptをやりたい人は、こちらのレポジトリを参考にしてみてください。
参考文献

- 作者: 竹迫良範
- 出版社/メーカー: 秀和システム
- 発売日: 2013/09/25
- メディア: 単行本
- この商品を含むブログを見る

JavaScript: The Good Parts ―「良いパーツ」によるベストプラクティス
- 作者: Douglas Crockford,水野貴明
- 出版社/メーカー: オライリージャパン
- 発売日: 2008/12/22
- メディア: 大型本
- 購入: 94人 クリック: 1,643回
- この商品を含むブログ (184件) を見る

メンテナブルJavaScript ―読みやすく保守しやすいJavaScriptコードのための作法
- 作者: Nicholas C. Zakas,豊福剛
- 出版社/メーカー: オライリージャパン
- 発売日: 2013/03/06
- メディア: 大型本
- 購入: 7人 クリック: 31回
- この商品を含むブログ (7件) を見る

- 作者: Addy Osmani,豊福剛,サイフォン合同会社
- 出版社/メーカー: オライリージャパン
- 発売日: 2013/05/25
- メディア: 大型本
- この商品を含むブログ (5件) を見る

ステートフルJavaScript ―MVCアーキテクチャに基づくWebアプリケーションの状態管理
- 作者: Alex MacCaw,牧野聡
- 出版社/メーカー: オライリージャパン
- 発売日: 2012/06/09
- メディア: 大型本
- 購入: 7人 クリック: 356回
- この商品を含むブログ (10件) を見る

- 作者: 古川昇
- 出版社/メーカー: シーアンドアール研究所
- 発売日: 2012/11/21
- メディア: 単行本(ソフトカバー)
- クリック: 7回
- この商品を含むブログ (2件) を見る

おいしいClojure入門 (Software Design plus)
- 作者: ニコラ・モドリック,安部重成
- 出版社/メーカー: 技術評論社
- 発売日: 2013/09/26
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (2件) を見る