为了账号安全,请及时绑定邮箱和手机立即绑定

我可以在代码上强制什么类型的模式来使转换成另一种编程语言更容易呢?

我可以在代码上强制什么类型的模式来使转换成另一种编程语言更容易呢?

慕森王 2019-06-26 13:29:07
我可以在代码上强制什么类型的模式来使转换成另一种编程语言更容易呢?我正着手做一个附带项目,其目标是将代码从一种编程语言转换为另一种编程语言。我开始使用的语言是PHP和Python(Python到PHP应该更容易开始),但理想情况下,我可以轻松地添加其他语言。计划是:这是面向Web开发的。原始代码和目标代码将位于框架之上(我也必须编写这些框架)。这些框架将采用MVC设计模式,并遵循严格的编码约定。这应该会使翻译更容易一些。我还研究了IoC和依赖项注入,因为它们可能使翻译过程更容易,并且更容易出错。我会利用Python的解析器模块,这让我可以摆弄抽象语法树。显然,我在PHP中能得到的最接近的是令牌get_all(),这是一个开始。从那时起,我可以建立AST,符号表和控制流。那我就可以开始输出代码了。我不需要完美的翻译..我仍然需要检查生成的代码并修复问题。理想情况下,译者应该标记有问题的翻译。在你问“这到底有什么意义?”答案是.。这将是一次有趣的学习体验。如果你对如何使这件事不那么令人畏惧有任何见解,请告诉我。编辑:我更感兴趣的是,我可以在代码上执行什么样的模式,以便更容易地转换(例如:IoC,SOA?)代码比如何进行翻译。
查看完整描述

3 回答

?
杨__羊羊

TA贡献1943条经验 获得超7个赞

我的回答将讨论解析Python的具体任务,以便将其翻译到另一种语言,而不是Ira在回答中很好地讨论的更高层次的方面。

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

这个ast模块,因为Python2.6更适合您的需要,因为它为您提供了一个现成的AST。我写了一个关于这方面的文章去年,但简而言之,使用parse方法ast将Python源代码解析为AST。这个parser模块将给您一个解析树,而不是AST。提防差别.

现在,由于Python的AST非常详细,假设有AST,前端工作并不难。我想您可以很快地为某些部分的功能准备一个简单的原型。然而,获得一个完整的解决方案需要更多的时间,主要是因为语言的语义不同。语言的一个简单子集(函数、基本类型等)可以很容易地被翻译,但是一旦进入更复杂的层,就需要大量的机器来模仿另一种语言的核心。例如,考虑Python的生成器和PHP中不存在的列表理解(据我所知,这在涉及PHP时显然很差)。

要给你最后一个提示,请考虑2to3由Pythondevs创建的工具,用于将Python 2代码转换为Python 3代码。就前端而言,它具有您需要将Python转换为的大多数元素。某物..但是,由于Python 2和3的内核是相似的,因此不需要仿真机器。


查看完整回答
反对 回复 2019-06-26
?
胡子哥哥

TA贡献1825条经验 获得超6个赞

写一个翻译并不是不可能的,特别是考虑到乔尔的实习生做了一个夏天。

如果你想学一种语言,这很容易。如果你想做的更多,这是有点困难,但不是太多。最难的部分是,尽管任何图灵完整语言都可以完成另一种图灵完整语言所做的工作,但内置的数据类型可以显着地改变一种语言所做的事情。

例如:

word = 'This is not a word'print word[::-2]

采取罗得C+代码的复制(好的,你可以用一些循环结构做得很短,但仍然是这样)。

我想这有点离题吧。

您曾经基于语言语法编写过标记器/解析器吗?如果你没有这样做的话,你可能想学习如何去做,因为这是这个项目的主要部分。我要做的是想出一个基本的图灵完整语法-类似于Python。字节码..然后创建一个接受语言语法的词汇/解析器(可能使用BNF),并根据语法将语言编译成您的中间语言。然后,您要做的是做相反的-创建一个解析器从您的语言到目标语言的基础上的语法。

我看到的最明显的问题是,一开始你可能会可怕效率低下的代码,特别是在更强大的*语言(如Python)中。

但是,如果您这样做,那么您可能能够找到优化输出的方法。总结如下:

  • 读提供语法
  • 将程序编译成中间语法(但也包括图灵完整语法)
  • 将中间程序编译成最终语言(基于提供的语法)
  • ...?

  • 利润!(?)

*我的意思是,这需要4行:

myinput = raw_input("Enter something: ")print myinput.replace('a', 'A')print sum(ord(c) for c in myinput)print myinput[::-1]

向我展示另一种语言,它可以在4行中完成类似的任务,我将向您展示一种与Python一样强大的语言。


查看完整回答
反对 回复 2019-06-26
  • 3 回答
  • 0 关注
  • 500 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信