那里有哪些转发器?

时间:2008-12-04 14:50:38

标签: java c++ code-translation

在研究如何用Java编写我自己的拼写检查器的时候,我想知道将aspell转换为C的某个方言有多少工作,这个方言足够接近Java,可以编译C和来自同一来源的Java版本。

当然,有UML承诺你可以“模拟”你的问题“一次”,然后“为任何语言生成代码”但是a)通常不包括算法(只有依赖关系和关系)和b)结果代码是......好吧......“显然是由电脑写的” ahem

所以我想知道:有没有人知道或有没有人使用过“元语言”,它允许用相同的代码库用C ++和Java编译?你用了什么?你能有一套规则允许编写一个简单的解析器,它可以修复最后的差距,使普通的C ++代码用Java编译吗?或者你会走另一条路?

定义“transpiler”:一个程序,它读取语言A中的代码并将其转换为语言B的代码。编译器和转换器之间的区别在于编译器通常从高级语言转换为低级语言(C - >汇编程序,Java - >字节码),而转换程序在(大致)相同级别的语言之间进行转换。示例:(C ++ - > C,Pascal - > C)。想想StarTrek(TM)翻译。

8 个答案:

答案 0 :(得分:5)

有很多编译器长期编译成其他高级语言。我最常用的是f2c(我需要将Fortran代码转换为C,因此我可以从Lisp程序中调用共享库)。所有这些都是正确的:你不想摆弄生成的代码。它通常不是人类可读的。

如果你有一个可以编译成C ++或Java的“元语言”,你会得到糟糕的C ++和糟糕的Java。虽然语言共享一些共同的子集,并且某些功能可以或多或少地相互映射,但许多更高级的功能以不同的方式工作,并且习语非常不同。

您可能会找到一个C-to-Java转换器,在这种情况下,您将维护C代码并编译为Java。您可以自己移植代码。根据您正在做的事情,您可能会单独编译C并使用JNI从Java访问它。您极不可能找到一个能够将C语言编译为惯用Java的编译器。

答案 1 :(得分:3)

我认为您正在寻找的是源到源编译器。虽然大多数这些代码都会发出C代码,但也许您可以定制它们以发出一些非常有限的C子集,这样您就可以编写一些简单的东西来将其转换为Java。

进行此类编译时立即想到的工具是:

这两种语言都有许多语言的前端,包括C / C ++以及二进制和字节码格式。他们也都有C后端。两者都进行所有解析并从他们读入的内容中生成完整的AST,因此也许您可以通过使用AST获得所需的转换。遗憾的是,我很难想到一个具有Java源代码后端的编译器。

答案 2 :(得分:2)

其中许多工具都是* -to-C编译器。这些是有用的,因为基本上每个平台都已经有一个C编译器,并且C很容易在编译器中发出。众所周知的例子是Cfront,C ++-to-C编译器。

请注意,这些工具是真正的编译器;他们解析并编译整个源代码;它只是输出阶段,它们不会发出汇编而是发出C代码。

答案 3 :(得分:2)

嗯,您对“转发器”的定义与“compiler”之间没有区别;-) “从语言A翻译成语言B”。

基本上,高级语言不同,因为您编程为不同的“机器模型”抽象。例如,Java的级别稍高,因为它的虚拟机模型更“虚拟”(托管代码......)。他们鼓励不同的编程风格,并有不同的目的。

当然你可以在C ++中添加一个库来进行垃圾收集和其他事情,然后将Java翻译成那个,但是你真的没有惯用的C ++。 GCC(和GCJ)所做的是将Java + libgcj和c ++直接转换为中间表示(这样你就不会因为c或c ++中间步骤而失去太多的效率)。中间步骤通常可以是C语言,用作便携式汇编程序(但它有缺点,参见C--讨论)。

正如你所说生成的代码不是你想要的,像ROSE这样的工具会有所帮助,但是来吧,你不会用模板元编程;-)实际上它会给你另一个抽象机器来编程,这将大致是您要为其生成代码的语言的子集。还有其他工具可以让您使用不同语言编写模型,例如在组件编程领域(如Fractal)。

还有从高级语言到高级语言的编译器。源到源编译器编译为高级语言:通常从语言A到语言A,它们主要用于优化。其他编译器在域特定情况下以高级语言生成代码:例如睡衣从python代码生成javascript,Brook从Brook(流媒体)语言生成C ++和gpu着色器代码....

但这些都不是你想要的,编程语言是不同的,人们发现统一它们的唯一方法是将它们编译成一个通用的机器模型,这就是微软CLR背后的理念,甚至超过了JVM,因为CLR非常广泛:你可以做非托管代码,即编译C ++(有效......而不是将内存视为字节数组......)。 LLVM非常类似,但中间表示不是目标不可知的。

结论:一台虚拟机可以统治它们......

答案 4 :(得分:2)

可能不是你想要的,但NestedVM允许你使用C / C ++ / Fortran(或GCC将编译的任何其他内容)并将其转换为Java。 它实际上是通过将代码编译为MIPS目标,然后在用Java编写的VM上运行生成的MIPS来实现的。

答案 5 :(得分:0)

更多例子:

  • STELLA从类似Lisp的代码生成C ++和Java代码
  • emscripten从LLVM字节码生成JavaScript代码
  • Fay从Haskell代码生成JavaScript代码

答案 6 :(得分:0)

有一类名为Program Transformation Systems的工具,它们提供了在代码上编写源到源转换的功能。这包括从一种语言到另一种语言。

其中许多是学术性的。我们的DMS软件再造工具包是一个生产工具,可以实现这一目标,甚至还配备了预定义的各种语言源和目标,包括C,C ++,Java,Python,SQL等。

答案 7 :(得分:-1)

简单的回答;使用Vala。它做你想要的。