JGGUG名古屋Groovy DSL勉強会 参加してきた #jggug

5月30日に 株式会社ニューキャスト様で行われた JGGUG名古屋Groovy DSL勉強会に参加してきました。

事の始まり

この勉強会は、以前モスクワにて行われた Cloud Foundry Open Tour 2012のモスクワ開催*1で、Groovyのproject managerであるGuillaume Laforgeさんが発表された、「Going to Mars with Groovy Domain-Specific Languages」について読み、考えたり、コードを作成してみたりする会でした。ニューキャストの方達は、数人でモスクワまで言ってお話を聞かれたみたいですね。 すごい行動力です。

スライド


DSLについて

まず、私に取っては DSLとは何か?」からスタートしなくてはなりませんでした。今まで何回かネットで調べたことはあったのですが、何となくなイメージしかつかめておりませんでした。ですが、上記のスライドと、@tyamaさんにいろいろと教えて頂いたおかげで、DSLについてある程度の理解をすることができました。まず、それを説明します。

DSLを一言で言うと、 ある環境(ドメイン)で利用される、記述者の理解しやすい形で記述できる固有言語と言えます。その中にはいくつかのポイントがあります。
  • プログラムの都合で書かなくてはならない記述をできるだけ排除する。*2
  • 自然言語や音符など、中身にはこだわらない。
  • 場合によっては必要のない部分にアクセスできない様に、セキュリティ対策を行う。
そうやって考えると、私たちプログラマの回りにはDSLが多くあります。SQLやHTML、XMLなんかもその類でしょう。おもしろかったのは、音楽で使う楽譜もDSLといえるようです。*3上記のスライドの例では、 「火星を探索するロボットに対するDSLについて話がされています。その中でも、 「プログラム上必要なコード」を徹底的に排除し DSLとして必要なコード」だけに徹底的に絞っていくお話になっています。「Groovyのこんな機能を使ってこういったDSLを動かせるプログラムを作成できますね。」というスライドになっています。

DSLを実現するためのGroovyのテクニック

  • GroovyShell
  • 上記の資料の47スライド目あたりに解説がありますが、DSLを読み込んで実行する際に、GroovyShellを使って、あらかじめ必要な関数等をバインドしておき、DSLであるGroovyスクリプトを実行する事ができるようです。
  • Compilatoin customizer
  • コードのコンパイル時に様々な事を織り込んで動作させる仕組みの様です。大きく分けて以下の3つに分かれます。
    1. Import customizer
    2. 上記スライドの53スライド目あたりに説明がありますが、コンパイル時に使用するimport対象のクラス等をimportする書式を外に出せるようですね。
    3. AST transformation customizer
    4. 上記スライドの54スライド目に説明があります。GroovyにはもともとAST変換という機能が備わっていますが、その機能をコンパイル時に織り込む事ができる様ですね。例では、Loggerを織り込んでいます。
    5. Secure AST customizer
    6. 上記スライドの59スライド目あたりに説明があります。これは、すでにあげた 「場合によっては必要のない部分にアクセスできない様に、セキュリティ対策を行う。」に値します。59スライド目の例では、Groovyの言語仕様の一部である closureの使用を制限しています。また、演算子や使用できるクラスを制限したりして、DSLとして使用で切る部分だけに絞ることができています。 必要な機能ですね。
  • Command chain
  • 上記スライドの112スライド目あたりに説明がありますが、Groovy1.8からできるようになった、 ドットや括弧を省いて、オブジェクト.メソッドのような構造を表すことができる機能の様ですね。この説明では、スピードを指定する際に使用し、DSLとしては不要なドットや括弧を省いています。
スライドはまだまだ続きますが、以降はスライドの説明に移譲します。

まとめ

何よりDSLの考え方がはっきりしたのが、私にとってはありがたい話でした。なんとレベルの低いことか^^;集まられていた皆さんに聞いて見たところ、DSL自体は何かのプログラムの書籍などから生まれた物ではなく、一般常識と言えるレベルの様です。*4また、Groovyの柔軟さもよく分かりました。

参考

*1:直リンク張りたかったけど、ページが404エラーになっている。20120531現在

*2:そういった記述がなくても動くようにする

*3:コンピュータ的には、midiの方が理解しやすいかもしれません。

*4:自分、まだまだっす。