C++可能是最受欢迎的语言 静元编程Java不支持它.

是否有任何其他语言除了C++支持生产计划(计划,建立程序)?

有帮助吗?

解决方案

模板样式元编程的替代方法是在各种Lisp实现中看到的宏样式。我建议下载 Paul Graham的 On Lisp 并查看如果您对使用在JVM上运行的宏的Lisp感兴趣,请 Clojure

Lisp中的宏比C / C ++风格强大得多,并且本身构成了一种语言 - 它们用于元编程。

其他提示

让我列表一 几个重要的细节 关于如何 元编程 工作 在口齿不清 (或 方案, 或 石板, 或者选择你最喜欢的"动态"的语言):

  • 这样做时元编程在你口齿不清 不必处理两种语言.元层代码写在同一语言作为对象级别的代码生成的。元编程是不限于两个级别,和它在大脑了。
  • 在口齿不清你有 编译器在运行时可用.事实上编译/时间运行时间的区分感到非常人为的存在,是非常受到哪里你把你的观点。在口齿不清不仅能功能的电话,你可以编制功能的机器指令,可以使用自然在为第一类物体;即他们可以匿名的功能,你可以保持在一个地方变量,或者一个全球hashtable,等等。
  • 在口齿不清是非常简单:一大堆的功能塞在hashtable和给予的编译器。对于每一形式编译器大约是编纂的,它提供咨询,hashtable.如果找到了一个函数,那么叫它在编写时与原来的形式,代替原来的形式,它汇编的形式,这一功能返回。(模一些不重要的细节)那么口齿不清的宏 基本上插件的编译器.
  • 写一个口齿不清的功能在口齿不清,评估些代码是关于两页的代码(这通常被称为 eval).在这样的功能你有所有的力量引入任何新的规定你想要的元的水平。(让它跑的快将要采取的一些努力,但...关于同作为引导一种新的语言...:)

随机的例子是什么 你可以实现的用户库 使用口齿不清元编程(这些都是实际的实例的共同些图书馆):

  • 扩展的语言 分隔的延续 (瑚。dwim.delico)
  • 实现一个 js-对-list-rpc 宏观,可以用在javascript(这是产生从口齿不清).它扩大成的混合物js/list代码自动的员额(在http请求)所有被引用的地方的变量,对它们在服务器上面,运行这些代码体服务器上,并返回回回值javascript侧。
  • 增加序言喜欢回溯到的语言很无缝集成的"正常"舌头的代码(见尖叫)
  • 一个 XML模板扩展 共同list(包括一个例子 读者宏 是的插件对口齿不清parser)
  • 一吨的小DSL的一样 循环迭代 为简单的循环

模板元编程实质上是滥用模板机制。我的意思是你基本上得到了你所期望的功能,这是一个无计划的副作用 - 它是一团糟,并且(虽然工具越来越好)是一个真正的痛苦,因为语言没有支持你这样做(我应该注意到,我对这方面的最新技术经验已经过时了,因为我基本上放弃了这种方法。虽然我没有听说过任何重大进展) / p>

在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 ++没有的元编程结构(至少还没有)。

Concept GCC

Common Lisp支持以多种不同方式编写程序的程序。

1)程序数据和程序“抽象语法树”是统一的(S表达式!)

2) defmacro

3)阅读器宏。

4)MOP

其中,真正令人兴奋的是MOP。阅读“元对象协议的艺术”。我保证,这会改变你的想法!

我建议 Haskell 。这是一个论文,描述了它的编译时元编程功能。

很多的工作Haskell:域特定的语言(DSL)、可执行的规范,程序变革,局部应用程序、分阶段计算。几个链接到让你开始:

ML系列语言专门为此目的而设计。 OCaml最着名的成功案例之一是用于高性能FFT的 FFTW 库,它几乎完全由OCaml生成的C代码程序

干杯, Jon Harrop。

大多数人试图找到一种具有“终极反思”的语言。 自我检查和类似“评估”的东西用于修改新代码。 这些语言很难找到(LISP是一个主要的反例) 他们当然不是主流。

但另一种方法是使用一组可以检查的工具, 生成和操作程序代码。累积奖金是一种工具 专注于Java。 http://jackpot.netbeans.org/

我们的DMS软件再造工具包是 这样一个工具,适用于C,C ++,C#,Java,COBOL,PHP, Javascript,Ada,Verilog,VHDL和其他各种语言。 (它使用生产质量前端使其能够读取 所有这些语言)。 更好的是,它可以在同一时刻使用多种语言。 请参阅 http://www.semdesigns.com/Products/DMS/DMSToolkit.html

DMS之所以成功,是因为它提供了一个常规方法和支持基础设施,可以完全访问作为AST的程序结构,并且在大多数情况下还有额外的数据,如符号表,类型信息,控制和数据流分析,这些都是完成复杂程序所必需的操纵。

'元编程'真是一个坏的名称,这个特定的特征,至少当你在谈论一个以上的语言,由于此功能只是需要一个狭窄的语言是:

  • 编译,计算机语言
  • 重优化业绩,在编制时间
  • 可扩展的用户定义的数据类型(面向对象用C++'s的情况下)
  • 非常受欢迎的

拿出任何这些中的一个,并'静元编程'的,只是没有意义。因此,我会惊讶如果任何远程主流的语言有这样的事情,以了解在C++。

当然,动态语言,并且多功能的语言的支持完全不同的概念也可以被称为元编程。

Lisp支持一种“元编程”形式,尽管与C ++模板元编程不同。此外,您的术语“静态”是指“静态”。在这种情况下可能意味着不同的东西,但Lisp也支持静态类型,如果这就是你的意思。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top