メタプログラミングとRuby

1,965 views

Published on

久留米ビジネスプラザ Ruby講習会 2014/03/29 前座のお話

Published in: Education

メタプログラミングとRuby

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

×