advertisement

How To Create Custom DSLs By PHP

50 %
50 %
advertisement
Information about How To Create Custom DSLs By PHP
Technology

Published on March 14, 2009

Author: iteman

Source: slideshare.net

advertisement

PHP 関西勉強会 (2009/3/14) PHP でメタプログラミング カスタム DSL 作成入門 株式会社アイテマン Piece Project 久保敦啓 <kubo@iteman.jp> Copyright © 2009 ITEMAN, Inc. All rights reserved. -1-

メタプログラミングとは? 「他のプログラムや自分自身を記述し たり、操作するプログラムを記述す る」 -- 「ジェネレーティブプログラミング」より Copyright © 2009 ITEMAN, Inc. All rights reserved. -2-

メタプログラムとは? 「他のプログラムを記述したり操作し たりするプログラム」 -- 「ジェネレーティブプログラミング」より Copyright © 2009 ITEMAN, Inc. All rights reserved. -3-

メタプログラミング/メタプログラムの例 プログラムジェネレータ コンパイラ インタプリタ リフレクション アスペクト指向プログラミング (Aspect Oriented Programming) 言語指向プログラミング (Language Oriented Programming) Copyright © 2009 ITEMAN, Inc. All rights reserved. -4-

言語指向プログラミング 「言語指向プログラミングとは、ドメ イン特化言語を使ってソフトウェア構 築を行う一般的な開発スタイルのこと です。」 - http://capsctrl.que.jp/kdmsnr/wiki/bliki/?LanguageWorkbench より Copyright © 2009 ITEMAN, Inc. All rights reserved. -5-

ドメイン特化言語 「ドメイン特化言語(DSL:Domain Specific Language)とは、ある特 定の種類の問題に特化したコンピュー タ言語のことです。」 - http://capsctrl.que.jp/kdmsnr/wiki/bliki/?LanguageWorkbench より Copyright © 2009 ITEMAN, Inc. All rights reserved. -6-

ドメイン特化言語の例 TeX SQL Yacc Lex アクティブデータモデル XML 設定ファイル GUI ビルダ Copyright © 2009 ITEMAN, Inc. All rights reserved. -7-

言語指向プログラミング Intentional Software (Intentional Software) MPS (JetBrains) Software Factories (Microsoft) Generative Programming Language Workbenches (Martin Fowler) Oslo (Microsoft) Copyright © 2009 ITEMAN, Inc. All rights reserved. -8-

次期 Piece Framework のアーキテクチャ Eclipse 抽象形 PHP abstract representation DSL スクリプト 保存 store 保存形 stored representation 復元 DSLの参照・編集 Piece_IDE with TMF 生成 generation ツリービュー 投影 projection PDT, The Language Toolkit, ... Piece Framework Webサービス Piece Framework ランタイムオブジェクト エディター 双方向の変更の反映 グラフィカルエディター 実行可能形 executable representation ソースコード、HTML ファイル、データベーススキーマ、... 編集可能形 editable representation Copyright © 2009 ITEMAN, Inc. All rights reserved. -9-

PHP でカスタム DSL を作成する 1. DSL の設計と Lexer および Parser の実装 2. セマンティックモデル (ドメイン モデル) の設計・実装 3. (オプション) Eclipse 上の DSL エディタの設計・実装 Copyright © 2009 ITEMAN, Inc. All rights reserved. - 10 -

トランスフォーメーション セマンティックモデル DSL スクリプト PHP スクリプト ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ------ ------ Generate オプション Parse Populate AST Copyright © 2009 ITEMAN, Inc. All rights reserved. - 11 -

DSL の設計と Lexer および Parser の実装 1. 具体的な DSL スクリプトを書き ながら、 2. 同時に Parser を定義し、 3. 必要に応じて Lexer に手を加え て、 4. テストプログラムを実行する。 5. 以上を繰り返す Copyright © 2009 ITEMAN, Inc. All rights reserved. - 12 -

Lexer Generator と Parser Generator Lexer Generator - PHP_LexerGenerator Parser Generator - PHP_ParserGenerator - kmyacc + PHP 対応パッチ Copyright © 2009 ITEMAN, Inc. All rights reserved. - 13 -

カスタム DSL の例 Employees.mapper - Piece_ORM マッパー DSL association skills { table skills type manyToMany property skills } association computer { table computers type oneToOne property computer } method findByIdAndNote { query quot;SELECT * FROM $__table WHERE id = $id AND note = $notequot; } method findAllWithSkills1 { association skills } ... Copyright © 2009 ITEMAN, Inc. All rights reserved. - 14 -

Lexer 定義の例 MapperLexer.plex - Piece_ORM マッパー DSL の Lexer 定義 ... /*!lex2php %input $this->_input %counter $this->_counter %token $this->token %value $this->value %line $this->line ID = /[a-zA-Z_][a-zA-Z_0-9]*/ WS = /[ trn]+/ STRING = /quot;[^[quot;]+quot;/ LCURLY = quot;{quot; RCURLY = quot;}quot; METHOD = quot;methodquot; ... SL_COMMENT = !//[^nr]*r?n! ML_COMMENT = !/*[^*]**+([^*/][^*]**+)*/! */ /*!lex2php %statename INITIAL ... Copyright © 2009 ITEMAN, Inc. All rights reserved. - 15 -

Lexer 定義の例 MapperLexer.plex - Piece_ORM マッパー DSL の Lexer 定義 ... /*!lex2php %statename INITIAL METHOD { if ($this->_debug) echo quot;found METHOD [ {$this->value} ]nquot;; $this->token = MapperParser::METHOD; } QUERY { if ($this->_debug) echo quot;found QUERY [ {$this->value} ]nquot;; $this->token = MapperParser::QUERY; } ORDER_BY { if ($this->_debug) echo quot;found ORDER_BY [ {$this->value} ]nquot;; $this->token = MapperParser::ORDER_BY; } ... Copyright © 2009 ITEMAN, Inc. All rights reserved. - 16 -

Parser 定義の例 MapperParser.y - Piece_ORM マッパー DSL の Parser 定義 ... start ::= topStatementList. topStatementList ::= topStatementList topStatement. topStatementList ::= . topStatement ::= method. topStatement ::= association. method ::= METHOD ID(A) LCURLY methodStatementList(B) RCURLY. { if (array_key_exists(strtolower(A), $this->_methodDeclarations)) { throw new Exception(quot;Cannot redeclare the method [ {A} ] (previously declared on line quot; . $this->_methodDeclarations[ strtolower(A) ] . ')' ); } $this->_methodDeclarations[ strtolower(A) ] = $this->_mapperLexer->line; $this->_ast->addMethod(A, @B['query'], @B['orderBy'], @B['associations']); } ... Copyright © 2009 ITEMAN, Inc. All rights reserved. - 17 -

DSL ローダの実装 DSL ローダの制御フロー ... public function load() { $this->_initializeAST(); $this->_loadAST(); $this->_loadSymbols(); $this->_createMapper(); } ... Copyright © 2009 ITEMAN, Inc. All rights reserved. - 18 -

DSL ローダの実装 AST (Abstract Syntax Tree) の初期化 ... private function _initializeAST() { $this->_ast = new Ast(); foreach ($this->_metadata->getFieldNames() as $fieldName) { ... } $this->_ast->addMethod('findAll', 'SELECT * FROM $__table'); $this->_ast->addMethod('insert'); $this->_ast->addMethod('update'); $this->_ast->addMethod('delete'); } ... Copyright © 2009 ITEMAN, Inc. All rights reserved. - 19 -

DSL ローダの実装 Lexer と Parser を実行し、DSL を AST に変換する ... private function _loadAST() { $mapperLexer = new MapperLexer(file_get_contents($this->_configFile)); $mapperParser = new MapperParser($mapperLexer, $this->_ast, $this- >_configFile); try { while ($mapperLexer->yylex()) { $mapperParser->doParse($mapperLexer->token, $mapperLexer->value); } } catch (Exception $e) { throw new Exception($e->getMessage() . quot; in {$this->_configFile} on line {$mapperLexer- >line}quot; ); } $mapperParser->doParse(0, 0); } ... Copyright © 2009 ITEMAN, Inc. All rights reserved. - 20 -

DSL ローダの実装 シンボルテーブルの作成とセマンティックモデルの作成 ... private function _loadSymbols() { try { $this->_loadMethods(); } catch (Exception $e) { throw new Exception($e->getMessage() . quot; in {$this->_configFile}quot;); } } private function _createMapper() { $this->_mapper = new Mapper($this->_mapperID); foreach ($this->_methods as $method) { $this->_mapper->addMethod($method); } } ... Copyright © 2009 ITEMAN, Inc. All rights reserved. - 21 -

セマンティックモデル Operational Interface と Population Interface ... // A operational interface public function executeQueryWithCriteria($methodName, $criteria, $isManip = false) { if (!$this->hasMethod($methodName)) { throw new Exception(quot;The method [ $methodName ] was not definedquot;); } $queryExecutor = new QueryExecutor($this, $isManip); return $queryExecutor->executeWithCriteria($this- >_getMethod($methodName)->getName(), $criteria); } // A population interface public function addMethod(Method $method) { $this->_methods[ strtolower($method->getName()) ] = $method; } ... Copyright © 2009 ITEMAN, Inc. All rights reserved. - 22 -

AST クラスの実装 AST extends DOMDocument ... class AST extends DOMDocument { public function addMethod($name, $query = null, $orderBy = null, $associations = null) { $id = strtolower($name); $xpath = new DOMXPath($this); $methodNodeList = $xpath->query(quot;//method[@id='$id']quot;); if (!$methodNodeList->length) { $methodElement = $this->appendChild(new DOMElement('method')); $methodElement->setAttribute('id', $id); $methodElement->setAttribute('name', $name); } else { $methodElement = $methodNodeList->item(0); } ... } ... Copyright © 2009 ITEMAN, Inc. All rights reserved. - 23 -

トランスフォーメーション セマンティックモデル DSL スクリプト PHP スクリプト ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ------ ------ Generate オプション Parse Populate AST Copyright © 2009 ITEMAN, Inc. All rights reserved. - 24 -

Eclipse 上の DSL エディタの設計・実装 1. TMF (Textual Modeling Framework) にDSL グラマーを移植する。 (グラマー言語は選択可能) 2. 補完、バリデーション、リファクタリングなどを 実装する。 DSL エディタとツリービューの完成 Copyright © 2009 ITEMAN, Inc. All rights reserved. - 25 -

Eclipse 上の DSL エディタの設計・実装 3. ページフローやワークフローのように可視化が効 果的であればグラフィカルエディタも実装、TMF と 統合する。 2 Way モデリングの完成 Copyright © 2009 ITEMAN, Inc. All rights reserved. - 26 -

Eclipse 上の DSL エディタの設計・実装 4. PDT, Aptana など他のプラグインと協調できる ように拡張する。 双方向の変更の反映 Copyright © 2009 ITEMAN, Inc. All rights reserved. - 27 -

おわりに Copyright © 2009 ITEMAN, Inc. All rights reserved. - 28 -

参考文献 Krzysztof Czarnecki, Ulrich Eisenecker, Generative Programming: Methods, Tools, and Applications, Addison-Wesley Pub (Sd), 2000, ISBN 978-0201309775 津田 義史、今関 剛、朝比奈 勲訳、『ジェネレーティブプロ グラミング』、翔泳社、2008年、ISBN 978-4798113319 http://capsctrl.que.jp/kdmsnr/wiki/bliki/?DomainSpecificLanguage http://www.martinfowler.com/articles/languageWorkbench.html http://capsctrl.que.jp/kdmsnr/wiki/bliki/?LanguageWorkbench http://martinfowler.com/dslwip/index.html Copyright © 2009 ITEMAN, Inc. All rights reserved. - 29 -

Add a comment

Comments

人気 新品 | 03/06/15
こんにちは |非常に良い、ニート ウェブサイト あなたがしました現在|あり、現時点では|今|ここに行く|ここで|ここ|あなたはそこに持っている|あなたが得ている|あなたが持っている|あなたが持っています。 [url=http://www.apol.com.tr]人気 新品[/url]
今月限定 | 06/06/15
私は、こんにちは のための願いこのためにサブスクライブするには 取得 最も熱い更新は、したがってここで、私にできること、それは助けます。 [url=http://www.muratmobilya.net]今月限定3千円以上で送料無料[/url]
国内即発 | 07/06/15
プリティ 内容。 I だけあなたにつまずいブログとアク首都で言って 私は実際に ブログ投稿|あなたのブログを占める愛しました。 とにかく 私がしますサブスクライブすることが フィード 偶数と I 充実あなた一貫 迅速 アクセスへの​​エントリを取得。 [url=http://klinghoffer.com]国内即発[/url]
新作直営 | 07/06/15
魅力、あなたがしている 非常 プロブロガー| 本当に | つまりこれはあります。に|を求めて| のRSSフィードフィードとを楽しみにしてあなたの参加を探して| |シークの検索で素晴らしいポストのための狩り。 さらに、私の社会的ネットワークに私がした 共有しました [url=http://centralfruitplant.com]新作直営店[/url]
2015年春夏 | 08/06/15
今それ音のように利用できる|そこにブログプラットフォーム表現エンジン トップ好適最高ですたった今。 、あなたのブログに使用して(私は何を読んでからは)何ということはありますか? [url=http://arbuzavto.ru]2015年春夏[/url]
爆発的な | 09/06/15
種類の エリア。 Yahooの私に探る最後にこのウェブサイトサイトにつまずきました。にショーその私が持っている 非常に 良い 私は必要なものに出くわしました。 I このようなたくさん 間違いなく?| になります行いますない 忘れ俯瞰このウェブサイト や提供​​ それルック 定期。 [url=http://www.auctionsoftware.com]爆発的な人気[/url]
】スウオ | 30/12/15
[ 正規|あす楽 ]|[SOLD OUT]送料無料|ドクターマーチン Dr.Mar|tens ジョッ|パーブーツ [ JONI R1383620|1 ] ダークブラウン レザー メンズ レディー|ス ユニセックス [ 正規 あす 楽 ]|[SOLD OUT]送|料無料 ドクターマーチン Dr.Martens|ジップアップブーツ [ グレー ] R13665|020 BLAKE レザー メンズ|レディース ユニセ|ックス [ 正規 あす楽 ]|[SOLD OU|T]送料無料 ドクターマーチン Dr.Ma|rtens ストラップシュー|ズ [ チェリーレッド ] R1|3860600 MA|RY レザー レディース [ 正規 あす楽 ]|[SOLD OUT]送料無料 ド|クターマーチン 8065 Dr.Ma|rtens ストラップ シューズ MARY J|ANE レザー レディース R1|2916001 ブラック [ 正規 あす楽 ]|[SOLD OUT]送料無|料 ドクターマーチン Dr.Martens ストラッ|プ シューズ [|ブラック ] R14714001 VE|GAN 5027 スムースレ|ザー レディー|ス STRAP|SHOES BLACK [ 正規 あす楽 ]|[SOLD OUT]送料無料 ド|クターマーチン D|r.Martens 3ス|トラップ ブーツ [ ダークブラウン ] R13|679201 BELLISSA レザ|ー レディース [ 正規 あす楽 ]|[SOLD OUT]送料無|料 ドクターマーチン Dr.Martens 3ストラ|ップ ブーツ [ ブラック ] R1|3680001 BELLISSA レザー レ|ディース [ 正規 あす楽 ]|[SOLD OU|T]送料無料 ドクター|マーチン Dr.Martens トールブーツ [|グレー

Related presentations

Presentación que realice en el Evento Nacional de Gobierno Abierto, realizado los ...

In this presentation we will describe our experience developing with a highly dyna...

Presentation to the LITA Forum 7th November 2014 Albuquerque, NM

Un recorrido por los cambios que nos generará el wearabletech en el futuro

Um paralelo entre as novidades & mercado em Wearable Computing e Tecnologias Assis...

Microsoft finally joins the smartwatch and fitness tracker game by introducing the...

Related pages

How To Create Custom DSLs By PHP - Technology

How To Create Custom DSLs By PHP; Download. of 29 ...
Read more

Creating DSLs in Java, Part 1: What is a domain-specific ...

Creating DSLs in Java, ... expressive programming languages custom designed for specific ... The DSL you create for them must be built on their ...
Read more

Gentleware - model to business: gentleware homepage

With "Poseidon for DSLs" you can now create ... Try new Poseidon for DSLs workbench to create your custom DSL ... Poseidon for DSLs allows ...
Read more

f# - Can I create nested Computation Expressions for ...

Can I create nested Computation Expressions for Builder Like DSLs? ... This is a custom operation in this query or ... Then you create a separate ...
Read more

Visual Studio Domain Specific Language tools ...

Visual Studio Domain Specific Language tools. ... such as SQL and PHP are DSLs. ... to create a custom VS Designer that allows the ...
Read more

java - Which language (that runs on JVM) is best suited ...

Which language (that runs on JVM) ... Languages in the Forth family are also great for defining DSLs. ... Create a new Diagram in custom code. 0.
Read more

DSLs · peridot-php/peridot Wiki · GitHub

... Event driven BDD test framework for PHP. ... peridot-php / peridot. ... Wiki Pulse Graphs DSLs. brianium edited this page Nov 8, 2014 · 4 revisions ...
Read more

Most Internal DSLs are Outdated - DZone Java

Most Internal DSLs are ... While this sort of DSL is very easy to create, ... it is dangerous to start delving into writing and enhancing custom DSLs for a ...
Read more