めたぷろぐらみんぐ続き

英語版Wikipediaが自分の感覚に近いなあ。
http://twitter.com/kinaba/status/1348408180

ということで英語版Wikipediaを参照。

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 runtime that would otherwise be done at compile time. 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.
http://en.wikipedia.org/wiki/Metaprogramming

物凄く大雑把に要約してみました。

  • metaprogramming
    • generative programming
      • ソースを生成すること。
      • .shを吐く.shの例。
      • 当然quineも含まれる。
      • コンパイラ、lexやyaccも含まれるらしい。
    • reflection
    • 他には、他言語の言語要素を扱う例として、インタプリタ
      • RemObject's Pascal Scriptってまたピンポイントな例が挙げられています。
    • language-oriented programming
      • なんかよくわからんですがヘビーにメタプログラミングをするスタイル。
      • domain-specific programming languages
        • DSL。language-oriented programmingの例。

個人的にはコンパイラやlexやyaccがソース(機械語)を吐くのはコンパイラやlexやyacc自身のためではないのでメタプログラミングには当たらない気がしますけれども……うーん。
こうして対象言語が別でも良いということはやはりプログラムを扱うプログラムは全部メタプログラミング

あと文脈上、同じリフレクションでもJavaのあれやDelphiのそれはここで言うリフレクションに含まれない?扱うのはあくまでメモリ上のデータやコードのアドレスで、アドレス計算のために専用に用意されたメタデータ扱ってるだけですし、どうでしょう。それとも自身のソースコードの形がそのままメタデータに反映されているわけですからこれもメタプログラミング

.shの例については、バッチファイルからバッチファイルを吐いてチェインなんてよくやってたのに忘れていたとは迂闊……。

それにしても、どうにも私の中では、「普通に書いてもいいけどメタプログラミングするとこんなに楽だよ!」みたいな印象が強過ぎた気がします。いろいろ教えていただきありがとうございます。これからは堂々と他のプログラムを起動するだけのプログラムを書いてめたぷろぐらみんぐですよと言い張りたいと思います。