我可以在代码上执行什么样的模式,以便更容易地转换为另一种编程语言?

问题:

我正在设计一个侧面项目,目的是将代码从一种编程语言翻译成另一种编程语言。我开始的语言是PHP和Python(Python到PHP应该更容易开始),但理想情况下,我可以添加(相对)容易的其他语言。计划是:

  • 这是面向Web开发的。原始和目标代码将被置于框架之上(我也必须写)。这些框架将包含一个MVC设计模式,并遵循严格的编码习惯。这应该使翻译更容易。
  • 我也在看IOC和依赖注入,因为它们可能使翻译过程更容易,更容易出错。
  • 我将利用Python的parser module,这使我可以理解抽象语法树。显然,我可以用PHP最接近的是token_get_all(),这是一个开始。
  • 从那时起,我可以构建AST,符号表和控制流程。

然后我相信我可以开始输出代码。 我不需要一个完美的翻译。我仍然需要查看生成的代码并解决问题。理想情况下,翻译者应该标记有问题的翻译。
在你问“这到底是什么之前?答案是…这将是一个有趣的学习经验。如果您对如何使这种做法不那么令人生畏有任何见解,请告诉我们。

编辑:

我更有兴趣知道我可以在代码上执行哪些类型的模式,以使其更容易翻译(即:IoC,SOA?)代码,而不是如何进行翻译。

回答:

自1995年以来,我一直在building tools (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之外建立额外的机器)。有关此主题的更多信息,请参阅Life After Parsing
关于“我不需要完美的翻译”的评论很麻烦。翻译人员的弱点是将80%的代码转换成“容易”的代码,用手做20%的努力。如果你想要转换的应用程序很小,而且你只打算一次转换一次,那么20%就可以了。如果你想转换许多应用程序(或者甚至是一个随着时间的细微变化的应用程序),这不是很好。如果您尝试转换100K SLOC,那么20%是原始的20,000行代码,难以翻译,理解和修改,您已经不了解的另外8万行翻译程序。这需要大量的努力。在百万线级别,这在实践中根本是不可能的。 (令人惊讶的是,有人不信任自动化工具,并坚持手工翻译百万行系统;甚至是harder,他们通常会长时间延误,成本高昂,往往彻底失败而发现。
为了翻译大型系统,你必须拍摄的是高达90年代的转化率,或者很可能您无法完成翻译活动的手册部分。
另一个关键的考虑因素是要翻译的代码的大小。建立一个工作,强大的翻译器,甚至使用良好的工具需要很多的精力。虽然构建翻译器而不是简单地进行手动转换似乎是性感和酷炫的,但对于小代码库(例如,在我们的经验中高达约100K的SLOC),经济学根本无法证明它。没有人喜欢这个答案,但是如果你真的要翻译10K的SLOC代码,那么你最好只是咬着子弹,做这个。是的,这很痛苦。
我认为我们的工具非常好(但是我很有偏见)。而建立一位好翻译还是很难的。我们需要约1.5-2个人年,我们知道如何使用我们的工具。不同的是,使用这么多的机器,我们succeed比我们失败多得多。

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: What kinds of patterns could I enforce on the code to make it easier to translate to another programming language?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

62 − = 52