我可以在代码上强制实施哪些类型的模式,以便更轻松地转换为另一种编程语言?[已关闭]

我正在着手做一个副项目,其目标是将代码从一种编程语言翻译成另一种编程语言。我开始使用的语言是PHP和Python(Python到PHP应该更容易开始),但理想情况下,我能够(相对)轻松地添加其他语言。计划是:

  • 这是针对Web开发的。原始代码和目标代码将位于框架之上(我还必须编写框架)。这些框架将采用MVC设计模式并遵循严格的编码约定。这应该使翻译更容易一些。

  • 我也在研究IOC和依赖注入,因为它们可能会使翻译过程更容易,更不容易出错。

  • 我将使用Python的解析器模块,它允许我摆弄抽象语法树。显然,我能得到的最接近PHP的是token_get_all(),这是一个开始。

  • 从那时起,我可以构建AST,符号表和控制流。

然后我相信我可以开始输出代码。我不需要完美的翻译。我仍然必须检查生成的代码并修复问题。理想情况下,译者应该标记有问题的翻译。

在你问“这到底是什么意思?答案是...这将是一次有趣的学习经历。如果您对如何使这不那么令人生畏有任何见解,请告诉我。


编辑:

我更感兴趣的是知道我可以在代码上强制实施哪种模式,以便更容易地翻译(即:IoC,SOA?)代码,而不是如何进行转换。


答案 1

自1995年以来,我一直在构建工具(DMS Software Reengineering Toolkit)来进行通用程序操作(语言翻译是一个特例),并得到了一个强大的计算机科学家团队的支持。DMS提供通用解析,AST构建,符号表,控制和数据流分析,翻译规则的应用,带有注释的源文本的再生等,所有这些都通过计算机语言的明确定义进行参数化。

你需要做这个的机器数量是巨大的(特别是如果你想能够以一般的方式为多种语言做到这一点),然后你需要可靠的解析器来解析定义不可靠的语言(PHP就是一个很好的例子)。

你考虑建立一个语言到语言的翻译器或尝试它没有错,但我认为你会发现,对于真正的语言来说,这是一项比你预期的要大得多的任务。我们仅在DMS上投入了大约100个人年,在每个“可靠”语言定义(包括我们为PHP痛苦地构建的语言定义)中还有6-12个月,对于C++等令人讨厌的语言,则更多。这将是一次“地狱般的学习经历”;它一直适合我们。(您可能会发现上述网站上的技术论文部分很有趣,可以快速开始学习)。

人们经常试图通过从他们熟悉的一些技术开始来构建某种通用的机器,这些技术可以完成一部分工作。(Python AST就是很好的例子)。好消息是,部分工作已经完成。坏消息是,机器内置了无数的假设,其中大部分你都不会发现,直到你试图把它变成做别的事情。在这一点上,你发现机器被连接到做它最初做的事情,并且会真正,真正地抵制你让它做其他事情的尝试。(我怀疑尝试让Python AST对PHP进行建模会很有趣)。

我最初开始构建DMS的原因是构建很少内置此类假设的基础。它有一些让我们头疼的问题。到目前为止,还没有黑洞。(在过去的15年里,我工作中最困难的部分是试图防止这种假设悄悄进入)。

很多人也犯了一个错误,认为如果他们能够解析(也许得到AST),他们就可以很好地做一些复杂的事情。其中一个难教训是,您需要符号表和流分析来进行良好的程序分析或转换。AST是必要的,但还不够。这就是为什么Aho&Ullman的编译器书没有停在第2章的原因。(OP有这个权利,因为他计划在AST之外建造更多的机器)。有关此主题的详细信息,请参阅解析后的生命周期

关于“我不需要完美的翻译”的评论很麻烦。弱翻译者所做的是转换“简单”的80%的代码,而将困难的20%留给手工完成。如果您打算转换的应用程序非常小,并且您只打算转换一次,那么20%是可以的。如果您想转换许多应用程序(甚至是随时间变化而发生微小变化的应用程序),这并不好。如果您尝试转换100K SLOC,那么20%是20,000行原始代码行,这些代码在另外80,000行您已经不理解的已翻译程序的上下文中难以翻译,理解和修改。这需要付出巨大的努力。在百万线水平上,这在实践中根本不可能。(令人惊讶的是,有些人不信任自动化工具,坚持手工翻译数百万行系统;这更难,他们通常会痛苦地发现长时间的延迟,高成本和经常彻底的失败。

要翻译大型系统,您必须追求的是高九十年代的转化率,或者您可能无法完成翻译活动的手动部分。

另一个关键考虑因素是要翻译的代码的大小。即使使用良好的工具,构建一个工作强大且强大的翻译器也需要花费大量精力。虽然构建一个转换器而不是简单地进行手动转换似乎既性感又酷,但对于小型代码库(例如,在我们的经验中,高达大约100K SLOC),经济学根本无法证明这一点。没有人喜欢这个答案,但如果你真的只需要翻译10K SLOC的代码,你可能最好咬紧牙关去做。是的,这很痛苦。

我认为我们的工具非常好(但是,我非常有偏见)。而且要培养一个好的译者还是很难的。这需要我们大约1.5-2人年,我们知道如何使用我们的工具。不同之处在于,有了这么多的机器,我们成功的频率要比失败的次数高得多。


答案 2

我的答案将解决解析Python的特定任务,以便将其翻译成另一种语言,而不是Ira在他的答案中很好地解决的更高层次的方面。

简而言之:不要使用解析器模块,有一种更简单的方法。

该模块自Python 2.6以来可用,更适合您的需求,因为它为您提供了现成的AST供您使用。我去年写了一篇关于这个问题的文章,但简而言之,使用将Python源代码解析为AST的方法。该模块将为您提供解析树,而不是AST。警惕差异astparseastparser

现在,由于Python的AST非常详细,给定AST,前端工作并不是非常困难。我想你可以很快地为功能的某些部分准备一个简单的原型。但是,获得完整的解决方案将花费更多时间,主要是因为语言的语义不同。语言的简单子集(函数,基本类型等)可以很容易地翻译,但是一旦你进入更复杂的层,你将需要重型机器来模拟另一种语言的核心。例如,考虑Python的生成器和列表推导,它们在PHP中不存在(据我所知,当涉及PHP时,这无疑是很差的)。

为了给你最后一个提示,请考虑 Python 开发人员创建的工具,用于将 Python 2 代码转换为 Python 3 代码。在前端方面,它具有将Python转换为某些内容所需的大多数元素。但是,由于Python 2和3的核心是相似的,因此不需要仿真机制。2to3


推荐