Slide 1

Slide 1 text

Java: DSL  としての 可能性 渋⾕谷Java #5.5 2014.04.05 at BizReach KOMIYA Atsushi ( @komiya_atsushi ) 1

Slide 2

Slide 2 text

⾃自⼰己紹介 2

Slide 3

Slide 3 text

KOMIYA Atsushi @komiya_atsushi 3

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

DSL (Domain Specific Language、ドメイン特化⾔言語) • 特定の問題やタスクを解決するために 特別に設計された⾔言語 • Ruby / Python / Java / C++ などの汎⽤用的 な問題解決のためのプログラミング⾔言語と は異異なる • DSL の⼀一例例 • Rake (Ruby) • Make • 正規表現 • CSS 8

Slide 9

Slide 9 text

DSL (Domain Specific Language、ドメイン特化⾔言語) • DSL についてもっと詳しく知りたい ⽅方こちらをご参照ください • 今そこにある  “DSL” (gihyo.jp) • http://gihyo.jp/admin/feature/01/dsl   9

Slide 10

Slide 10 text

内部  DSL と外部  DSL • 内部  DSL • 汎⽤用プログラミング⾔言語をベースに作られる   DSL  のこと • 基となる⾔言語の範疇で  DSL を表現する • Rake はこちら • 外部  DSL • 特定の問題向けに新たに作られる  DSL のこと • yacc とか  lex とか使って頑張る? • Make や  CSS はこちら 10

Slide 11

Slide 11 text

by Franklin Dattein http://www.flickr.com/photos/51035769981@N01/26102762/ Java  で   DSL  を 実現する 11

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

流流れるようなインタフェース • Fluent Interface • http://capsctrl.que.jp/kdmsnr/wiki/bliki/? FluentInterface • 例例 • みんな⼤大好き  Twitter4J • Java 8 から導⼊入される   java.util.stream.Stream など 13

Slide 14

Slide 14 text

作ってみよう! DSL in Java 14

Slide 15

Slide 15 text

今回のお題 • AWS CloudFormation • 各種  AWS サービス向けのプロビジョニング フレームワーク •  インフラ周りの⾃自動セットアップ的なもの • CloudFormation のテンプレート • JSON ベースの  DSL • とにかく記述するのが⾟辛い •  ただひたすらに冗⻑⾧長な表現 •  編集時は  JSON の構⽂文エラー以外は検知できない • Java  で  CloudFormation のテンプレート 相当の記述ができる  DSL を作ろう! 15

Slide 16

Slide 16 text

(ちょっとだけ)作りました! • ソースコード • gist.github.com/komiya-­‐atsushi/9002471 •  315  ⾏行行⽬目以降降が  DSL としての利利⽤用例例 • 実⾏行行結果 • gist.github.com/komiya-­‐atsushi/9002499 16

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

メリット • あくまでも  Java  のコードなので、数々の 優れた  IDE (※)  の機能を有効活⽤用できる • ※ IntelliJ IDEA とか • ミススペルや構⽂文ミスなどの⽂文法エラー だけでなく、ある程度度意味的なミス  (※) も 検出できる • ※  静的型付け⾔言語としての特性を利利⽤用すれば • とは⾔言え、DSL の設計次第なところも… 18

Slide 19

Slide 19 text

デメリット • DSL を実⾏行行するのが⾯面倒 • $  javac  –cp  dsl.jar  Hoge.java   $  java  –cp  ./:dsl.jar  Hoge • Ruby  などの  DSL に適した他⾔言語に ⽐比べて、表現⼒力力に制限がある印象 • DSL っぽさを出すのが難しい • 「結局これ  Java じゃん」となりがち 19

Slide 20

Slide 20 text

その他 • ⾔言語デザインの能⼒力力・センスが問われる • どうすれば気持ちよく  DSL  を書いて もらえるか? • 間違いを⽣生じさせないように書いて もらうにはどうすればよいか? • 加えて、⾔言語を  Java で表現するための能 ⼒力力・センスが問われる • API 設計(クラス/メソッド/引数) • クラス名/メソッド名の命名 • DSL を  ”実現する” 側の実装は混沌となりがち 20

Slide 21

Slide 21 text

まとめ 21

Slide 22

Slide 22 text

まとめ • Java でも  DSL は実現できるよ! • ⾒見見た⽬目がまんま  Java  のコードだけど • DSL の実⾏行行はちょっと⾯面倒だけど、IDE の⼿手厚いサポートが受けられるよ! • IntelliJ IDEA とか • DSL の設計は⾔言語デザインの能⼒力力・セ ンスや  Java における設計能⼒力力なども問 われるね! 22

Slide 23

Slide 23 text

23 by vandys http://www.flickr.com/photos/41028635@N00/245922527/ ありがとう ございました