Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Java: DSL としての可能性 #渋谷java

Java: DSL としての可能性 #渋谷java

第五.五回 #渋谷java での発表、「Java: DSL としての可能性」の資料です。AWS の CloudFormation のテンプレートを Java の DSL で表現できるようにしてみました。

E77287648aff5484ac7659748e45c936?s=128

KOMIYA Atsushi

April 05, 2014
Tweet

Transcript

  1. Java: DSL  としての 可能性 渋⾕谷Java #5.5 2014.04.05 at BizReach KOMIYA

    Atsushi ( @komiya_atsushi ) 1
  2. ⾃自⼰己紹介 2

  3. KOMIYA Atsushi @komiya_atsushi 3

  4. 分析⼒力力をコアとする マーケティングソリューションカンパニー AWS から機械学習まで、⼿手広く よろずやなエンジニアリングしてます 代々⽊木の緑⾊色の会社 4

  5. #TokyoWebmining 事務局 分析/機械学習/アドテク等のネタで お話していただける講師を募集中デス! 5

  6. by Tantek Çelik http://www.flickr.com/photos/39039882@N00/191494668/ 今⽇日のテーマ: DSL 6

  7. 本⽇日はいつにも 増してネタトーク 成分⾼高めです! 7

  8. DSL (Domain Specific Language、ドメイン特化⾔言語) • 特定の問題やタスクを解決するために 特別に設計された⾔言語 • Ruby / Python /

    Java / C++ などの汎⽤用的 な問題解決のためのプログラミング⾔言語と は異異なる • DSL の⼀一例例 • Rake (Ruby) • Make • 正規表現 • CSS 8
  9. DSL (Domain Specific Language、ドメイン特化⾔言語) • DSL についてもっと詳しく知りたい ⽅方こちらをご参照ください • 今そこにある  “DSL” (gihyo.jp)

    • http://gihyo.jp/admin/feature/01/dsl   9
  10. 内部  DSL と外部  DSL • 内部  DSL • 汎⽤用プログラミング⾔言語をベースに作られる   DSL  のこと

    • 基となる⾔言語の範疇で  DSL を表現する • Rake はこちら • 外部  DSL • 特定の問題向けに新たに作られる  DSL のこと • yacc とか  lex とか使って頑張る? • Make や  CSS はこちら 10
  11. by Franklin Dattein http://www.flickr.com/photos/51035769981@N01/26102762/ Java  で   DSL  を 実現する

    11
  12. どうすれば  DSL っぽくなるのか? • 「流流れるようなインタフェース」を 使えばそれっぽくなりそう • ⾃自然な英語の⽂文章として表現できれば なお良良さそう • 汎⽤用的プログラミング⾔言語のような 「⼿手続き」の羅羅列列ではなく「宣⾔言」を 書かせるイメージ?

    • 宣⾔言型プログラミング? 12
  13. 流流れるようなインタフェース • Fluent Interface • http://capsctrl.que.jp/kdmsnr/wiki/bliki/? FluentInterface • 例例 • みんな⼤大好き  Twitter4J • Java 8

    から導⼊入される   java.util.stream.Stream など 13
  14. 作ってみよう! DSL in Java 14

  15. 今回のお題 • AWS CloudFormation • 各種  AWS サービス向けのプロビジョニング フレームワーク •  インフラ周りの⾃自動セットアップ的なもの • CloudFormation

    のテンプレート • JSON ベースの  DSL • とにかく記述するのが⾟辛い •  ただひたすらに冗⻑⾧長な表現 •  編集時は  JSON の構⽂文エラー以外は検知できない • Java  で  CloudFormation のテンプレート 相当の記述ができる  DSL を作ろう! 15
  16. (ちょっとだけ)作りました! • ソースコード • gist.github.com/komiya-­‐atsushi/9002471 •  315  ⾏行行⽬目以降降が  DSL としての利利⽤用例例 • 実⾏行行結果 • gist.github.com/komiya-­‐atsushi/9002499

    16
  17. by Elliott Brown http://www.flickr.com/photos/39415781@N06/4279095666/ Java で  DSL  を 書くメリット &デメリット

    &その他 17
  18. メリット • あくまでも  Java  のコードなので、数々の 優れた  IDE (※)  の機能を有効活⽤用できる • ※ IntelliJ

    IDEA とか • ミススペルや構⽂文ミスなどの⽂文法エラー だけでなく、ある程度度意味的なミス  (※) も 検出できる • ※  静的型付け⾔言語としての特性を利利⽤用すれば • とは⾔言え、DSL の設計次第なところも… 18
  19. デメリット • DSL を実⾏行行するのが⾯面倒 • $  javac  –cp  dsl.jar  Hoge.java   $

     java  –cp  ./:dsl.jar  Hoge • Ruby  などの  DSL に適した他⾔言語に ⽐比べて、表現⼒力力に制限がある印象 • DSL っぽさを出すのが難しい • 「結局これ  Java じゃん」となりがち 19
  20. その他 • ⾔言語デザインの能⼒力力・センスが問われる • どうすれば気持ちよく  DSL  を書いて もらえるか? • 間違いを⽣生じさせないように書いて もらうにはどうすればよいか? • 加えて、⾔言語を  Java

    で表現するための能 ⼒力力・センスが問われる • API 設計(クラス/メソッド/引数) • クラス名/メソッド名の命名 • DSL を  ”実現する” 側の実装は混沌となりがち 20
  21. まとめ 21

  22. まとめ • Java でも  DSL は実現できるよ! • ⾒見見た⽬目がまんま  Java  のコードだけど • DSL の実⾏行行はちょっと⾯面倒だけど、IDE

    の⼿手厚いサポートが受けられるよ! • IntelliJ IDEA とか • DSL の設計は⾔言語デザインの能⼒力力・セ ンスや  Java における設計能⼒力力なども問 われるね! 22
  23. 23 by vandys http://www.flickr.com/photos/41028635@N00/245922527/ ありがとう ございました