C++可能是静态元编程最流行的语言,Java不支持它.
除了C++之外还有其他语言支持生成编程(创建程序的程序)吗?
模板样式元编程的替代方法是在各种Lisp实现中看到的宏样式.我建议下载Paul Graham的On Lisp,如果你对使用在JVM上运行的宏的Lisp感兴趣,还可以看一下Clojure.
Lisp中的宏比C/C++风格强大得多,并且本身构成了一种语言 - 它们用于元编程.
让我列出一些关于元编程如何在lisp(或方案,或平板,或选择你最喜欢的"动态"语言)中工作的重要细节:
在lisp中进行元编程时,您不必处理两种语言.元级代码使用与其生成的对象级代码相同的语言编写.元编程不仅限于两个层面,而且在大脑上也更容易.
在lisp中,您可以在运行时使用编译器.事实上,编译时/运行时区别在那里感觉非常人为,并且非常依赖于您放置观点的位置.在lisp中只需要一个函数调用就可以将函数编译为机器指令,然后可以将它们用作第一类对象; 即它们可以是未命名的函数,可以保存在局部变量或全局哈希表等中......
lisp中的宏非常简单:一堆函数填充在哈希表中并提供给编译器.对于编译器即将编译的每个表单,它会查询该哈希表.如果它找到一个函数,然后在编译时用原始表单调用它,并代替原始表单,它将编译此函数返回的表单.(模数一些非重要的细节)所以lisp宏基本上是编译器的插件.
在lisp中编写一个评估lisp代码的lisp函数大约是两页代码(通常称为eval).在这样的功能中,您有能力在元级别上引入您想要的任何新规则.(让它快速运行需要付出一些努力......就像引导一种新语言一样...... :)
使用lisp元编程实现用户库的随机示例(这些是常见的lisp库的实际示例):
用分隔的连续扩展语言(hu.dwim.delico)
实现一个js-to-lisp-rpc宏,你可以在javascript中使用它(从lisp生成).它扩展为js/lisp代码的混合,自动发布(在http请求中)所有引用的局部变量,在服务器端解码它们,在服务器上运行lisp代码体,并将返回值返回给javascript侧.
添加prolog就像回溯到与"普通"lisp代码无缝集成的语言(参见screamer)
公共lisp 的XML模板扩展(包括作为lisp解析器插件的读取器宏的示例)
大量的小型DSL,如循环或迭代,以便轻松循环
模板元编程实质上是滥用模板机制.我的意思是你基本上得到了你所期望的功能,这是一个无计划的副作用 - 它是一团糟,并且(尽管工具越来越好)是一个真正的痛苦,因为语言没有支持你这样做(我应该注意到,我对这方面的最新经验是过时的,因为我基本上放弃了这种方法.但我没有听说过任何重大进展)
在大约98年左右解决这个问题是驱使我寻找更好解决方案的原因.我可以编写依赖它的有用系统,但它们是地狱般的.四处寻找最终导致我成为Common Lisp.当然,模板机制是Turing完成,但是同样是intercal.
Common Lisp做元编程"正确".你可以使用该语言的全部功能,没有特殊的语法,并且因为语言非常动态,你可以用它做更多的事情.
当然还有其他选择.没有其他语言我使用的元编程比Lisp更好,这就是我将它用于研究代码的原因.你可能想要尝试别的东西有很多原因,但这些都是权衡取舍.您可以查看Haskell/ML/OCaml等.许多函数式语言都具有接近Lisp宏的强大功能.你可以找到一些.NET目标的东西,但它们都非常边缘(在用户群等方面).在工业上使用的语言中,没有一个大玩家真的有这样的东西.
Nemerle和Boo是我个人最喜欢的东西.尽管文档很差,但Nemerle的宏语法非常优雅.Boo的文档非常出色,但它的宏不太优雅.然而,两者都工作得非常好.
两者都以.NET为目标,因此如果您使用IKVM,它们可以轻松地与C#和其他.NET语言(甚至Java二进制文件)进行互操作.
编辑:澄清一下,我的意思是Lisp意义上的宏,而不是C的预处理器宏.这些允许在编译时定义新语法和繁重的元编程.例如,Nemerle提供的宏将在编译时针对您的SQL服务器验证您的SQL查询.
Nim是一种相对较新的编程语言,它对静态元编程有广泛的支持,并产生高效的(类似C++)编译代码.
http://nim-lang.org/
它支持编译时功能评估,通过宏进行类似lisp的AST代码转换,编译时反射,可以使用任意值进行参数化的泛型类型,以及可用于创建用户定义的高级类型感知的术语重写窥视孔优化.甚至可以在编译过程中执行可能影响代码生成的外部程序.例如,考虑与本地运行的数据库服务器通信,以验证代码中的ORM定义(通过某些DSL提供)是否与数据库的模式匹配.
该"d"的编程语言是C++ -样,但具有更好的元编程支持.以下是仅使用编译时元编程编写的光线跟踪器示例:
Ctrace
此外,还有一个名为"Concept GCC"的gcc分支,它支持C++没有的元编程结构(至少现在还没有).
GCC概念
Common Lisp支持以多种不同方式编写程序的程序.
1)程序数据和程序"抽象语法树"是统一的(S表达式!)
2) defmacro
3)读者宏.
4)MOP
其中,真正令人兴奋的是MOP.阅读"元对象协议的艺术".我保证,这会改变你的想法!