読者です 読者をやめる 読者になる 読者になる

MyEnigma

とあるエンジニアのブログです。#Robotics #Programing #C++ #Python #MATLAB #Vim #Mathematics #Book #Movie #Traveling #Mac #iPhone

23. ドメイン特化言語 Michael Hunger:『プログラマが知るべき97のこと』

以下の記事は,オライリージャパン社から出版された

プログラマが知るべき97のこと』

の中から1つのエッセイを選び,

そのエッセイを,クリエイティブコモンズ3.0の条件の元で転載したものです.

Creative Commons ― 表示 3.0 アメリカ合衆国 ― CC BY 3.0

本書の内容は,オープンソースモデルに従い,

ほぼ無制限で利用が可能です.

クリエイティブ・コモンズ表示3.0の条件下で,

自由に使用することができるのです.

つまり,どのエッセイも,

著者の名前を明記すれば,自由に転載,改変が可能であるということです.

ーー"はじめに"から抜粋 pXII


もし,他のエッセイを読みたい場合には,

記事末のリンクを辿るか,

以下のリンク先のTwitterアカウントのつぶやきからお探し下さい.

Twitter Account: 97 Things Bot



また,元の英文によるエッセイを読みたい方は,

こちらを参照して下さい.

Contributions Appearing in the Book - Programmer 97-things


23. ドメイン特化言語 マイケル・フンガー (Michael Hunger):『プログラマが知るべき97のこと』:

チェスプレーヤ,幼稚園の先生,保険の外交員など,

どの分野にも言える事ですが,

専門家というのは,

日常生活で使われる言葉とはまったく異なった言葉を言葉を使うものです.

いわゆる,

ドメイン特化言語 (DSL:Domain Specific Langage)」*1

が存在するのは,そのためです.

分野(ドメイン)には,

それぞれ固有の事象があり,

固有の事象を表す特殊な語彙があるので,

DSLによってその語彙に対応するというわけです.



DSLは,

ある分野に固有の語彙や語法を使用して,

事象を表現できるように作られたプログラミング言語です.

この言語を使えば,

コードは当該分野の専門家にとって読みやすく,

理解しやすくなります.

その言語を使うことで,

専門家自身が自らコードを書くこともできれば理想でしょう.

DSLの中でも特に古くから存在するのは,

ソフトウェア開発者や科学者をターゲットとしたDSLです.

UNIXの環境設定ファイルなどで使用される

「ミニ言語」や,

LISPのマクロの力を利用して作成された言語などは,

その中でも古い例といえるでしょう.

(ミニ言語については以下の書籍が詳しい

)


DSLは,大きく内部DSLと外部DSLに分類することができます.

内部DSL

内部DSLは,

汎用のプログラミング言語の書き方を工夫して,

見かけ上の構文を自然言語に近づけた言語です.

内部DSLの作成には,糖衣構文(syntactic sugar)を豊富に持ち,

フォーマットの自由度の高い言語(Ruby,Scalaなど)の方が,

そうでない言語(Javaなど)よりも向いていると言えます.

内部DSLでは,

ホスト言語(基になった言語)のAPI,ライブラリ,ビジネスコードなどは,

ラッピングされるのが普通です.

ラッパが提供され,

技術的知識がなくてもその昨日を容易に利用できるようにしてあるのです.

また,コードをファイルに書けば,そのファイルを使って即,実行できるのが普通です.

実装の仕方や分野によって,言語の用途は様々に異なってきます.

用途の例としては,

データ構造の構築,

依存関係の定義,

プロセスやタスクの実行,

他のシステムとの通信,ユーザ入力のバリデーションなどが挙げられます.

内部DSLの構文はホスト言語の構文の制約を受けます.

ホスト言語での書き方を工夫してDSLを作るのに役立つパターンは多数存在します.

例えば,

エクステンションビルダ,メソッドチェーン,アノテーションなどです.

ホスト言語が再コンパイルを必要としない言語であれば,

内部DSLは非常に簡単に作成でき,

対象ビジネス分野の専門家にとって,使いやすいものになるでしょう.


外部DSL

外部DSLは汎用のプログラミング言語とは,

まったく別の構文をもったDSLです.

グラフィカルな外部DSLもありますが,

テキストベースの外部DSLの方が一般的です.

テキストベースの外部DSLのコードは,

レキサー,パーサ,モデルトランスフォーマ,ジェネレータといった.

ポストプロセッシングのためのツール群を組み合わせることによって処理されます.

通常の場合,

外部DSLは読み込み時に,内部モデルに変換され,

後続処理に使われます.

EBNFなどの文法(grammar)を定義するのが,有効でしょう.

文法は,エディタ,ビジュアライザ,パーサジェネレータ等の

ツール群が扱うパーツを生成するための起点となります.

シンプルなDSLならば,たとえば正規表現を利用した.

「手作りの」パーサなどでも十分に対応できます.

ただし,手作りのパーサは,

あれこれ欲張ると非常に分かりにくく,

使いにくくなってしまうので,

openArchitecture Ware, ANTLR, SableCC, ANdroMDAなど

元々文法定義,

またはDLSのために作られた既存のツールを探す方が合理的でしょう.

XMLの「方言」をつくり,

それを外部DSLとする方法もよく使われますが,

特に技術知識が無い人にとって,

コードが読みにくくなりやすいのが難点です.



DSLを作るときは,

使う人が誰かということを

常に考慮にいれておく必要があります.

DSLの利用者は開発者でしょうか,

管理者でしょうか,

どこかの企業の顧客でしょうか,

それともエンドユーザでしょうか.

言語の技術レベルや利用可能なツール

例えばシンタックスヘルプ(例:IntelliSense),

