[解決済み] メタプログラミングとは何ですか?
質問
TheServerSideの記事を読んでいたら Javaプラットフォームでのプログレッシブ・プログラミング . 記事の中のいくつかのコメントでは、メタプログラミングを、(おそらくその場で)コードを生成する能力として言及しています。
メタプログラミングは、その場でコードを生成する能力なのか、それとも実行時に既存のオブジェクトにメソッドや属性を注入する能力なのか(Python、Ruby、Groovyなどの一部の動的言語が許容するような)。
どのように解決するの?
メタプログラミングとは、プログラムが自分自身についての知識を持ち、自分自身を操作することができる様々な方法のことを指します。
C#のような言語では、プログラムが自分自身に関する情報を調べることができるので、リフレクションはメタプログラミングの一種である。例えば、あるオブジェクトのすべてのプロパティのリストを返すことができます。
ActionScriptなどの言語では、eval("x" + i)のように、実行時に関数を評価して新しいプログラムを作成することができます。DoSomething() は、i が 1 のとき x1 というオブジェクトに、i が 2 のとき x2 というオブジェクトに影響を与えます。
最後に、メタプログラミングのもう一つの一般的な形態は、プログラムが自明でない方法で自分自身を変更できる場合です。LISPはこの点でよく知られており、10年ほど前にPaul Grahamが唱えたものです。彼の具体的なエッセイを調べてみる必要がありそうです。しかし、このアイデアは、プログラムがその状態に応じて別の部分を変更するというものだ。これによって、現在普及しているほとんどの言語では非常に困難な、実行時の意思決定の柔軟性を実現することができるのです。
また、ストレートアセンブリでプログラミングしていた古き良き時代には、実行時に自己変更するプログラムが必要であり、ごく当たり前のことであったことも特筆すべき点です。
ポール・グラハムのエッセイより 何がLispと違うのか? :
<ブロッククオート多くの言語には マクロを使用します。しかし、Lispのマクロは独特です。そして 信じられないかもしれませんが、その役割は は括弧に関連している。この Lispの設計者は、このような 括弧があるのは、単に 異なる。Blubプログラマーにとって Lispのコードは変に見える。しかし、これらの 括弧があるのは理由があるからです。 括弧は外見上 Lispの基本的な違い と他の言語があります。
LispのコードはLispのデータでできています。 オブジェクトになります。そして、些細な意味ではなく ソースファイルには 文字であり、文字列はその一つである。 のデータ型がサポートされています。 LISPのコードは、その後に パーサーはデータ構造でできています。 をたどることができる。
コンパイラの仕組みを理解すれば ということではありません。 Lispが奇妙な構文を持っていることよりも Lispには構文がない。プログラムを書く 生成される構文木で コンパイラで他の の言語がパースされます。しかし、これらのパース ツリーに完全にアクセスすることができます。 プログラムです。プログラムを書くことができます。 を操作することができます。Lispでは、このような のことをマクロと呼びます。マクロは プログラムを書くためのプログラムです。
プログラムを書くプログラム?いつ そんなことをしたいと思うことがあるだろうか?ないでしょう。 Cobolで考えると、あまりないですね。すべての Lispで考えるなら、いつでも。それは ここで、もし私が 強力なマクロの例を挙げる。 と言って、そこで!どうでしょう?しかし、もし のように見えるだけです。 を知らない人が見たら、ちんぷんかんぷんでしょう。 Lispを説明するスペースはありません。 を知るために必要なことすべてを の意味を理解することができます。で アンシ コモンリスプ を進めようとしました。 出来るだけ早く、そしてそれでも マクロにたどり着いたのは160ページでした。
しかし、私は、ある種のものを提供することができると思います。 納得できるかもしれない議論。その Viawebエディターのソースコードは マクロは20〜25%くらいでしょうか。マクロは は普通のLispより書くのが難しい を使うのは良くないとされています。 不要なときに使うのは悪いスタイルです。 必要です。ですから、このコードに含まれるすべてのマクロは があるのは、そうでなければならないからです。その理由は つまり、少なくとも20~25%は このプログラムのコードは にはできないことです。 他の言語 どんなに懐疑的でも Blubプログラマーは、私の の神秘的な力を主張する。 Lispに興味を持つはずです。 私たちは、このコードを自分たちのために書いているのではありません。 自分たちの娯楽として。私たちは小さな新興企業でした 一生懸命にプログラミングして 技術的な壁を作るために 競合他社に差をつける
怪しいと思った人は 何か相関関係があるのだろうか? ここで 私たちのコードの大きな塊は 非常に困難なことをやっている 他の言語では その結果 競合他社がやっているようなことを ができない。もしかしたら 何らかのつながりがあるのでしょう。ぜひ その糸をたどってみてください。もしかしたら あの老人には、もっと多くのことがある。 松葉杖をついているのは、見かけによらない。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン