元编程:编写在运行时操纵语言构件的代码。 --《Ruby元编程》
应该是借鉴了lisp里的宏(macro)。其他语言里还有类似的用法吗?
人生最曼妙的风景,竟是内心的淡定与从容!
次のようにしましょう: 工業化時代の初期には、次のような状況がありました: 人間が機械を作り、機械が製品を作ります。
後の段階: 人は機械を生産し、機械は機械を生産し、機械は製品を生産します。
明らかに、機械生産機械は大きな進歩であり、労働力を大幅に解放します。
メタプログラミングは、簡単に言うと、プログラム自体を変更したり、新しいプログラムを生成したりすることができる機械に似ています。もちろん、これによりプログラマは大幅に解放されます。
もちろん、実際には、メタプログラミングが行われる前に、プログラマーは、IDE などのプログラミングを支援する多数の補助ツールを発明しました。しかしその後、プログラマは、IDE がまだ弱すぎると感じたため、検索と置換、参照へのジャンプ、テンプレートの適用などが可能でした。プログラムが自動的に生成できれば素晴らしいでしょう。
====================科学の普及は完了、ここに無責任な思考================== == ==
実際、メタプログラミングはこれまで明確に定義された概念ではありませんでした。主な理由は、メタという言葉自体の意味が非常に曖昧であるためです。
元は一般に、より基本的で基本的なものとして理解されています。メタプログラミングとは、プログラムよりも基本的なプログラミング、つまりプログラムがプログラムを生成するプログラミングです。この観点から見ると、C++ テンプレート、C マクロ、.NET の Emit および Compiler Provider、JavaScript の文字列スプライシングと eval、さらには Dongwang コード ジェネレーターであっても、それらはすべてプログラム生成プログラムです。
しかし、一般的に言えば、メタプログラミングと呼ばれるには、特定の条件が満たされなければなりません。もちろん、メタプログラミングの概念は明確に定義されていないため、これらの条件は合意としてのみ見なされます。この言語の機能は、A さんにとってはメタプログラミングであるとみなされるが、B さんにとってはメタプログラミングとみなされないのが普通です。以下に挙げる条件は、単に私の観点から見たものです。
1. メタプログラミング機能を持つ言語は、ある言語を使用して別の言語でプログラムを生成するのではなく、同じプログラミング言語でコードを生成できる言語でなければなりません。これにより、コード ジェネレーターが不要になります。 2. メタプログラミング機能を備えた言語の場合、メタプログラミングによって生成されたプログラム コードは字句解析に合格できる必要があります。この記事では、C マクロと JavaScript の評価は除外します。 …
これはメタプログラミングと考えられており、異なる制約を使用することで異なる結果が得られることがわかります。プログラミング言語をメタプログラムできるかどうかを議論するとき、条件 1 については基本的に合意に達することができますが、条件 2 については人それぞれ意見が異なります。
メタプログラミングが最初に作成されたとき、C++ テンプレートは当初はオーバーロードの単なる拡張であったと言われています。強力な型指定により、C 言語はさまざまな型に対して多くの繰り返しコードを記述する必要があります。オーバーロードによって、これらの繰り返しコードによる名前汚染が解決され、ジェネリックによってこれらのコードの重複が解決され始めます。しかし、C++ 標準化委員会のメンバーは、ハイエンドの雰囲気とクラスを常に C++ の絶え間なく追求してきたため、プログラマも団結してきました。 , C++テンプレートメタプログラミングを思いつきました。
JavaScript があります!
http://www.slideshare.net/danwrong/metaprogramming-javascript
このプレゼンテーションの公開日に注意してください。これは新しいことではありません。長年にわたる言語の継続的な改善と拡張により、より多くのメタプログラミング技術が広く使用されています。
さらに、メタプログラミングをサポートする言語は非常に一般的で、ほぼすべての関数型プログラミング言語が利用可能であり、Java には Annotation があり、Clojure は言うまでもありません。 Lisp はマクロに基づいており、Ruby と Smalltalk はどちらも主にリフレクション メカニズムを使用します。 Groovy のようにバイト エンコードや AST 変換などに基づいたものもあります。
メタプログラミングは高度なスキルですが、魔法や珍しい性質ではありません。
次のようにしましょう:
工業化時代の初期には、次のような状況がありました:
人間が機械を作り、機械が製品を作ります。
後の段階:
人は機械を生産し、機械は機械を生産し、機械は製品を生産します。
明らかに、機械生産機械は大きな進歩であり、労働力を大幅に解放します。
メタプログラミングは、簡単に言うと、プログラム自体を変更したり、新しいプログラムを生成したりすることができる機械に似ています。もちろん、これによりプログラマは大幅に解放されます。
もちろん、実際には、メタプログラミングが行われる前に、プログラマーは、IDE などのプログラミングを支援する多数の補助ツールを発明しました。しかしその後、プログラマは、IDE がまだ弱すぎると感じたため、検索と置換、参照へのジャンプ、テンプレートの適用などが可能でした。プログラムが自動的に生成できれば素晴らしいでしょう。
====================科学の普及は完了、ここに無責任な思考================== == ==
実際、メタプログラミングはこれまで明確に定義された概念ではありませんでした。主な理由は、メタという言葉自体の意味が非常に曖昧であるためです。
元は一般に、より基本的で基本的なものとして理解されています。メタプログラミングとは、プログラムよりも基本的なプログラミング、つまりプログラムがプログラムを生成するプログラミングです。この観点から見ると、C++ テンプレート、C マクロ、.NET の Emit および Compiler Provider、JavaScript の文字列スプライシングと eval、さらには Dongwang コード ジェネレーターであっても、それらはすべてプログラム生成プログラムです。
しかし、一般的に言えば、メタプログラミングと呼ばれるには、特定の条件が満たされなければなりません。もちろん、メタプログラミングの概念は明確に定義されていないため、これらの条件は合意としてのみ見なされます。この言語の機能は、A さんにとってはメタプログラミングであるとみなされるが、B さんにとってはメタプログラミングとみなされないのが普通です。以下に挙げる条件は、単に私の観点から見たものです。
1. メタプログラミング機能を持つ言語は、ある言語を使用して別の言語でプログラムを生成するのではなく、同じプログラミング言語でコードを生成できる言語でなければなりません。これにより、コード ジェネレーターが不要になります。
2. メタプログラミング機能を備えた言語の場合、メタプログラミングによって生成されたプログラム コードは字句解析に合格できる必要があります。この記事では、C マクロと JavaScript の評価は除外します。
…
これはメタプログラミングと考えられており、異なる制約を使用することで異なる結果が得られることがわかります。プログラミング言語をメタプログラムできるかどうかを議論するとき、条件 1 については基本的に合意に達することができますが、条件 2 については人それぞれ意見が異なります。
メタプログラミングが最初に作成されたとき、C++ テンプレートは当初はオーバーロードの単なる拡張であったと言われています。強力な型指定により、C 言語はさまざまな型に対して多くの繰り返しコードを記述する必要があります。オーバーロードによって、これらの繰り返しコードによる名前汚染が解決され、ジェネリックによってこれらのコードの重複が解決され始めます。しかし、C++ 標準化委員会のメンバーは、ハイエンドの雰囲気とクラスを常に C++ の絶え間なく追求してきたため、プログラマも団結してきました。 , C++テンプレートメタプログラミングを思いつきました。
JavaScript があります!
http://www.slideshare.net/danwrong/metaprogramming-javascript
このプレゼンテーションの公開日に注意してください。これは新しいことではありません。長年にわたる言語の継続的な改善と拡張により、より多くのメタプログラミング技術が広く使用されています。
さらに、メタプログラミングをサポートする言語は非常に一般的で、ほぼすべての関数型プログラミング言語が利用可能であり、Java には Annotation があり、Clojure は言うまでもありません。 Lisp はマクロに基づいており、Ruby と Smalltalk はどちらも主にリフレクション メカニズムを使用します。 Groovy のようにバイト エンコードや AST 変換などに基づいたものもあります。
メタプログラミングは高度なスキルですが、魔法や珍しい性質ではありません。