SlideShare une entreprise Scribd logo
1  sur  18
オレオレ言語実装に役立つ
プル型ASTウォーカーAPI
神戸隆行(椎路ちひろ)Twitter: @ChihiroShiiji / FB: takayuki.kando
2016/07/03(第14回福岡市西区プログラム勉強会資料)
XGMTK & Lore
自己紹介
 神戸 隆行(かんど たかゆき)、PN. 椎路ちひろ(しいじ ちひろ)
Twitter: @ChihiroShiiji / FB: takayuki.kando
 出身は名古屋、趣味イラストとコスプレ
 九大の社会人博士課程で博士を取ろうとしながら研究開発に従事する失業者
 専門は流転中:
 数値解析(のプログラミング・インターフェースの改良、修論@名大)
→数式処理(のプログラミング・インターフェースの改良@某F研)
→プログラム最適化(博士課程一回目の失敗@東工大)
(2005年に仕事を紹介され福岡へ来た)
→コンパイラ開発(Redefis、動的再構成可能プロセッサ向けコンパイラ)
→SW/HW開発環境(IDE上からクラウド上の開発ツールを利用できるミドルウェア
PTaaSの開発) http://www.qualiarc.com/?post_type=seihin&p=202
 使用プログラミング言語:
 最初はFORTRAN、大学以降はC++とC、今は主にJava、他は必要に応じてボチボチ
 本日は趣味で開発しているLore言語の実装の副産物
 幾つかのソースとサンプルをGitHub[ https://github.com/TakayukiKando/LoreAST ]に置いてま
す
2016/07/032 第14回福岡市西区プログラム勉強会
本日の内容「プル型ASTウォーカーAPI 」
2016/07/03第14回福岡市西区プログラム勉強会3
 LoreAST
 TRPGルールシナリオ記述言語Loreの実装に使うつもりで作
成しているASTライブラリ
 オンライン/オフライン・セッション支援ツールXGMTKで利用する
 XGMTKはルールやシナリオを実行可能な形で記述することでルール主
導のセッション支援ツール
 本日は主にそのASTにアクセスするAPIの設計について
 構文解析結果を保存するデータ構造としてツリーは良いけれど、意
外とアクセスが面倒くさい
 先行事例を調べていないのでもしかしたら「あるある」事
例かも
 ……まぁ小ネタですし
具象構文木(CST…Concrete Syntax Tree) と
抽象構文木(AST…Abstract Syntax Tree)
2016/07/03第14回福岡市西区プログラム勉強会4
例(代入文): d=(a+b)*c;
代入文
=d 式
* c項
+ ba
項 )(
CST:
構文規則の適用を記録し、ソースの記号列の解
析結果を忠実に記録したデータ構造
非終端記号
終端記号
代入文
id: d 式: *
id: c式: +
id: bid: a
AST:
構文が表現していたプログラムの構造を抽象的
に表現したデータ構造
構文解析のデ
バッグに便利
プログラムの解
析に便利
ASTの実装 - Node.java
2016/07/03第14回福岡市西区プログラム勉強会5
public final class Node {
private final Map<Attribute<?>, Object> attrs; /* アトリビュート(後述) */
private final List<Node> children; /* 子ノード */
/* コンストラクタ */
public Node(List<Node> children){/* 省略 */}
public Node(Node...children){/* 省略 */}
/* アトリビュート(後述)の取得と設定、存在の確認 */
public final <T> void setAttribute(Attribute<T> attribute, T value){/* 省略 */}
public final <T> T getAttribute(Attribute<T> attribute){/* 省略 */}
public Map<Attribute<?>, Object> attributes() {/* 省略 */}
public final <T> boolean hasAttribute(Attribute<T> attribute){/* 省略 */}
/* 子ノードの追加と取得 */
public final void addChildren(Node...children){/* 省略 */}
public final void addChildren(List<Node> children) {/* 省略 */}
public List<Node> children(){/* 省略 */}
/* 等値演算とハッシュコード(ツリー比較、テスト用) */
@Override public boolean equals(Object obj){/* 省略 */}
@Override public int hashCode() {/* 省略 */}
/* ビジター受け入れメソッド(後述) */
public final void startVisit(Visitor visitor) {/* 省略 */}
}
追加可能で静的型検査可能なアトリビュート・
マップ
2016/07/03第14回福岡市西区プログラム勉強会6
public interface Attribute<T> {
}
• アトリビュートのキーとなるenum型群のためのインターフェー
ス
• 型パラメータTがミソ
public class Attributes{
public enum LocationAttr implements Attribute<Location>{
LOCATION;
}
public static final LocationAttr LOCATION =
LocationAttr.LOCATION;
public enum StringAttr implements Attribute<String>{
SYMBOL;
}
public static final StringAttr SYMBOL = StringAttr.SYMBOL;
}
public final <T> T getAttribute(Attribute<T> attribute){/* 省略 */}
• NodeのgetAttributeメソッド…キーの型パラメータの型と同じ型が返る
• enumにしてるのはキーをお手
軽にシングルトンにするため
• Locationはノードの由来となっ
たコードの位置を示すデータ構
造(エラーメッセージ等に利用)
• ここでは記号文字列を格納する
SYMBOLとソースコード上の位
置を示すLOCATIONだけだが、
Attribute<T>を継承すれば追加
できる。
ツリーを辿る(1)…ビジタ(Visitor)
2016/07/03第14回福岡市西区プログラム勉強会7
 アルゴリズムによって定まる順番
でツリーのノードを訪問するビジ
ター
 深さ優先探索や幅優先探索など
 ツリーを辿る定番デザイン・パター
ン
 長所: enterとleaveメソッドの呼び
出しによりサブツリーの開始と終
了を認識できる
 短所: コールバックによるイベント
駆動的なコードになり構造をツリー
の意識した記述がしにくい
 ASTではサブツリーのパターンに
よって処理を分けて記述するような
ことがしたい
 ノードの種類を増やしてビジタのメ
ソッドを増やして実装をFatにすれば
ある程度できるが、メンテが面倒に
 短所: 継承が必須であり、用途毎
にビジタ・クラスが増える
代入文
id: d 式: *
id: c式: +
id: bid: a
enter #0
leave
#6
enter
#1
leave
#0
enter #2
leave #5
enter #3
leave #3
enter #4
leave #1
enter #5
leave #2
enter #6
leave #4
順番の例、深さ優先探索の場合
• vをビジタ・オブジェクトとして以下の様に動作:
• ノードに初回訪問時にv.enter()が呼ばれる
• ノードへの最後の訪問時(leafノードでは
v.enter()の直後)にv.leave()が呼ばれる
ツリーを辿る(2)…イテレータ(Iterator)
2016/07/03第14回福岡市西区プログラム勉強会8
 アルゴリズムによって定まる順番で
ツリーのノードを訪問することをイテ
レータ化
 深さ優先探索や幅優先探索など
 ツリーに限らずグラフ探索全般で利用で
きる簡単で優れた抽象化
 長所: 制御をプログラム主導で行え
るのでアルゴリズムが記述し易い
 短所: AST処理で良くある、サブツ
リーを辿り終わった後で何か処理を
するようなコードが書きにくい
 サブツリーのルートノードを再訪する
アルゴリズムにしたとしても初回と再
訪が区別できない
 区別する述語は追加できるがあまり使い
やすくはない
代入文
id: d 式: *
id: c式: +
id: bid: a
#0
#1 #2
#3 #6
#4 #5
順番の例、深さ優先探索の場合
• itをイテレータ・オブジェクトとして以
下の様に動作:
• it.next()すると次のノードが取れ
る
• it.hasNext()が真を返している間
は次がある
ツリーを辿る(3)…プル型ウォーカ(Pull
Walker)
2016/07/03第14回福岡市西区プログラム勉強会9
 アルゴリズムによって定まる
順番でツリーのノードを訪問
することをイベント・ストリー
ムに変換する
 深さ優先探索や幅優先探索
など
 長所: enterとleaveイベント
によりサブツリーの開始と
終了を認識できる
 長所: イテレータ同様にプロ
グラム主導で行えるのでア
ルゴリズムが記述し易い
 ASTではサブツリーのパ
ターンによって処理を分けて
記述するようなことがしたい
代入文
id: d 式: *
id: c式: +
id: bid: a
enter #0
leave
#6
enter
#1
leave
#0
enter #2
leave #5
enter #3
leave #3
enter #4
leave #1
enter #5
leave #2
enter #6
leave #4
順番の例、深さ優先探索の場合
• sをイベント・ストリーム・オブジェクトとして以下の様に動
作:
• s.next()で次のイベントへ遷移
• getCurrentEvent()でイベント取得
• イベントはSTART(初期状態)、ENTER(ノード訪問)、
LEAVE(サブツリー終了)、FINISH(ツリー全体の終
了)の4タイプで、現在のノードが格納されている
アイディア元: XML Pull Parser
 http://www.xmlpull.org/
 実装例
 kXML
 Web: http://www.kxml.org/
 SourceForge(JARファイル):
https://sourceforge.net/projects/kxml/
 MXP1(Smackが使っているが、ダウンロードURLがリンク切
れ)
 http://www.extreme.indiana.edu/xgws/xsoap/xpp/mxp1/
 XMLのパース結果をイベントストリームに変換
 SAXパーサ(イベント駆動)とDOMツリーの間を取ったXML
パーサインターフェース
2016/07/0310 第14回福岡市西区プログラム勉強会
イベント・ストリーム
Visitorスレッド
プル型ツリーウォーカの構造
2016/07/03第14回福岡市西区プログラム勉強会11
代入文
id: d 式: *
id: c式: +
id: bid: a
enter #0
leave
#6
enter
#1
leave
#0
enter #2
leave #5
enter #3
leave #3
enter #4
leave #1
enter #5
leave #2
enter #6
leave #4
ビジタ
固定長
ブロッキング・
キュー
利用側
スレッド
ひたすら辿っ
てイベントを作
成して投入
利用側の好きなタ
イミングで順にイベ
ントを取り出す
• イベント駆動の挙動を変換するのに使っているだけなのでキューの容量は0でも良
い
• 利用側の処理速度によってはツリーの全ノード分のイベントがキューに溜まる可能
性があるので可変長は止めておいた方が良い
ASTStream.java (1) - フィールド
2016/07/03第14回福岡市西区プログラム勉強会12
public class ASTStream {
/* プライベート定数省略 */
/* フィールド */
private ASTEvent current; // 現在のイベント
private final BlockingQueue<ASTEvent> queue; // イベント・キュー
private final Node root; // 現在のノード
private final Visitor visitor; // ツリーを辿るビジター
private final ExecutorService executor; // スレッド実行サービス
private boolean finished; // 終了状態を示すフラグ
/* 内部クラスとプライベートメソッド省略 */
ASTStream.java (2) - メソッド
2016/07/03第14回福岡市西区プログラム勉強会13
/* コンストラクタ */
public ASTStream(Node root, int queueLength) {/* 省略 */}
public ASTStream(Node root){/* 省略 */}
/* ストリームの開始 */
public Future<Boolean> start(){/* 省略 */}
/* 現在のイベント */
public ASTEvent getEvent(){/* 省略 */}
/* 現在のイベントのノード */
public Node getNode(){/* 省略 */}
/* 次のイベントへ遷移 */
public void next() throws IllegalStateException {/* 省略 */}
/* 判定と検証(後述) */
public boolean is(Predicate<ASTEvent> predicate) {/* 省略 */}
public void require(Predicate<ASTEvent> predicate) throws
ASTStreamInvalidException
{/* 省略 */}
/* スキップ(後述) */
public void skipTo(Predicate<ASTEvent> predicate) {/* 省略 */}
}
イベントの判定と検証
2016/07/03第14回福岡市西区プログラム勉強会14
 is(predicate)
 現在のイベントに応じて場合分けするための述語
 require(predicate)
 現在のイベントが想定通りかどうか検証し、不正な場合は例
外を投げる
 predicateはPredicate<ASTEvent>型の1引数関数オブ
ジェクト
 EventMatcherに良く使う述語を返すメソッドを用意してある
EventMatcher
2016/07/03第14回福岡市西区プログラム勉強会15
 match(type)
 イベント型がtypeであることを判定する述語を返す
 主に他の述語との組み合わせ用だがSTARTとFINISHの判定にも使う
 match(attribute, value)
 attributeで指定されるアトリビュートがvalueに等しいことを判定する述語を返す
 主に他の述語との組み合わせ用
 match(type, attribute, value)
 イベント型がtypeでattributeで指定されるアトリビュートがvalueに等しいことを
判定する述語を返す
 enter(attribute, value)
 イベント型がENTERでattributeで指定されるアトリビュートがvalueに等しいことを判定す
る述語を返す
 same(node)
 指定されたノード同じノードのイベントであることを判定する述語を返す
 主に他の述語との組み合わせ用
 leave(node)
 指定されたノードのLEAVEイベントであることを判定する述語を返す
イベントのスキップ
2016/07/03第14回福岡市西区プログラム勉強会16
 ASTの全てのノードを処理しない応用も多いので処理し
ないノードをスキップできると便利
 skipTo(predicate)
 条件に合うイベントまでスキップ
 predicateはis()及びrequire()と同じ
 実装はis(predicate)が真になるまでnext()が繰り返し呼ばれ
るだけ
 計測していないが、マルチプロセッサ環境ではイベントキューの容量
を0より程良く大きくしておくと、スキップしない処理の間にキューにイ
ベントが貯まってskipTo()が早くなるかも?
今後
2016/07/03第14回福岡市西区プログラム勉強会17
 特定の条件とその条件に合致した場合の処理をまとめ
て書く「パターンマッチ」の実装
 現状: if文にis()とskipTo()との組み合わせでは処理中のサブ
ツリーにパターンがあった場合(入れ子)の処理ができない
 ASTの書き換え処理の実装
 現状: ASTを辿ることはできるが書き換えをサポートしていな
い
まとめ
プル型ASTウォーカーAPI
2016/07/03第14回福岡市西区プログラム勉強会18
 言語処理系の基本データ構造であるAST(Abstract
Syntax Tree)の復習
 Lore言語実装の副産物として汎用ASTライブラリを作成
したので紹介した
 シンプルな単一種類ノードのASTに型チェック付きで様々な型
のアトリビュートを格納するAST実装
 総称型キーを利用した汎用getter
 enumによる簡易なシングルトン・オブジェクトをキーに利用
 ASTを辿る過程をイベント・ストリームに変換してアクセスする
ことでイベント駆動でないプル型のアクセスを可能にするAST
ウォーカーの実装
 マルチスレッド&ブロッキングキューの応用でイベント駆動から変換
 関数型を利用したシンプルな場合分け、検証、スキップ機能

Contenu connexe

Tendances

Constexpr 中3女子テクニック
Constexpr 中3女子テクニックConstexpr 中3女子テクニック
Constexpr 中3女子テクニックGenya Murakami
 
演習:プログラミング言語処理をやってみよう
演習:プログラミング言語処理をやってみよう演習:プログラミング言語処理をやってみよう
演習:プログラミング言語処理をやってみようTakashi Ishio
 
Redmine にいろいろ埋め込んでみた
Redmine にいろいろ埋め込んでみたRedmine にいろいろ埋め込んでみた
Redmine にいろいろ埋め込んでみたKohei Nakamura
 
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメオブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメYoji Kanno
 
RSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjpRSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjpsonickun
 
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.kiki utagawa
 
初心者向けCTFのWeb分野の強化法
初心者向けCTFのWeb分野の強化法初心者向けCTFのWeb分野の強化法
初心者向けCTFのWeb分野の強化法kazkiti
 
katagaitai CTF勉強会 #5 Crypto
katagaitai CTF勉強会 #5 Cryptokatagaitai CTF勉強会 #5 Crypto
katagaitai CTF勉強会 #5 Cryptotrmr
 
マークシート選択式問題における数式処理の活用
マークシート選択式問題における数式処理の活用マークシート選択式問題における数式処理の活用
マークシート選択式問題における数式処理の活用Tatsuyoshi HAMADA
 
ret2dl resolve
ret2dl resolveret2dl resolve
ret2dl resolvesounakano
 
純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門Kimikazu Kato
 
すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!Genya Murakami
 
クロージャデザインパターン
クロージャデザインパターンクロージャデザインパターン
クロージャデザインパターンMoriharu Ohzu
 
マルチコア時代の並列プログラミング
マルチコア時代の並列プログラミングマルチコア時代の並列プログラミング
マルチコア時代の並列プログラミングAkihiko Matuura
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪Takuto Wada
 
templateとautoの型推論
templateとautoの型推論templateとautoの型推論
templateとautoの型推論MITSUNARI Shigeo
 
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」Hiro H.
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるHideyuki Tanaka
 

Tendances (20)

Constexpr 中3女子テクニック
Constexpr 中3女子テクニックConstexpr 中3女子テクニック
Constexpr 中3女子テクニック
 
演習:プログラミング言語処理をやってみよう
演習:プログラミング言語処理をやってみよう演習:プログラミング言語処理をやってみよう
演習:プログラミング言語処理をやってみよう
 
Redmine にいろいろ埋め込んでみた
Redmine にいろいろ埋め込んでみたRedmine にいろいろ埋め込んでみた
Redmine にいろいろ埋め込んでみた
 
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメオブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメ
 
RSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjpRSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjp
 
Glibc malloc internal
Glibc malloc internalGlibc malloc internal
Glibc malloc internal
 
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
 
初心者向けCTFのWeb分野の強化法
初心者向けCTFのWeb分野の強化法初心者向けCTFのWeb分野の強化法
初心者向けCTFのWeb分野の強化法
 
katagaitai CTF勉強会 #5 Crypto
katagaitai CTF勉強会 #5 Cryptokatagaitai CTF勉強会 #5 Crypto
katagaitai CTF勉強会 #5 Crypto
 
マークシート選択式問題における数式処理の活用
マークシート選択式問題における数式処理の活用マークシート選択式問題における数式処理の活用
マークシート選択式問題における数式処理の活用
 
ret2dl resolve
ret2dl resolveret2dl resolve
ret2dl resolve
 
純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門
 
すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!
 
Nmap 9つの真実
Nmap 9つの真実Nmap 9つの真実
Nmap 9つの真実
 
クロージャデザインパターン
クロージャデザインパターンクロージャデザインパターン
クロージャデザインパターン
 
マルチコア時代の並列プログラミング
マルチコア時代の並列プログラミングマルチコア時代の並列プログラミング
マルチコア時代の並列プログラミング
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
templateとautoの型推論
templateとautoの型推論templateとautoの型推論
templateとautoの型推論
 
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
 

En vedette

テンプレート・エンジンVelocity
テンプレート・エンジンVelocityテンプレート・エンジンVelocity
テンプレート・エンジンVelocity隆行 神戸
 
ゲームマップのためのグラフAPIの設計
ゲームマップのためのグラフAPIの設計ゲームマップのためのグラフAPIの設計
ゲームマップのためのグラフAPIの設計隆行 神戸
 
JMeterをWebでしか設定できないサーバの設定自動化に使う
JMeterをWebでしか設定できないサーバの設定自動化に使うJMeterをWebでしか設定できないサーバの設定自動化に使う
JMeterをWebでしか設定できないサーバの設定自動化に使う隆行 神戸
 
XMPPクライアント・プログラミング
XMPPクライアント・プログラミングXMPPクライアント・プログラミング
XMPPクライアント・プログラミング隆行 神戸
 

En vedette (6)

テンプレート・エンジンVelocity
テンプレート・エンジンVelocityテンプレート・エンジンVelocity
テンプレート・エンジンVelocity
 
ゲームマップのためのグラフAPIの設計
ゲームマップのためのグラフAPIの設計ゲームマップのためのグラフAPIの設計
ゲームマップのためのグラフAPIの設計
 
JMeterをWebでしか設定できないサーバの設定自動化に使う
JMeterをWebでしか設定できないサーバの設定自動化に使うJMeterをWebでしか設定できないサーバの設定自動化に使う
JMeterをWebでしか設定できないサーバの設定自動化に使う
 
XMPPクライアント・プログラミング
XMPPクライアント・プログラミングXMPPクライアント・プログラミング
XMPPクライアント・プログラミング
 
XMPPの紹介
XMPPの紹介XMPPの紹介
XMPPの紹介
 
Kancolle
KancolleKancolle
Kancolle
 

Similaire à オレオレ言語実装に役立つプル型ASTウォーカーAPI

TRPGオンラインセッション環境とルール&シナリオ記述言語
TRPGオンラインセッション環境とルール&シナリオ記述言語TRPGオンラインセッション環境とルール&シナリオ記述言語
TRPGオンラインセッション環境とルール&シナリオ記述言語隆行 神戸
 
Tokyo.R女子部発表スライド「Rではじめるデータ解析の超基礎」
Tokyo.R女子部発表スライド「Rではじめるデータ解析の超基礎」Tokyo.R女子部発表スライド「Rではじめるデータ解析の超基礎」
Tokyo.R女子部発表スライド「Rではじめるデータ解析の超基礎」tokyorgirls
 
20180824 DLLab推論ナイト_深層学習モデル推論ライブラリ「Menoh」の紹介/Python以外でDeepLearning
20180824 DLLab推論ナイト_深層学習モデル推論ライブラリ「Menoh」の紹介/Python以外でDeepLearning20180824 DLLab推論ナイト_深層学習モデル推論ライブラリ「Menoh」の紹介/Python以外でDeepLearning
20180824 DLLab推論ナイト_深層学習モデル推論ライブラリ「Menoh」の紹介/Python以外でDeepLearningPreferred Networks
 
goパッケージで型情報を用いたソースコード検索を実現する
goパッケージで型情報を用いたソースコード検索を実現するgoパッケージで型情報を用いたソースコード検索を実現する
goパッケージで型情報を用いたソースコード検索を実現するTakuya Ueda
 
仕事でも Groovy を使おう!
仕事でも Groovy を使おう!仕事でも Groovy を使おう!
仕事でも Groovy を使おう!Oda Shinsuke
 
TRPGオンラインセッション環境とルール&シナリオ記述言語 その2
TRPGオンラインセッション環境とルール&シナリオ記述言語 その2TRPGオンラインセッション環境とルール&シナリオ記述言語 その2
TRPGオンラインセッション環境とルール&シナリオ記述言語 その2隆行 神戸
 
STLの型の使い分け(ダイジェスト版) @ Sapporo.cpp 第7回勉強会 (2014.10.18)
STLの型の使い分け(ダイジェスト版) @ Sapporo.cpp 第7回勉強会 (2014.10.18)STLの型の使い分け(ダイジェスト版) @ Sapporo.cpp 第7回勉強会 (2014.10.18)
STLの型の使い分け(ダイジェスト版) @ Sapporo.cpp 第7回勉強会 (2014.10.18)Hiro H.
 
グラフデータベース「Neo4j」の 導入の導入
グラフデータベース「Neo4j」の 導入の導入グラフデータベース「Neo4j」の 導入の導入
グラフデータベース「Neo4j」の 導入の導入Hisao Soyama
 
オブジェクト指向勉強会(基礎)
オブジェクト指向勉強会(基礎)オブジェクト指向勉強会(基礎)
オブジェクト指向勉強会(基礎)nomuken
 
NNで広告配信のユーザー最適化をやってみた。@ TFUG #3
NNで広告配信のユーザー最適化をやってみた。@ TFUG #3NNで広告配信のユーザー最適化をやってみた。@ TFUG #3
NNで広告配信のユーザー最適化をやってみた。@ TFUG #3Junichiro Katsuta
 
Twitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hackTwitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hackkimukou_26 Kimukou
 
Go静的解析ハンズオン
Go静的解析ハンズオンGo静的解析ハンズオン
Go静的解析ハンズオンTakuya Ueda
 
openFrameworksセミナー(2014)レポート
openFrameworksセミナー(2014)レポートopenFrameworksセミナー(2014)レポート
openFrameworksセミナー(2014)レポートNariaki Iwatani
 
ぼくとしりとりの約3.0*10^3日間戦争
ぼくとしりとりの約3.0*10^3日間戦争ぼくとしりとりの約3.0*10^3日間戦争
ぼくとしりとりの約3.0*10^3日間戦争Eric Sartre
 
来週11/27(日) OSC広島のご紹介
来週11/27(日) OSC広島のご紹介来週11/27(日) OSC広島のご紹介
来週11/27(日) OSC広島のご紹介Yoshitake Takata
 
「自動化...か、かっこいいタル」(憧れ)から始める自動化
「自動化...か、かっこいいタル」(憧れ)から始める自動化「自動化...か、かっこいいタル」(憧れ)から始める自動化
「自動化...か、かっこいいタル」(憧れ)から始める自動化Hirokazu Kutsu
 
TensorFlowによるFizz Buzz
TensorFlowによるFizz BuzzTensorFlowによるFizz Buzz
TensorFlowによるFizz Buzzyaju88
 
20170805-osckyoto-lt-hiroshima
20170805-osckyoto-lt-hiroshima20170805-osckyoto-lt-hiroshima
20170805-osckyoto-lt-hiroshimaYoshitake Takata
 
C#言語機能の作り方
C#言語機能の作り方C#言語機能の作り方
C#言語機能の作り方信之 岩永
 
ML system design_pattern
ML system design_patternML system design_pattern
ML system design_patternyusuke shibui
 

Similaire à オレオレ言語実装に役立つプル型ASTウォーカーAPI (20)

TRPGオンラインセッション環境とルール&シナリオ記述言語
TRPGオンラインセッション環境とルール&シナリオ記述言語TRPGオンラインセッション環境とルール&シナリオ記述言語
TRPGオンラインセッション環境とルール&シナリオ記述言語
 
Tokyo.R女子部発表スライド「Rではじめるデータ解析の超基礎」
Tokyo.R女子部発表スライド「Rではじめるデータ解析の超基礎」Tokyo.R女子部発表スライド「Rではじめるデータ解析の超基礎」
Tokyo.R女子部発表スライド「Rではじめるデータ解析の超基礎」
 
20180824 DLLab推論ナイト_深層学習モデル推論ライブラリ「Menoh」の紹介/Python以外でDeepLearning
20180824 DLLab推論ナイト_深層学習モデル推論ライブラリ「Menoh」の紹介/Python以外でDeepLearning20180824 DLLab推論ナイト_深層学習モデル推論ライブラリ「Menoh」の紹介/Python以外でDeepLearning
20180824 DLLab推論ナイト_深層学習モデル推論ライブラリ「Menoh」の紹介/Python以外でDeepLearning
 
goパッケージで型情報を用いたソースコード検索を実現する
goパッケージで型情報を用いたソースコード検索を実現するgoパッケージで型情報を用いたソースコード検索を実現する
goパッケージで型情報を用いたソースコード検索を実現する
 
仕事でも Groovy を使おう!
仕事でも Groovy を使おう!仕事でも Groovy を使おう!
仕事でも Groovy を使おう!
 
TRPGオンラインセッション環境とルール&シナリオ記述言語 その2
TRPGオンラインセッション環境とルール&シナリオ記述言語 その2TRPGオンラインセッション環境とルール&シナリオ記述言語 その2
TRPGオンラインセッション環境とルール&シナリオ記述言語 その2
 
STLの型の使い分け(ダイジェスト版) @ Sapporo.cpp 第7回勉強会 (2014.10.18)
STLの型の使い分け(ダイジェスト版) @ Sapporo.cpp 第7回勉強会 (2014.10.18)STLの型の使い分け(ダイジェスト版) @ Sapporo.cpp 第7回勉強会 (2014.10.18)
STLの型の使い分け(ダイジェスト版) @ Sapporo.cpp 第7回勉強会 (2014.10.18)
 
グラフデータベース「Neo4j」の 導入の導入
グラフデータベース「Neo4j」の 導入の導入グラフデータベース「Neo4j」の 導入の導入
グラフデータベース「Neo4j」の 導入の導入
 
オブジェクト指向勉強会(基礎)
オブジェクト指向勉強会(基礎)オブジェクト指向勉強会(基礎)
オブジェクト指向勉強会(基礎)
 
NNで広告配信のユーザー最適化をやってみた。@ TFUG #3
NNで広告配信のユーザー最適化をやってみた。@ TFUG #3NNで広告配信のユーザー最適化をやってみた。@ TFUG #3
NNで広告配信のユーザー最適化をやってみた。@ TFUG #3
 
Twitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hackTwitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hack
 
Go静的解析ハンズオン
Go静的解析ハンズオンGo静的解析ハンズオン
Go静的解析ハンズオン
 
openFrameworksセミナー(2014)レポート
openFrameworksセミナー(2014)レポートopenFrameworksセミナー(2014)レポート
openFrameworksセミナー(2014)レポート
 
ぼくとしりとりの約3.0*10^3日間戦争
ぼくとしりとりの約3.0*10^3日間戦争ぼくとしりとりの約3.0*10^3日間戦争
ぼくとしりとりの約3.0*10^3日間戦争
 
来週11/27(日) OSC広島のご紹介
来週11/27(日) OSC広島のご紹介来週11/27(日) OSC広島のご紹介
来週11/27(日) OSC広島のご紹介
 
「自動化...か、かっこいいタル」(憧れ)から始める自動化
「自動化...か、かっこいいタル」(憧れ)から始める自動化「自動化...か、かっこいいタル」(憧れ)から始める自動化
「自動化...か、かっこいいタル」(憧れ)から始める自動化
 
TensorFlowによるFizz Buzz
TensorFlowによるFizz BuzzTensorFlowによるFizz Buzz
TensorFlowによるFizz Buzz
 
20170805-osckyoto-lt-hiroshima
20170805-osckyoto-lt-hiroshima20170805-osckyoto-lt-hiroshima
20170805-osckyoto-lt-hiroshima
 
C#言語機能の作り方
C#言語機能の作り方C#言語機能の作り方
C#言語機能の作り方
 
ML system design_pattern
ML system design_patternML system design_pattern
ML system design_pattern
 

オレオレ言語実装に役立つプル型ASTウォーカーAPI

  • 1. オレオレ言語実装に役立つ プル型ASTウォーカーAPI 神戸隆行(椎路ちひろ)Twitter: @ChihiroShiiji / FB: takayuki.kando 2016/07/03(第14回福岡市西区プログラム勉強会資料) XGMTK & Lore
  • 2. 自己紹介  神戸 隆行(かんど たかゆき)、PN. 椎路ちひろ(しいじ ちひろ) Twitter: @ChihiroShiiji / FB: takayuki.kando  出身は名古屋、趣味イラストとコスプレ  九大の社会人博士課程で博士を取ろうとしながら研究開発に従事する失業者  専門は流転中:  数値解析(のプログラミング・インターフェースの改良、修論@名大) →数式処理(のプログラミング・インターフェースの改良@某F研) →プログラム最適化(博士課程一回目の失敗@東工大) (2005年に仕事を紹介され福岡へ来た) →コンパイラ開発(Redefis、動的再構成可能プロセッサ向けコンパイラ) →SW/HW開発環境(IDE上からクラウド上の開発ツールを利用できるミドルウェア PTaaSの開発) http://www.qualiarc.com/?post_type=seihin&p=202  使用プログラミング言語:  最初はFORTRAN、大学以降はC++とC、今は主にJava、他は必要に応じてボチボチ  本日は趣味で開発しているLore言語の実装の副産物  幾つかのソースとサンプルをGitHub[ https://github.com/TakayukiKando/LoreAST ]に置いてま す 2016/07/032 第14回福岡市西区プログラム勉強会
  • 3. 本日の内容「プル型ASTウォーカーAPI 」 2016/07/03第14回福岡市西区プログラム勉強会3  LoreAST  TRPGルールシナリオ記述言語Loreの実装に使うつもりで作 成しているASTライブラリ  オンライン/オフライン・セッション支援ツールXGMTKで利用する  XGMTKはルールやシナリオを実行可能な形で記述することでルール主 導のセッション支援ツール  本日は主にそのASTにアクセスするAPIの設計について  構文解析結果を保存するデータ構造としてツリーは良いけれど、意 外とアクセスが面倒くさい  先行事例を調べていないのでもしかしたら「あるある」事 例かも  ……まぁ小ネタですし
  • 4. 具象構文木(CST…Concrete Syntax Tree) と 抽象構文木(AST…Abstract Syntax Tree) 2016/07/03第14回福岡市西区プログラム勉強会4 例(代入文): d=(a+b)*c; 代入文 =d 式 * c項 + ba 項 )( CST: 構文規則の適用を記録し、ソースの記号列の解 析結果を忠実に記録したデータ構造 非終端記号 終端記号 代入文 id: d 式: * id: c式: + id: bid: a AST: 構文が表現していたプログラムの構造を抽象的 に表現したデータ構造 構文解析のデ バッグに便利 プログラムの解 析に便利
  • 5. ASTの実装 - Node.java 2016/07/03第14回福岡市西区プログラム勉強会5 public final class Node { private final Map<Attribute<?>, Object> attrs; /* アトリビュート(後述) */ private final List<Node> children; /* 子ノード */ /* コンストラクタ */ public Node(List<Node> children){/* 省略 */} public Node(Node...children){/* 省略 */} /* アトリビュート(後述)の取得と設定、存在の確認 */ public final <T> void setAttribute(Attribute<T> attribute, T value){/* 省略 */} public final <T> T getAttribute(Attribute<T> attribute){/* 省略 */} public Map<Attribute<?>, Object> attributes() {/* 省略 */} public final <T> boolean hasAttribute(Attribute<T> attribute){/* 省略 */} /* 子ノードの追加と取得 */ public final void addChildren(Node...children){/* 省略 */} public final void addChildren(List<Node> children) {/* 省略 */} public List<Node> children(){/* 省略 */} /* 等値演算とハッシュコード(ツリー比較、テスト用) */ @Override public boolean equals(Object obj){/* 省略 */} @Override public int hashCode() {/* 省略 */} /* ビジター受け入れメソッド(後述) */ public final void startVisit(Visitor visitor) {/* 省略 */} }
  • 6. 追加可能で静的型検査可能なアトリビュート・ マップ 2016/07/03第14回福岡市西区プログラム勉強会6 public interface Attribute<T> { } • アトリビュートのキーとなるenum型群のためのインターフェー ス • 型パラメータTがミソ public class Attributes{ public enum LocationAttr implements Attribute<Location>{ LOCATION; } public static final LocationAttr LOCATION = LocationAttr.LOCATION; public enum StringAttr implements Attribute<String>{ SYMBOL; } public static final StringAttr SYMBOL = StringAttr.SYMBOL; } public final <T> T getAttribute(Attribute<T> attribute){/* 省略 */} • NodeのgetAttributeメソッド…キーの型パラメータの型と同じ型が返る • enumにしてるのはキーをお手 軽にシングルトンにするため • Locationはノードの由来となっ たコードの位置を示すデータ構 造(エラーメッセージ等に利用) • ここでは記号文字列を格納する SYMBOLとソースコード上の位 置を示すLOCATIONだけだが、 Attribute<T>を継承すれば追加 できる。
  • 7. ツリーを辿る(1)…ビジタ(Visitor) 2016/07/03第14回福岡市西区プログラム勉強会7  アルゴリズムによって定まる順番 でツリーのノードを訪問するビジ ター  深さ優先探索や幅優先探索など  ツリーを辿る定番デザイン・パター ン  長所: enterとleaveメソッドの呼び 出しによりサブツリーの開始と終 了を認識できる  短所: コールバックによるイベント 駆動的なコードになり構造をツリー の意識した記述がしにくい  ASTではサブツリーのパターンに よって処理を分けて記述するような ことがしたい  ノードの種類を増やしてビジタのメ ソッドを増やして実装をFatにすれば ある程度できるが、メンテが面倒に  短所: 継承が必須であり、用途毎 にビジタ・クラスが増える 代入文 id: d 式: * id: c式: + id: bid: a enter #0 leave #6 enter #1 leave #0 enter #2 leave #5 enter #3 leave #3 enter #4 leave #1 enter #5 leave #2 enter #6 leave #4 順番の例、深さ優先探索の場合 • vをビジタ・オブジェクトとして以下の様に動作: • ノードに初回訪問時にv.enter()が呼ばれる • ノードへの最後の訪問時(leafノードでは v.enter()の直後)にv.leave()が呼ばれる
  • 8. ツリーを辿る(2)…イテレータ(Iterator) 2016/07/03第14回福岡市西区プログラム勉強会8  アルゴリズムによって定まる順番で ツリーのノードを訪問することをイテ レータ化  深さ優先探索や幅優先探索など  ツリーに限らずグラフ探索全般で利用で きる簡単で優れた抽象化  長所: 制御をプログラム主導で行え るのでアルゴリズムが記述し易い  短所: AST処理で良くある、サブツ リーを辿り終わった後で何か処理を するようなコードが書きにくい  サブツリーのルートノードを再訪する アルゴリズムにしたとしても初回と再 訪が区別できない  区別する述語は追加できるがあまり使い やすくはない 代入文 id: d 式: * id: c式: + id: bid: a #0 #1 #2 #3 #6 #4 #5 順番の例、深さ優先探索の場合 • itをイテレータ・オブジェクトとして以 下の様に動作: • it.next()すると次のノードが取れ る • it.hasNext()が真を返している間 は次がある
  • 9. ツリーを辿る(3)…プル型ウォーカ(Pull Walker) 2016/07/03第14回福岡市西区プログラム勉強会9  アルゴリズムによって定まる 順番でツリーのノードを訪問 することをイベント・ストリー ムに変換する  深さ優先探索や幅優先探索 など  長所: enterとleaveイベント によりサブツリーの開始と 終了を認識できる  長所: イテレータ同様にプロ グラム主導で行えるのでア ルゴリズムが記述し易い  ASTではサブツリーのパ ターンによって処理を分けて 記述するようなことがしたい 代入文 id: d 式: * id: c式: + id: bid: a enter #0 leave #6 enter #1 leave #0 enter #2 leave #5 enter #3 leave #3 enter #4 leave #1 enter #5 leave #2 enter #6 leave #4 順番の例、深さ優先探索の場合 • sをイベント・ストリーム・オブジェクトとして以下の様に動 作: • s.next()で次のイベントへ遷移 • getCurrentEvent()でイベント取得 • イベントはSTART(初期状態)、ENTER(ノード訪問)、 LEAVE(サブツリー終了)、FINISH(ツリー全体の終 了)の4タイプで、現在のノードが格納されている
  • 10. アイディア元: XML Pull Parser  http://www.xmlpull.org/  実装例  kXML  Web: http://www.kxml.org/  SourceForge(JARファイル): https://sourceforge.net/projects/kxml/  MXP1(Smackが使っているが、ダウンロードURLがリンク切 れ)  http://www.extreme.indiana.edu/xgws/xsoap/xpp/mxp1/  XMLのパース結果をイベントストリームに変換  SAXパーサ(イベント駆動)とDOMツリーの間を取ったXML パーサインターフェース 2016/07/0310 第14回福岡市西区プログラム勉強会
  • 11. イベント・ストリーム Visitorスレッド プル型ツリーウォーカの構造 2016/07/03第14回福岡市西区プログラム勉強会11 代入文 id: d 式: * id: c式: + id: bid: a enter #0 leave #6 enter #1 leave #0 enter #2 leave #5 enter #3 leave #3 enter #4 leave #1 enter #5 leave #2 enter #6 leave #4 ビジタ 固定長 ブロッキング・ キュー 利用側 スレッド ひたすら辿っ てイベントを作 成して投入 利用側の好きなタ イミングで順にイベ ントを取り出す • イベント駆動の挙動を変換するのに使っているだけなのでキューの容量は0でも良 い • 利用側の処理速度によってはツリーの全ノード分のイベントがキューに溜まる可能 性があるので可変長は止めておいた方が良い
  • 12. ASTStream.java (1) - フィールド 2016/07/03第14回福岡市西区プログラム勉強会12 public class ASTStream { /* プライベート定数省略 */ /* フィールド */ private ASTEvent current; // 現在のイベント private final BlockingQueue<ASTEvent> queue; // イベント・キュー private final Node root; // 現在のノード private final Visitor visitor; // ツリーを辿るビジター private final ExecutorService executor; // スレッド実行サービス private boolean finished; // 終了状態を示すフラグ /* 内部クラスとプライベートメソッド省略 */
  • 13. ASTStream.java (2) - メソッド 2016/07/03第14回福岡市西区プログラム勉強会13 /* コンストラクタ */ public ASTStream(Node root, int queueLength) {/* 省略 */} public ASTStream(Node root){/* 省略 */} /* ストリームの開始 */ public Future<Boolean> start(){/* 省略 */} /* 現在のイベント */ public ASTEvent getEvent(){/* 省略 */} /* 現在のイベントのノード */ public Node getNode(){/* 省略 */} /* 次のイベントへ遷移 */ public void next() throws IllegalStateException {/* 省略 */} /* 判定と検証(後述) */ public boolean is(Predicate<ASTEvent> predicate) {/* 省略 */} public void require(Predicate<ASTEvent> predicate) throws ASTStreamInvalidException {/* 省略 */} /* スキップ(後述) */ public void skipTo(Predicate<ASTEvent> predicate) {/* 省略 */} }
  • 14. イベントの判定と検証 2016/07/03第14回福岡市西区プログラム勉強会14  is(predicate)  現在のイベントに応じて場合分けするための述語  require(predicate)  現在のイベントが想定通りかどうか検証し、不正な場合は例 外を投げる  predicateはPredicate<ASTEvent>型の1引数関数オブ ジェクト  EventMatcherに良く使う述語を返すメソッドを用意してある
  • 15. EventMatcher 2016/07/03第14回福岡市西区プログラム勉強会15  match(type)  イベント型がtypeであることを判定する述語を返す  主に他の述語との組み合わせ用だがSTARTとFINISHの判定にも使う  match(attribute, value)  attributeで指定されるアトリビュートがvalueに等しいことを判定する述語を返す  主に他の述語との組み合わせ用  match(type, attribute, value)  イベント型がtypeでattributeで指定されるアトリビュートがvalueに等しいことを 判定する述語を返す  enter(attribute, value)  イベント型がENTERでattributeで指定されるアトリビュートがvalueに等しいことを判定す る述語を返す  same(node)  指定されたノード同じノードのイベントであることを判定する述語を返す  主に他の述語との組み合わせ用  leave(node)  指定されたノードのLEAVEイベントであることを判定する述語を返す
  • 16. イベントのスキップ 2016/07/03第14回福岡市西区プログラム勉強会16  ASTの全てのノードを処理しない応用も多いので処理し ないノードをスキップできると便利  skipTo(predicate)  条件に合うイベントまでスキップ  predicateはis()及びrequire()と同じ  実装はis(predicate)が真になるまでnext()が繰り返し呼ばれ るだけ  計測していないが、マルチプロセッサ環境ではイベントキューの容量 を0より程良く大きくしておくと、スキップしない処理の間にキューにイ ベントが貯まってskipTo()が早くなるかも?
  • 17. 今後 2016/07/03第14回福岡市西区プログラム勉強会17  特定の条件とその条件に合致した場合の処理をまとめ て書く「パターンマッチ」の実装  現状: if文にis()とskipTo()との組み合わせでは処理中のサブ ツリーにパターンがあった場合(入れ子)の処理ができない  ASTの書き換え処理の実装  現状: ASTを辿ることはできるが書き換えをサポートしていな い
  • 18. まとめ プル型ASTウォーカーAPI 2016/07/03第14回福岡市西区プログラム勉強会18  言語処理系の基本データ構造であるAST(Abstract Syntax Tree)の復習  Lore言語実装の副産物として汎用ASTライブラリを作成 したので紹介した  シンプルな単一種類ノードのASTに型チェック付きで様々な型 のアトリビュートを格納するAST実装  総称型キーを利用した汎用getter  enumによる簡易なシングルトン・オブジェクトをキーに利用  ASTを辿る過程をイベント・ストリームに変換してアクセスする ことでイベント駆動でないプル型のアクセスを可能にするAST ウォーカーの実装  マルチスレッド&ブロッキングキューの応用でイベント駆動から変換  関数型を利用したシンプルな場合分け、検証、スキップ機能