我正在阅读 TheServerSide 上关于 Java 平台上的多语言编程的文章。文章中的一些评论将元编程称为生成代码的能力(可能是动态的)。
元编程是动态生成代码的能力,还是在运行时将方法和属性注入现有对象的能力(就像 Python、Ruby 和 Groovy 等一些动态语言所允许的那样)。
元编程是指程序了解自身或操纵自身的各种方式。
在像 C# 这样的语言中,反射是一种元编程形式,因为程序可以检查有关自身的信息。例如,返回一个对象所有属性的列表。
在 ActionScript 等语言中,您可以在运行时评估函数以创建新程序,例如 eval(“x” + i)。当 i 为 1 时 DoSomething() 将影响名为 x1 的对象,当 i 为 2 时将影响名为 x2 的对象。
最后,另一种常见的元编程形式是程序可以以非平凡的方式改变自己。LISP 以这一点而闻名,并且是大约十年前 Paul Graham 所倡导的。我得查一下他的一些具体文章。但想法是程序会根据其状态更改程序的另一部分。这为在运行时做出决策提供了一定程度的灵活性,这在当今大多数流行语言中是非常困难的。
还值得注意的是,在直接汇编编程的好日子里,在运行时改变自己的程序是必要的并且非常普遍。
摘自 Paul Graham 的文章“Lisp 与众不同的原因”:
许多语言都有一个叫做宏的东西。但是 Lisp 宏是独一无二的。信不信由你,他们所做的与括号有关。Lisp 的设计者并没有将所有这些括号放在语言中,只是为了与众不同。对于 Blub 程序员来说,Lisp 代码看起来很奇怪。但是这些括号是有原因的。它们是 Lisp 和其他语言之间根本差异的外在证据。 Lisp 代码由 Lisp 数据对象组成。并不是说源文件包含字符,字符串是该语言支持的数据类型之一。Lisp 代码在被解析器读取后,由您可以遍历的数据结构组成。 如果您了解编译器的工作原理,那么真正发生的并不是 Lisp 具有奇怪的语法,而是 Lisp 没有语法。您在解析树中编写程序,这些程序在解析其他语言时在编译器中生成。但是您的程序可以完全访问这些解析树。您可以编写操作它们的程序。在 Lisp 中,这些程序称为宏。它们是编写程序的程序。 编写程序的程序?你什么时候想这样做?如果您在 Cobol 中思考,则不是很常见。一直以来,如果你在 Lisp 中思考的话。如果我能举一个强大的宏的例子,在这里说会很方便!那个怎么样?但如果我这样做了,对于不了解 Lisp 的人来说,这简直就是胡言乱语。这里没有空间来解释您需要知道的所有内容以理解它的含义。在Ansi Common Lisp中,我尝试尽可能快地进行操作,即使如此,直到第 160 页我才接触到宏。 但我想我可以给出一种可能令人信服的论点。Viaweb 编辑器的源代码大概有 20-25% 的宏。宏比普通的 Lisp 函数更难编写,并且在不需要时使用它们被认为是不好的风格。因此,该代码中的每个宏都存在,因为它必须存在。这意味着该程序中至少 20-25% 的代码正在执行您在任何其他语言中都无法轻松完成的事情。不管 Blub 程序员对我声称的 Lisp 的神秘力量持怀疑态度,这应该让他很好奇。我们写这段代码不是为了自娱自乐。我们是一家很小的初创公司,为了在我们和竞争对手之间设置技术障碍,我们尽可能地努力编程。 一个可疑的人可能会开始怀疑这里是否存在某种关联。我们的大部分代码都在做其他语言很难做到的事情。由此产生的软件做了我们竞争对手的软件做不到的事情。也许有某种联系。我鼓励您关注该主题。那个拄着拐杖蹒跚而行的老人可能比我们看到的更多。
许多语言都有一个叫做宏的东西。但是 Lisp 宏是独一无二的。信不信由你,他们所做的与括号有关。Lisp 的设计者并没有将所有这些括号放在语言中,只是为了与众不同。对于 Blub 程序员来说,Lisp 代码看起来很奇怪。但是这些括号是有原因的。它们是 Lisp 和其他语言之间根本差异的外在证据。
Lisp 代码由 Lisp 数据对象组成。并不是说源文件包含字符,字符串是该语言支持的数据类型之一。Lisp 代码在被解析器读取后,由您可以遍历的数据结构组成。
如果您了解编译器的工作原理,那么真正发生的并不是 Lisp 具有奇怪的语法,而是 Lisp 没有语法。您在解析树中编写程序,这些程序在解析其他语言时在编译器中生成。但是您的程序可以完全访问这些解析树。您可以编写操作它们的程序。在 Lisp 中,这些程序称为宏。它们是编写程序的程序。
编写程序的程序?你什么时候想这样做?如果您在 Cobol 中思考,则不是很常见。一直以来,如果你在 Lisp 中思考的话。如果我能举一个强大的宏的例子,在这里说会很方便!那个怎么样?但如果我这样做了,对于不了解 Lisp 的人来说,这简直就是胡言乱语。这里没有空间来解释您需要知道的所有内容以理解它的含义。在Ansi Common Lisp中,我尝试尽可能快地进行操作,即使如此,直到第 160 页我才接触到宏。
但我想我可以给出一种可能令人信服的论点。Viaweb 编辑器的源代码大概有 20-25% 的宏。宏比普通的 Lisp 函数更难编写,并且在不需要时使用它们被认为是不好的风格。因此,该代码中的每个宏都存在,因为它必须存在。这意味着该程序中至少 20-25% 的代码正在执行您在任何其他语言中都无法轻松完成的事情。不管 Blub 程序员对我声称的 Lisp 的神秘力量持怀疑态度,这应该让他很好奇。我们写这段代码不是为了自娱自乐。我们是一家很小的初创公司,为了在我们和竞争对手之间设置技术障碍,我们尽可能地努力编程。
一个可疑的人可能会开始怀疑这里是否存在某种关联。我们的大部分代码都在做其他语言很难做到的事情。由此产生的软件做了我们竞争对手的软件做不到的事情。也许有某种联系。我鼓励您关注该主题。那个拄着拐杖蹒跚而行的老人可能比我们看到的更多。