狠狠撸

狠狠撸Share a Scribd company logo
メタプログラミングと
Ruby
電子認証局市民ネットワーク福岡
佐塚秀人
2014/3/29
1
近所の小学生
少年A: ば?か!
少年B: ば?かって言うやつが馬鹿なんだぞ!
2014/3/29
2
メタプログラマー
プログラムつくるのがプログラマー
プログラムをつくるプログラムをするプログラマー
2014/3/29
3
メタって? Meta?
2014/3/29
4
メタ-なんとか
? メタ(meta-)とは、「高次な-」「超-」「-間
の」「-を含んだ」「-の後ろの」等の意味の接頭語。
ギリシャ語から。
? コンピュータの世界ではよく出てくる言葉なんだ
? メタ-言語
? メタ-文法
? メタ-データ
? メタ-プログラミング
2014/3/29
5
メタプログラミング
? プログラムする機能をプログラムする
? プログラムを生成するようなプログラムをする
? プログラムを生成しながら動くプログラムをつくる
? プログラミング言語の機能をプログラムする
2014/3/29
6
Myプログラミング
? 書きたいように書けるプログラミング言語
? より簡潔に書ける文法や機能
? 目的にあった記法 DSL
? 組み込み言語
2014/3/29
7
プログラムを動かすしくみを
自分で作る
? コンパイラ
? インタプリタ
これは作るのはけっこうたいへんだ
既存の言語をカスタマイズ…
? マクロ?プロセッサ
? トランスレータ
? コンパイラ?コンパイラ(パーザジェネレータ)
2014/3/29
8
Cのプリプロセッサ
Cのプリプロセッサは簡単だがいろいろできる?
#define begin {
#define end ;}
これでC言語をPascal風に記述できる
begin
x = 10;
y = 20
end
{
x = 10;
y = 20;
}
2014/3/29
9
昔からUnixにある道具
? m4 -- マクロプロセッサ
? yacc, lex -- コンパイラ?コンパイラ
C言語を変換したり、加工したりする道具
C++言語はもともとはC言語へのトランスレータだった
2014/3/29
10
LISPを知ってますか?
? 世界で2番めに作られた高級言語
? 1958年、ジョン?マッカーシー
? プログラムもデータもすべてリスト構造で表現
? インタプリタ言語
プログラムも内部でリスト構造をしている
プログラムをプログラムで操作し、すぐ実行できる
メタプログラミングの世界へ!
2014/3/29
11
LISPプログラム
2014/3/29
12
defmacro
(defmacro revdo (&rest lis)
(revserse lis)
)
> (revdo 1 2 3 +)
6
実行前にプログラムの構造を自由に変更できる
※ただし、リスト表現の範囲だけどね?
2014/3/29
13
インタプリタ言語は素敵
? 解釈機能自体をプログラミングできるようにできる
? 自分自身の機能を変更できる
? メタプログラミングで自由自在!
? メタプログラミングの世界へ!
2014/3/29
14
関数型言語
? 関数を組みわせるプログラミングモデル
? 高階関数
? 関数自身引数とする関数
? 関数を組み合わせる機能を関数で記述できる
? 関数 = プログラムのパーツ
? プログラムする機能をプログラムできる!
? メタプログラミングの世界へ!
2014/3/29
15
オブジェクト指向言語
? オブジェクト指向言語の元祖:Smalltalk80
? クラスとインスタンス
? クラスはオブジェクトのひな形
? Smalltalk80ではクラスもオブジェクト
? クラスをダイナミックに操作できる
? インタプリタ自体がオブジェクト指向で作られている
? メタプログラミングの世界へ!
2014/3/29
16
Ruby
? インタプリタ言語
? 関数型言語の機能
? Smalltak80を継承するオブジェクト指向言語
? メタプログラミングならRubyでしょ!
2014/3/29
17
Rubyを大改造?
? Ruby on Rails
? メタプログラミングを駆使したフレームワーク
? 言語の基本機能を積極的に改変する
? Ruby on Railsの記法(文法?)の実現
2014/3/29
18
RubyでDSL
? DSL:ドメイン特化言語
? Ruby+メタプログラミングで実現
? 組み込み言語をRubyで…
? mRuby+メタプログラミング…
? 組み込みDSLで簡単プログラミング
2014/3/29
19
やわらかRuby
? オープンクラス/モンキーパッチ
? 柔軟でゆる?い文法
? イテレータを基本とした制御構造
? 手続きブロック
? 関数表現(λ式)
2014/3/29
20
オープンクラス
? クラスの定義をいつでも追加?変更可能
? クラス機能に自由にパッチ(モンキーパッチ)
? 特異クラス
2014/3/29
21
メソッド?コマンド?宣言?
foo(a, b, c)
は
foo a, b, c
と書いてもいい
ご自由に解釈を…
文法上の宣言と思っていたものが、実はメソッド呼び
Ex. private宣言
2014/3/29
22
好きに作ろう繰り返し
? イテレータで自由につくる繰り返し
? timesの機能(kai)はこんな風に追加できてしまう
class Fixnum
def kai
i = 0
while i < self do
yield i
i += 1
end
end
end
2014/3/29
23
クラスもメソッドも
? クラスはClassクラスのメソッドなので
MyClass = Class.new(MySuperClass) { … }
? メソッドをつくるメソッド
def mymethod(x) { … }
は
define_method(:mymethod) {|x| … }
と書けるし
define_method :mymethod do |x| … end
でもいい
2014/3/29
24
Rubyの仕組みはおもしろい
? どこからがメタプログラミングなのか?
? RubyはRubyでプログラムされている。
? Rubyはかなり自由に手を入れられる。
? Ruby言語がRubyではない。
2014/3/29
25
DSLの方針
? 構文はイテレータ
? 一括定義は関数、ブロック、
2014/3/29
26
mRubyでメタプログラミング
? Rubyはかなり大きい
? ちいさなRuby、mRuby
? 組み込み言語として使えるRuby
? C言語じゃなくてmRubyを使う理由
? メタプログラミングが可能だから…
2014/3/29
27
こんな本が読まれているよう
です。
2014/3/29
28
メタプログラミングと搁耻产测

More Related Content

メタプログラミングと搁耻产测