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

Python-我可以对代码执行哪种模式以使其更容易翻译为另一种编程语言?

公良修竹
2023-03-14
问题内容

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

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

  • 我还在研究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设计模式并遵循严格的编码约定。这应该使翻译更加容易。 我还在研究IOC和依

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

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

  • 问题内容: 所以我有一个Python脚本: 我正在执行这样的: 但是,我必须安装Python并将其包含在环境变量中才能正常工作。 是否可以通过某种方式将Python可执行文件与Python脚本“捆绑”在一起,以便其他人可以在没有Python的情况下在其PC上运行它? 如果只能在Windows中使用,可以。 编辑: 尝试后,我得到此错误: 问题答案: 这是一种实现方法(对于Windows,使用)。

  • 我有英文的php gettext默认语言 我想在我的一个控制器,翻译一些词在2个其他语言,并把他们全部在一个数组。 理想情况下我可以 但它并不存在。 是每次更改gettext设置的唯一方法吗? 相关:在Google:i18n之后用gettext看到了它,但没有地方设置的麻烦? 以下是建议的已回答的解决方案: https://github.com/philip15b/php-i18n(似乎是最佳解决

  • 本文向大家介绍可以在PostgreSQL表上执行哪种索引?,包括了可以在PostgreSQL表上执行哪种索引?的使用技巧和注意事项,需要的朋友参考一下 索引用于加快PostgreSQL和一般任何关系数据库中的查询执行。PostgreSQL表主要支持几种索引类型。让我们简要讨论3种常见的用户索引类型- hash 这些索引只能处理相等性比较。换句话说,如果我要检查itemA = itemB,则哈希索引