Compiler construction 我如何开始写一个transpiler?有可能吗?

Compiler construction 我如何开始写一个transpiler?有可能吗?,compiler-construction,code-translation,Compiler Construction,Code Translation,由于保密原因,我可能无法详细描述pin点,但以下是场景 拥有流媒体应用程序的各种设备使用不同的API使用不同的语言,尽管它们完成了相同的任务。因此,当你想为一个平台编写流媒体应用程序时,你必须从头开始,同时为另一个平台复制相同的应用程序,这就是编写冗余逻辑。我想设计一个transpiler,它用一种语言编写代码,并生成所有母语的代码,有点像1对多,但不知道如何启动,并且在internet上找不到足够的参考。这样做可行吗?目标语言包括javascript的变体,主要是java。实现这一点的一种方法

由于保密原因,我可能无法详细描述pin点,但以下是场景


拥有流媒体应用程序的各种设备使用不同的API使用不同的语言,尽管它们完成了相同的任务。因此,当你想为一个平台编写流媒体应用程序时,你必须从头开始,同时为另一个平台复制相同的应用程序,这就是编写冗余逻辑。我想设计一个transpiler,它用一种语言编写代码,并生成所有母语的代码,有点像1对多,但不知道如何启动,并且在internet上找不到足够的参考。这样做可行吗?目标语言包括javascript的变体,主要是java。

实现这一点的一种方法是使用设计用于构建翻译器的基础设施

许多人认为这意味着“解析器生成器”;这其实很幼稚。 当然,一个好的译者必须解析语言,但翻译还需要跟踪符号的含义,验证所说的不是废话,生成并优化代码。要做到这一点,您需要比解析器(生成器)多得多的机器。看

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

DMS还包括一个,使人们能够根据被翻译的语言编写翻译规则, . 直接用感兴趣的语言的表面语法编写翻译规则,使它们更易于编写、检查、调试和维护

这就是说,写这样一个译者不是一件容易的事;您必须枚举具有隐含语义的完整语法结构集,并找出如何将其映射到目标语言语法加上您可能在目标端自定义构建的额外库的组合。这需要人月,复数,甚至专家,每个翻译

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

建立一个“通用翻译器”有一个圣杯,在这个圣杯中,一个人写下一套规则,然后一切都很美好。那想法是幻想。值得理解的是,从语言a到语言B的一组翻译规则实际上对从语言C到语言D的翻译并不有用,因为这些规则结合了关于特定语法和隐含语义的知识。尽管如此,如果你要建立多个“TrpSpter”,在一个共同的基础上做这件事在学习曲线和长期维修性方面是一个巨大的胜利。 使用诸如DMS之类的工具,您可以编写。

您可能希望查看(甚至加入)类似这样的开源编译器项目。 它已经可以从HAXE源代码编译到java、JavaScript、C++、C++、NEKO VM、Flash、LUA、Python和HashLink(ByteCode和C)。 如果有必要,Haxe编译器是用OCAML构建的

更多信息:


是的,这是可能的,编译器通常是这样编写的

总体思路是创建一种“中间语言”,然后编写几个单向翻译器:

  C#           => intermediate
  JavaScript   => intermediate

  intermediate => C#
  intermediate => JavaScript
将一种语言的输出转换为另一种语言,您可以将一种语言转换为另一种语言:

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

不幸的是,生成的代码可能不友好。

您可以通过为源语言构建解析器,创建语法树,然后将其转换为目标语言中的代码来编写transpiler。根据您的任务不同,不编写transpiler可能更容易,但只需使用基于模板的代码生成来为多个平台创建代码。嗨,yole,您能提供一个链接,指向某种语言的工作示例吗?是一个生成JavaScript的transpiler。查看它的注释源代码;这应该很容易理解。谢谢!那有帮助!这个关于处理目标语言的限制的链接很有帮助:很遗憾SO是如此的删除主义者。此主题是最近才解决的,然后被删除,在,如果是,将显示页面。幸运的是,此主题未被删除。:)好。现在我们应该让它不被关闭(SOER,如果你喜欢另一个答案,投票给“不被关闭”)。这些DMS工具是开源的还是免费的?否则,我很抱歉,但你的回答看起来更像一个广告@库马尔·维巴夫:那么,如果是免费的,那就好了,但如果不是免费的,那就是广告?你为什么不判断它是否回答了OP的问题?这就是SO答案的标准:它必须是相关的。现在,如果回答者有一些私利,就必须声明,无论是免费的、开源的、商业的还是其他的。因此,多年来,政策允许使用“我们的”一词来表明这一点。我很清楚地用过这个词,“不人性化”只是指工具制造商没有为此进行投资,或者他们正在使用糟糕的工具。这不是用于构建此类工具的(好的)技术的固有缺陷。这是beautify.js的工作!!是的,我知道。