非C ++语言的生成式编程?

时间:2020-03-06 14:33:23  来源:igfitidea点击:

对于静态元编程,C ++可能是最流行的语言,而Java不支持C ++。

除了C ++之外,还有其他语言支持生成式编程(创建程序的程序)吗?

解决方案

Lisp支持"元编程"形式,尽管在意义上与C ++模板元编程不同。同样,在这种情况下,"静态"一词可能意味着不同的含义,但是Lisp也支持静态类型(如果这就是意思)。

模板样式元编程的替代方法是在各种Lisp实现中看到的宏样式。我建议下载Paul Graham的On Lisp,如果我们对带有在JVM上运行的宏的Lisp感兴趣,还可以看看Clojure。

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

Nemerle和Boo是我个人喜欢的东西。尽管文档很差,Nemerle的宏语法却非常优雅。 Boo的文档非常出色,但其宏却略逊一筹。但是,两者都运行得非常好。

两者都以.NET为目标,因此,如果我们使用IKVM,它们可以轻松地与Cand其他.NET语言-甚至Java二进制文件进行互操作。

编辑:为澄清起见,我的意思是用Lisp表示单词的宏,而不是C的预处理器宏。这些允许在编译时定义新语法和繁重的元编程。例如,Nemerle附带了可在编译时针对SQL Server验证SQL查询的宏。

我推荐Haskell。这是一篇描述其编译时元编程功能的论文。

" D"编程语言类似于C ++,但具有更好的元编程支持。这是仅使用编译时元编程编写的光线跟踪器的示例:

跟踪

此外,还有一个名为"概念GCC"的gcc分支,它支持C ++不(至少现在还不)的元编程结构。

概念海湾合作委员会

"元编程"对于这个特定功能确实是一个坏名字,至少在我们讨论一种以上的语言时,因为该功能仅在以下几种语言中才需要:

  • 静态的
  • 编译成机器语言
  • 针对编译时的性能进行了大幅优化
  • 可使用用户定义的数据类型扩展(在C ++情况下为OOP)
  • 非常受欢迎

删除其中的任何一个,然后进行"静态元编程",只是没有意义。因此,如果任何远程主流语言都具有C ++所理解的类似语言,我会感到惊讶。

当然,动态语言和几种功能语言支持完全不同的概念,这些概念也可以称为元编程。

当然,元语言(ML):http://cs.anu.edu.au/student/comp8033/ml.html

模板元编程实质上是对模板机制的滥用。我的意思是,我们基本上可以从一项计划外的副作用中获得预期的功能–混乱不堪,并且(尽管工具正在变得更好),但由于语言不支持,这真是一团糟我们这样做的时候(我应该注意,我在最新技术上的经验已经过时了,因为我基本上放弃了这种方法。不过,我还没有听说过取得任何重大进展)

大约在98年左右,我一直在寻找解决方案,这促使我寻找更好的解决方案。我可以编写依赖它的有用系统,但是它们很可怕。戳戳最终导致我进入Common Lisp。当然,模板机制已经完成了图灵处理,但是再次,插入机制也是如此。

Common Lisp确实进行元编程"正确"。使用该语言时,我们将拥有该语言的全部功能,而无需特殊的语法,并且由于该语言非常动态,因此我们可以使用它做更多的事情。

当然还有其他选择。我使用的其他语言没有比Lisp更好的进行元编程,这就是为什么我将其用于研究代码。尽管有很多原因,我们可能想尝试其他方法,但这都是要权衡的。我们可以查看Haskell / ML / OCaml等。许多功能语言都具有接近Lisp宏的功能。我们可以找到一些.NET目标的东西,但它们都非常有限(就用户群等而言)。实际上,没有任何一种工业用语言的大公司有这样的东西。

让我列出一些有关元编程如何在Lisp(或者方案,或者选择,或者选择我们喜欢的"动态"语言)中工作的重要信息:

  • 当用Lisp进行元编程时,我们不必处理两种语言。元级别代码使用与其生成的对象级别代码相同的语言编写。元编程不仅限于两个级别,而且在大脑上也更容易。
  • 简而言之,我们可以在运行时使用编译器。实际上,编译时/运行时的区别在那感觉是很人为的,并且在很大程度上取决于观点。只需一个函数调用,我们就可以将函数编译为机器指令,从那时起我们就可以将它们用作第一类对象;即它们可以是未命名的函数,我们可以将其保留在局部变量或者全局哈希表中,等等。
  • Lisp中的宏非常简单:将一堆函数填充到哈希表中并提供给编译器。对于编译器将要编译的每种形式,它都会查询该哈希表。如果找到函数,则在编译时以原始形式对其进行调用,并代替原始形式对其进行编译以返回该函数的形式。 (对一些不重要的细节进行取模),因此lisp宏基本上是编译器的插件。
  • 在Lisp中编写一个Lisp函数来评估Lisp代码大约需要两页代码(通常称为eval)。在这种功能中,我们将有能力在元级别上引入所需的任何新规则。 (尽管要使其快速运行将需要一些努力...与引导新语言几乎相同... :)

可以使用lisp元编程实现为用户库的随机示例(以下是常见的lisp库的实际示例):

  • 以定界的延续来扩展语言(hu.dwim.delico)
  • 实现可在javascript中使用的js-to-lisp-rpc宏(由lisp生成)。它扩展为js / lisp代码的混合物,该代码会自动发布(在http请求中)所有引用的局部变量,在服务器端对其进行解码,在服务器上运行lisp代码主体,然后将返回值返回给javascript边。
  • 向与"普通" lisp代码无缝集成的语言添加回溯之类的序言(请参阅尖叫声)
  • 对通用Lisp的XML模板扩展(包括作为Lisp解析器插件的阅读器宏的示例)
  • 大量小型DSL,例如循环或者迭代以方便循环

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

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

2)defmacro

3)阅读器宏。

4)澳门币

其中,真正令人鼓舞的是澳门币。阅读"元对象协议的艺术"。我保证,它将为我们带来改变!

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

干杯,
乔恩·哈罗普(Jon Harrop)。

Haskell的许多工作:领域特定语言(DSL),可执行规范,程序转换,部分应用程序,分段计算。很少有链接可以入门:

  • http://haskell.readscheme.org/appl.html
  • http://www.cse.unsw.edu.au/~dons/papers/SCKCB07.html
  • http://www.haskell.org/haskellwiki/Research_papers/Domain_specific_languages

大多数人试图找到一种具有"终极反省"的语言
进行自我检查,并使用" eval"之类的代码来简化新代码。
很难找到这样的语言(LISP是主要的反例)
他们当然不是主流。

但是另一种方法是使用一组可以检查,
生成并处理程序代码。大奖就是这样的工具
专注于Java。 http://Hymanpot.netbeans.org/

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

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