生成代码时,您应该生成什么语言?

时间:2009-02-25 17:43:14

标签: code-generation

我参与了许多利用代码生成的产品。它似乎是实现高度用户可定制性和高执行速度的唯一方法。

缺点是我们要求用户安装编译器(主要在MS Windows上)。

这一直是一个令人头疼的问题,因为像MS这样的供应商一直在淘汰编译器,有些用户往往安装了多个编译器。

我们正在考虑使用GNU C,可能还有C ++,但即便如此,也存在持续的版本问题。

为了摆脱编译器版本的跑步机,我考虑过可能会生成汇编语言,但汇编语言都是特定于机器的。

理想情况下,可以通过某种方式生成生成的代码,这些代码具有灵活性,运行速度快,并且不会让我们面对第三方提供商的突发奇想。

也许我忽视了一些简单的东西,比如Java。任何想法,将不胜感激。感谢。

12 个答案:

答案 0 :(得分:8)

如果您正在考虑使用C甚至是汇编程序,请首先查看LLVM:http://llvm.org

答案 1 :(得分:3)

我可能在这里错过了一些上下文,但你能不能把自己固定在一个特定的版本上?例如,.NET 2.0可以与.NET 1.1和.NET 3.5并排安装,以及将来出现的其他版本。因此,只要您的代码使用特定版本的编译器,问题是什么?

答案 2 :(得分:3)

  

为了摆脱编译器版本的跑步机,我考虑过可能会生成汇编语言,但汇编语言都是特定于机器的。

那将被称为编译器:)

为什么不坚持C90

如果您不使用扩展程序,我没有听到gcc方严重违反标准的行为。

您可以随时将gcc的某个版本与您的产品一起分发,例如4.3.2,为用户提供使用自己的编译器的选项,风险自负。

只要您生成所有代码(即您没有将指令嵌入到其他代码中),就不应该对此版本进行测试并使用它来编译库。

答案 3 :(得分:3)

如果要生成汇编语言代码,可以查看asmjit

答案 4 :(得分:2)

从这里开始:Code Generation conference

答案 5 :(得分:2)

一种选择是使用一种语言/环境,在代码中提供对编译器的访问;例如,here is a C# example

答案 6 :(得分:2)

为什么不使用代码生成器发送GNU C编译器?这样您就没有版本问题,客户端可以不断生成可用的代码。

答案 7 :(得分:2)

听起来你正在寻找LLVM。

答案 8 :(得分:1)

我会坚持使用那种用于生成该语言的语言。您可以用Java生成和编译Java代码,用Python生成Python代码,用C#生成C#,甚至用Lisp生成Lisp等。

但目前尚不清楚这些语言对您来说是否足够快。对于最高速度,我会选择生成C ++并使用GCC进行编译。

答案 9 :(得分:1)

为什么不使用SpiderMonkey或Rhino(Java或C ++中的JavaScript支持)。您可以将对象导出到JavaScript命名空间,并且用户不必编译任何内容。

答案 10 :(得分:1)

Lua / Scheme等语言的口译员嵌入到您的程序中,并使用该语言生成代码。

答案 11 :(得分:1)

在@ Alvin的答案中,本着“可能不会迟到加2美分”的精神,我想到的是:如果你的应用程序要持续使用多年, it将面临应用程序和系统如何工作的若干变化

例如,假设你在10年前考虑过这个问题。那时我正在看Dexter,但我想你实际上已经记得当时的事情。据我所知,对于2000年的开发人员而言,多线程并不是一个问题,现在确实如此。所以摩尔定律为他们打破了。在此之前,人们甚至不关心“Y2K”会发生什么。

说到摩尔定律,处理器确实变得非常快,所以也许某些优化甚至不是必需的。并且可能的优化数组会更大, some processors 正在为几个以服务器为中心的东西(XML,加密,压缩和正则表达式)进行优化!我很惊讶这样的事情可以完成芯片)并且也消耗更少的能量(这对于战争硬件可能非常重要......)。

我的观点是,专注于今天作为明天的平台存在并不是一个好主意。让它在今天运行,并且肯定会在明天起作用(向后兼容性尤其受到微软的重视,Apple看起来并不差,Linux非常自由地让它按照您的意愿运行)。

是的,有一件事你可以做。将您的技术附加到不会(可能)死亡的东西上,例如Javascript。我很认真,Javascript虚拟机现在变得非常有效,并且会变得更好,而且每个人都喜欢它,所以它不会突然消失。如果需要更高的效率/功能,可能针对CRL或JVM?

此外,我认为多线程将成为越来越多的问题。我有一种直觉,认为处理器内核的数量将拥有自己的摩尔定律。从云端嗡嗡声的外观来看,架构很可能会发生变化。

PS:无论如何,我相信过去的C优化在现代编译器中仍然非常有效!