2011-08-22 90 views
7

我想知道创建源到源翻译器的策略是什么,即创建从一种高级语言到另一种高级语言的翻译。即进入我脑海的两个方面是创建源到源翻译器

1-改变一种语言到另一种语言语法树 2 - 将其更改为中间语言的语法树,然后转换为其他高级语言

我的问题是也就是说,使用这两种策略进行转换是可行的,哪种方法更可行,任何人都可以参考某些转换器所做的理论或实现,比如上述任何一种方法。是否有任何标准的基于xml的中间语言,我知道xmlvm使用xml作为中间语言,但它没有提供任何适当的中间语言规范。

+0

请参阅我的回答关于编程语言之间的翻译:http://stackoverflow.com/a/3460977/120163。这是关于真正的工业工具来做到这一点,而不是理论。 –

回答

7

任何编译器大致都是源到源转换器。目标语言可以是汇编语言(或直接使用二进制机器代码语言)或C语言,也可以是您喜欢的任何高级语言。所以,一般compilers theory是适用的。

就像一个忠告 - 一种中间语言通常不够。使用更多。使用数十种中间语言,每种语言都与前一种不同,只是在一个很小的方面。这样任何语言到语言的翻译都不过是微不足道的。

另一个建议的词(在此期待downvotes) - 远离XML,特别是作为AST s的表示。

+2

同意关于XML的SK逻辑。参见http://stackoverflow.com/a/2831343/120163关于XML作为AST表示的(德)优点的讨论。 –

0

转换器通常基于构造一个程序的语义树,然后将其重新塑造成目标PL。作为一个例子,看看C# to Java convertor

第二种方法也是可行的,但是代码的组织可能在转换后完全改变。因此,最好尽可能保持中间通用结构(IL,ST等)的高水平。

2

我会看LLVM,它可以做源代码。虽然输出不太好,但它可能会提供一些好的想法。

+1

它可以做源语言来源?我认为LLVM/Clang很适合C和C++,其他语言可能相当困难。 –

+0

@Ira Baxter:LLVM有一个CBackend,它将LLVM BitCode编译为C. LLVM也有一个名为emscripten的JavaScript后端项目。所以在技术上任何输出到LLVM的前端都可以使用这些后端中的任何一个。这不考虑项目在开发中,或者项目将在开发中。示例前端应该是Clang,llvm-lua,llvm-gcc,LDC等等。这不是一个“完整解决方案”,但如果有人正在研究一些想法,并想要一些代码来实际查看,那将是一个地方开始。 – TechZilla

0

试试Clang!它对于源代码翻译非常有用。截至目前,它完全支持C,C++,Objective C和Objective C++。 您可能还想看看ROSE编译器基础结构。