元编程到底是什么?


问题内容

我正在阅读有关Java平台上的ployglot编程的TheServerSide文章。本文中的一些评论将元编程称为生成代码的能力(也许是在运行中)。

元编程是在运行时即时生成代码的能力,还是在运行时将方法和属性注入到现有对象中的能力(例如某些动态语言(如Python,Ruby和Groovy所允许的))。


问题答案:

元编程是指程序具有自身知识或可以操纵自身的多种方式。

在像C#这样的语言中,反射是元编程的一种形式,因为该程序可以检查有关其自身的信息。例如,返回对象的所有属性的列表。

在ActionScript之类的语言中,您可以在运行时评估函数以创建新程序,例如eval(“ x” + i)。当我为1时,DoSomething()会影响名为x1的对象,而当我为2时,DoSomething()将影响名为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神秘力量的主张,这应该使他感到好奇。我们并不是出于娱乐目的而编写此代码。我们是一家小型的初创公司,我们竭尽全力进行编程,以在我们和竞争对手之间设置技术壁垒。

可疑人员可能会开始怀疑这里是否存在某种关联。我们的代码很大一部分正在做其他语言很难做到的事情。最终的软件完成了竞争对手软件无法完成的工作。也许有某种联系。我鼓励您遵循该主题。那个old着拐杖走路的老人可能比目睹更多。