我该如何开始编写转换器?它甚至可能吗?

时间:2015-03-22 10:05:42

标签: compiler-construction code-translation

由于保密原因,我可能无法在引脚点详细信息中进行描述,但这是方案。

拥有流媒体应用程序的各种设备具有不同的api语言,尽管它们完成了同样的事情。因此,当您想为一个平台编写流媒体应用程序时,您必须从头开始,同时为其他平台复制相同的应用程序,即编写冗余逻辑。我想设计一个转换器,它使用一种语言编写代码,并为所有本地语言生成代码,类型为1对多,但不确定如何启动,并且无法在Internet上找到足够的引用。这样做甚至可行吗?目标语言包括javascript的变种,主要是java。

3 个答案:

答案 0 :(得分:7)

实现此目的的一种方法是使用旨在构建翻译器的基础架构。

许多人认为这意味着"解析器生成器&#34 ;;这实际上是天真的。   一个好的翻译必须解析语言,当然,翻译还需要跟踪符号的含义,验证所说的内容并不是无意义,生成和优化代码。你需要更多的机器而不仅仅是解析器(生成器)才能做到这一点。请参阅Life After Parsing

我们的DMS Software Reengineering Toolkit是一套用于构建程序分析器和翻译器的工具,包括一个非常强大的解析器生成器。

DMS还包含program transformation engine,可以根据要翻译的语言编写翻译规则, if you see this, transform it to that。直接在感兴趣的语言的表面语法中编写转换规则使它们更易于编写,检查,调试和维护。

那就是说,写这样一个翻译并不是一件容易的事。您必须使用隐含语义枚举完整的语法结构集,并弄清楚如何将其映射到目标语言语法的组合以及您可能在目标端自定义构建的额外库。对于每位翻译人员来说,即使对于专家来说也需要数月,复数。

DMS不知道涉及哪种编程语言。你必须定义它感兴趣的语言;对于标准语言(如Java和JavaScript),它具有大量稳定的语言定义(可用作源或目标,您可以选择)。这种可用的稳定性有助于缩短开发周期,但它通常不是主要成本。

建立一个普遍的翻译者是一个圣杯。其中一个人写了一套规则,之后一切都是桃子。这个想法是一种幻想。值得理解的是,从语言A到B的一组转换规则对于将语言C转换为D实际上并不有用,因为规则结合了关于特定语法和隐含语义的知识。尽管如此,如果你打算建立多个"转发器,那么在共同的基础上进行这项工作在学习曲线和长期可维护性方面是一个巨大的胜利。

使用像DMS这样的工具,可以写extremely accurate translators.

答案 1 :(得分:5)

您可能希望查看(甚至加入)像Haxe这样的开源编译器项目。 它已经可以从Haxe源代码编译为Java,JavaScript,C#,C ++,Neko VM,Flash,LUA,Python和HashLink(ByteCode和C)。 如果重要的话,Haxe编译器是使用OCAML构建的。

更多信息:

答案 2 :(得分:1)

是的,这是可能的,编译器通常以这种方式编写。

一般的想法是创建一个“中间语言”,然后写几个单向翻译:

  C#           => intermediate
  JavaScript   => intermediate

  intermediate => C#
  intermediate => JavaScript

将输出从一个输入到下一个,您可以从一种语言翻译成另一种语言:

  C#          =>  intermediate =>  JavaScript
  JavaScript  =>  intermediate =>  C#

不幸的是,生成的代码可能不会对人类友好。