当前位置: 首页 > 面试题库 >

我可以对代码执行哪种模式以使其更容易转换为另一种编程语言?[关闭]

萧玮
2023-03-14
问题内容

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

  • 这是针对Web开发的。原始代码和目标代码将位于框架的顶部(我也将不得不编写这些框架)。这些框架将包含MVC设计模式并遵循严格的编码约定。这应该使翻译更加容易。

  • 我还在研究html" target="_blank">IOC和依赖项注入,因为它们可能使翻译过程更容易且更不易出错。

  • 我将使用Python的解析器模块,该模块可让我摆弄抽象语法树。显然,我可以用PHP获得的最接近的是token_get_all(),这是一个开始。

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

然后,我相信我可以开始输出代码了。 我不需要完美的翻译 。我仍然需要查看生成的代码并解决问题。理想情况下,翻译人员应标记有问题的翻译。

在您问“这到底是什么意思?”之前 答案是……这将是一次有趣的学习经历。如果您对如何减少这种麻烦有任何见解,请告诉我。

编辑:

我更想知道我可以对代码强制执行哪种类型的模式,而不是如何进行翻译,从而使代码的翻译(即:IoC,SOA?)更容易。


问题答案:

自1995年以来,在强大的计算机科学家团队的支持下,我一直在构建工具(DMS软件再造工具包)来进行通用程序处理(语言翻译为特例)。DMS提供通用解析,AST构建,符号表,控制和数据流分析,转换规则的应用,带有注释的源文本的再生等,所有这些都通过计算机语言的显式定义进行参数化。

机器,你需要做到这一点的量 _也_为广大的(特别是如果你希望能够在一个通用的方式来做到这一点对于多国语言),然后你需要用不可靠的定义语言可靠分析器(PHP是这个完美的例子)。

您考虑构建或尝试进行语言到语言的翻译并没有错,但是我认为您会发现,对于真正的语言而言,这比您预期的要艰巨得多。我们仅在DMS上投入了大约100个人年,在每种“可靠”的语言定义(包括我们为PHP痛苦地构建的一种语言)上又花了6到12个月的时间,对于讨厌的语言(例如C
++)则要花更多的时间。这将是“一次学习经历”;这一直在我们身上。(您可能会发现上述网站上的“技术论文”部分有趣,可快速开始学习)。

人们经常尝试从某种他们熟悉的技术入手来构建某种通用的机器。(Python
AST是一个很好的例子)。好消息是,这项工作已经完成。坏消息是,机械中内置了无数的假设,直到您尝试将其进行其他操作时,您才会发现其中的大部分内容。到那时,您发现机器已连接起来可以执行其最初的工作,并且会真的,真的会抵制您使它做其他事情的尝试。(我怀疑尝试让Python
AST建模PHP会很有趣)。

我最初开始构建DMS的原因是建立的基础很少内置这样的假设。它使我们有些头痛。到目前为止,还没有黑洞。(在过去的15年中,我工作中最难的部分是试图防止这种假设蔓延)。

很多人也犯了一个错误的假设,即如果他们可以解析(并且可能获得AST),那么他们正在做复杂的事情。艰巨的教训之一是,您需要符号表和流程分析才能进行良好的程序分析或转换。AST是必要的,但还不够。这就是Aho&Ullman的编译器书不止于第二章的原因。(OP拥有此权利,因为他计划在AST之外构建其他机器)。。

关于“我不需要完美的翻译”的评论很麻烦。弱翻译的作用是转换80%的“简单”代码,而剩下20%的困难手动完成。如果要转换的应用程序很小,并且只打算转换一次,那么20%就可以了。如果要转换许多应用程序(甚至是随时间变化很小的同一应用程序),那不是很好。如果您尝试转换100K
SLOC,那么20%就是20,000原始代码行,这些代码难以翻译,理解和修改,而您还无法理解另外80,000行已翻译程序。这需要大量的努力。在百万线级别,这实际上是不可能的。
更难 ,他们通常会长时间拖延,付出高昂的代价,并且常常会彻底失败,这很痛苦。

要翻译大型系统,您需要拍摄的是90%的高转换率,或者您可能无法完成翻译活动的手动部分。

另一个关键考虑因素是要翻译的代码大小。即使使用良好的工具,也要花费大量的精力来构建能正常运行的强大翻译器。尽管构建翻译器而不是简单地进行手动转换似乎很性感和酷,但是对于较小的代码库(例如,根据我们的经验,最多10万个SLOC),经济学根本无法证明其合理性。没有人喜欢这个答案,但是,如果您真的只需要翻译10K
SLOC代码,则最好是硬着头皮做一下。是的,那很痛苦。

我认为我们的工具非常出色(但是,我有很大的偏见)。建立一个好的翻译仍然很困难。我们大约需要1.5至2人年,我们知道如何使用我们的工具。区别在于,有了如此多的设备,我们成功的次数多于失败的次数。



 类似资料:
  • 问题内容: 我可以对代码执行哪种模式以使其更容易翻译为另一种编程语言?[关闭]我正着手做一个副项目,目标是将代码从一种编程语言转换为另一种编程语言。我开始使用的语言是PHP和Python(Python到PHP应该更容易入手),但理想情况下,我可以(相对)轻松地添加其他语言。该计划是: 这是针对Web开发的。原始代码和目标代码将位于框架的顶部(我也将不得不编写这些框架)。这些框架将包含MVC设计模式

  • 人们可以称之为语言转移,但这听起来不太专业。在这个特定的案例中,我写的是将程序从Java转移到Python,如果这与答案相关的话。

  • 我在实践中读到了一致性。现在我想了解如何处理InterruptedException 来自书籍的建议: -传播异常(可能在特定于任务的清理之后),使您的方法也成为可中断的阻塞方法;或者,恢复中断状态,以便调用堆栈中更高级别的代码可以处理它 -只有实现线程中断策略的代码才能吞咽中断请求。通用任务和库代码绝不应吞没中断请求。 前两种说法我很清楚,但第三种我不明白。你能澄清一下吗?最好提供示例。 吞下中

  • 本文向大家介绍Scala与Python | 哪种编程语言更好,包括了Scala与Python | 哪种编程语言更好的使用技巧和注意事项,需要的朋友参考一下 Scala是Martin Odersky在2004年开发的通用编程语言。 Scala和Python都是通用编程,在支持面向对象编程的数据科学中使用。 由van Rossum于1991年开发的Python是解释型高级通用编程语言。 由Martin

  • 问题内容: 有很多示例可以使用jQuery在javascript/dom中实现某些功能。但是,使用jQuery并非总是一种选择,它会使理解jQuery编写的javascript解决方案的示例变得困难。 有没有一种简单的方法可以将jQuery代码转换为常规javascript?我猜不必访问或理解jQuery源代码。 问题答案: 最简单的方法是仅学习如何使用普通的DOM api进行DOM遍历和操作(您

  • 问题内容: 从理论上讲,Dalvik执行任何虚拟机字节代码,例如使用以下程序的编译器创建的 AspectJ ColdFusion Clojure Groovy JavaFX Script JRuby Jython Rhino Scala Dalvik的字节码编译器是否已有工作版本,可用于Java以外的其他语言? 问题答案: 在发布时,它是用于构建可分发的第三方Android软件的唯一官方支持的编程