リアルタイムバリデーション,可視化ツールなどへの対応や,

コード表現を利用者に応じて変えることになります.

DSLが技術的な詳細を隠蔽すれば,

技術者の助けを借りることなく,

ユーザが自分の手でシステムを自らのニーズに合わせることができます.

最初にDSLの枠組みさえ提供されれば,

あとは各自が自力で作業を進められるため,

それが開発作業のスピードアップにつながります.

言語は使用されるうちに,徐々に進化することになるでしょう.

既存の表現や文法からの移行のために使える手立ても増えます.





■著者データ

[マイケル・フンガー (Michael Hunger)]

旧東ドイツで暮らしていた子供時代からソフトウェア開発に興味を持つ.

今でももちろん自らプログラミング言語を習得することや,

良いコードを書くことには,強い意欲を持っているが,

それに加えて,ソフトウェアを開発する「人」のあり方,

他のプログラマの技能向上などにも関心を寄せている.

フリーのコンサルタント

「ソフトウェア開発改善エバジェリスト」

として,コーチングの仕事をする他,

プロジェクトチームに参加して開発作業を行うなど,

多様な活動を行っている.

仕事をしていない時間のほとんどは,

3人の子供たちのために使う.

また,テキストベースのMUD(MorgenGrauen)の

長年の熱心な愛好家でもある.

時間のある時はできるだけ本を読むようにしているが,

"die-buchbar"というコーヒーショップなども経営しているため,

なかなか思うようには,時間が取れない.

コーヒーショップには工房も併設されており,

何かを作ったり(レゴなども用意されている),

物に印刷をしたりできるようになっている.

仕事関連では,

ソフトウェア開発,新しいプログラミング言語の習得に加え,

ITポッドキャストを楽しんだりしている.

(特にSoftware Enginnering Radio

リンク:Software Engineering Radio - The Podcast for Professional Software Developers)

さらにqi4j

(ソフトウェア設計の新たな考え方である

DCI[Data-Context-Interaction]のJava実装

リンク:www.qi4j.org - www.qi4j.org)

などの野心的,刺激的なプロジェクトに参加したり,

DSL(jequel, quill, xmldsl)を作成したりもしている.

リファクタリングの仕事や,

書籍への寄稿,

あるいは書籍のレビューなどをすることもある.

最近では,カンファレンスでのプレゼンテーションも始めた.

著者のtwitterも参照してもらいたい.

Twitter:Michael Hunger (mesirii) は Twitter を利用しています


関連記事

1.分別のある行動 Seb Rose:『プログラマが知るべき97のこと』 - MY ENIGMA

2.関数プログラミングを学ぶことの重要性 Edward Garson:『プログラマが知るべき97のこと』 - MY ENIGMA

3.ユーザが何をするかを観察する (あなたはユーザではない) Giles Colborne:『プログラマが知るべき97のこと』 - MY ENIGMA

4.コーディング規約を自動化する Filip van Laenen:『プログラマが知るべき97のこと』 - MY ENIGMA

5.美はシンプルさに宿る Jorn Olmheim:『プログラマが知るべき97のこと』 - MY ENIGMA

6.リファクタリングの際に注意すべきこと Rajith Attapattu:『プログラマが知るべき97のこと』 - MY ENIGMA

7.共有は慎重に Udi Dahan:『プログラマが知るべき97のこと』 - MY ENIGMA

8. ボーイスカウト・ルール Robert C. Martin:『プログラマが知るべき97のこと』 - MY ENIGMA

9. 他人よりまず自分を疑う Allan Kelly:『プログラマが知るべき97のこと』 - MY ENIGMA

10. ツールの選択は慎重に Giovanni Asproni:『プログラマが知るべき97のこと』 - MY ENIGMA

11. ドメインの言葉を使ったコード Dan North:『プログラマが知るべき97のこと』 - MY ENIGMA

12. コードは設計である Ryan Brush:『プログラマが知るべき97のこと』 - MY ENIGMA

13. コードレイアウトの重要性 Steve Freeman:『プログラマが知るべき97のこと』 - MY ENIGMA

14. コードレビュー Mattias Karlsson:『プログラマが知るべき97のこと』 - MY ENIGMA

13. コードレイアウトの重要性 Steve Freeman:『プログラマが知るべき97のこと』 - MY ENIGMA

14. コードレビュー Mattias Karlsson:『プログラマが知るべき97のこと』 - MY ENIGMA

15. コードの論理的検証 Yechiel Kimchi:『プログラマが知るべき97のこと』 - MY ENIGMA

16. コメントについてのコメント Cal Evans:『プログラマが知るべき97のこと』 - MY ENIGMA

17. コードに書けないことのみをコメントにする Kevlin Henney:『プログラマが知るべき97のこと』 - MY ENIGMA

18. 学び続ける姿勢 Clint Shank:『プログラマが知るべき97のこと』 - MY ENIGMA

19. 誰にとっての利便性か Gregor Hohpe:『プログラマが知るべき97のこと』 - MY ENIGMA

20. すばやくデプロイ,こまめにデプロイ Steve Berczuk:『プログラマが知るべき97のこと』 - MY ENIGMA

21. 技術的例外とビジネス例外を明確に区別する Dan Bergh Johnsson:『プログラマが知るべき97のこと』 - MY ENIGMA

22. 一万時間の訓練 Jon Jagger:『プログラマが知るべき97のこと』 - MY ENIGMA

*1:ドメイン特化言語(DSL:Domain Specific Language)とは、ある特定の種類の問題に特化したコンピュータ言語のことです。様々な問題に対応できる汎用的な言語のことではありません。Martin Fowler's Bliki in Japanese - ドメイン特化言語