Your SlideShare is downloading. ×
0
メタプログラミングって何だろう
メタプログラミングって何だろう
メタプログラミングって何だろう
メタプログラミングって何だろう
メタプログラミングって何だろう
メタプログラミングって何だろう
メタプログラミングって何だろう
メタプログラミングって何だろう
メタプログラミングって何だろう
メタプログラミングって何だろう
メタプログラミングって何だろう
メタプログラミングって何だろう
メタプログラミングって何だろう
メタプログラミングって何だろう
メタプログラミングって何だろう
メタプログラミングって何だろう
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

メタプログラミングって何だろう

8,486

Published on

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
8,486
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
5
Comments
0
Likes
1
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide
  • AC-FIRST とかについて突っ込んだ質問を受けたときに備えて、別のスライドを作っておく。
  • Transcript

    • 1. メタプログラミングって 何だろう 筑波大学システム情報工学研究科 水島宏太 at メタプログラミングの会
    • 2. 自己紹介とか
      • Twitter: @kmizu
      • はてな : id:kmizushima
      • github: http://github.com/kmizu/
        • Onion: http://github.com/kmizu/onion
        • PEGEX: http://github.com/kmizu/pegex
      • 大学院生 ( 博士後期過程 )
        • 構文解析の研究とかやってます
        • 就職決まりました
      • プログラミング言語好き
    • 3. とりあえずググってみる
    • 4. Wikipedia(ja) を見てみる
      • わけがわかりません><
    • 5. Wikipedia(en) を見てみる
      • Metaprogramming is the writing of computer programs that write or manipulate other programs (or themselves) as their data, or that do part of the work at compile time that would otherwise be done at runtime . In many cases, this allows programmers to get more done in the same amount of time as they would take to write all the code manually, or it gives programs greater flexibility to efficiently handle new situations without recompilation.
      • こっちの方はまともそう
    • 6. 翻訳 ( 適当 ) してみる
      • メタプログラミングとは、他のプログラム ( あるいは自身 ) を操作したり出力するプログラムを書くこと、または作業の一部をコンパイル時に行い、残りの作業を実行時に行うようなプログラムを書くことである。多くのケースで、手作業でコードを書くのに比べて、メタプログラミングによってより多くの作業を行うことができる、あるいは再コンパイル無しに新しい状況に対応できる柔軟性を得ることができる。
    • 7. メタプログラミングの会における、俺定義
      • プログラムを入力から出力への関数とみなした時に
        • プログラム -> プログラム or
        • データ -> プログラム or
        • プログラム -> データ
      • であるようなプログラムを メタプログラム と呼ぶ
      • メタプログラムの記述言語を メタ言語 、操作対象のプログラム言語を 対象言語 と呼ぶ ( ことにする )
      • そのようなプログラムを作成する作業を
      • メタプログラミング と呼ぶ
      • Wikipedia(en) の定義とだいたい同じ
    • 8. メタプログラムの例
      • コンパイラ ( あるいはトランスレータ )
        • ホスト言語のプログラム->対象言語のプログラム
      • パーザジェネレータ
        • 言語の文法->対象言語によるパーザプログラム
      • ある種の O/R マッパー
        • 宣言的なテーブルの仕様-> SQL( 対象言語 ) のコード
      • XML スキーマコンパイラ
        • XML によるスキーマ定義-> XML の読み込み / 書き込みを行うための対象言語のプログラムコード
      • メタプログラムは遍在している
    • 9. ( たぶん ) メタプログラムで ない ものの例
      • 階乗やフィボナッチ数を計算するプログラム
        • 自然数->自然数
      • Twitter のタイムラインを JSON や XML 形式でフォーマットして出力するプログラム
        • タイムラインの出力の JSON や XML 自体をプログラムとみなすことは不適当
      • ふつーのブログサービス
      • ふつーのショッピングサイト
      • その他諸々
    • 10. メタプログラミングをサポートする言語機能
      • どの段階で作用するかによっていくつかに大別可能
      • 1.字句解析フェーズ
        • 対象言語のプログラムをトークン列とみなした変換方法を提供する
        • e.g. C のプリプロセッサマクロ
      • 2.構文解析フェーズ
        • 対象言語のプログラムを抽象構文木とみなした変換方法を提供
        • e.g. Lisp マクロ
      • 3.意味解析フェーズ
        • 対象言語の意味解析時に得られる情報を利用した変換を行う
        • e.g. C++ テンプレート ,D テンプレート
      • 4.実行時
        • 実行時に現在動作中のプログラム自身を変更する方法を提供する
        • e.g. 動的言語における eval 系の機能
      • あくまで目安
        • 必ずしも明確に区別できるわけではない
        • 複数のフェーズにまたがる場合も存在する
    • 11. メタプログラミングをサポートする言語機能の比較軸
      • メタ言語の表現力
      • 対象言語とメタ言語が同じかどうか
      • 対象言語のデータがどのような形で提供されるか
      • 提供する変換モデル
    • 12. メタ言語の表現力
      • 高い方が色々できる
        • が、メタプログラム自体の検証がやりにくくなる
      • 低いとできる事が減る
        • メタプログラム自体の検証はしやすい ( かもしれない )
      • 表現力が低いメタ言語の例
        • C プリプロセッサマクロ
      • 表現力が高いメタ言語の例
        • Lisp マクロ
    • 13. 対象言語とメタ言語の同一性
      • 同じ方が覚えること ( 約束事 ) が少なくて済む
        • が、ベタとメタの間で混乱しやすいかも
        • メタ言語が対象言語に引っ張られるので、良い変換モデルを提供するのが難しいかもしれない
      • 対象言語とメタ言語が同じ例:
        • Lisp マクロ、 Nemerle マクロ
      • 対象言語とメタ言語が違う例:
        • C++ テンプレート、 D テンプレート、 C プリプロセッサ、 Camlp4
    • 14. 対象言語のデータ形式
      • 構造化データで提供されていた方が扱いやすい
      • 型情報など、付加情報は多いほど良い ( たぶん )
      • 文字列 ( 非構造化データ )
        • Ruby 等の eval
      • トークン列
        • C プリプロセッサ
      • 抽象構文木
        • Lisp マクロ、 Camlp4(?)
      • 型付き抽象構文木
        • Nemerle マクロ
      • その他
        • C++ テンプレート、 D テンプレート
    • 15. 提供する変換モデル
      • 局所的 ( 関数的 ) 変換
        • 影響が出る範囲が予測しやすいので扱いやすい
        • 「外」の文脈情報を扱うのが難しい
        • Lisp マクロ、 C プリプロセッサマクロ
      • 大域的 ( 手続き的 ) 変換
        • メタプログラムの影響範囲を予測するのが難しい
        • 大域的な文脈情報を取り扱えるので、柔軟
        • Ruby の eval など
      • ハイブリッド
        • 両者の特徴を併せ持つ
        • Nemerle のマクロ
    • 16. まとめ
      • メタプログラミングについて、テキトーに考えたことをだらだら述べました
      • よく考えずに書いたのでツッコミどころ満載かも
      • 結論はとくに無い
        • が、このように分類してみることには何か意味があるかも
      • 休憩時とかにがんがん議論しましょう

    ×