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


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


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


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


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


那我相信我可以开始输出代码了。我不需要完美的翻译。我仍然需要查看生成的代码并解决问题。理想情况下,翻译人员应该标记出有问题的翻译。
在您问“这到底是什么意思?”之前,答案是……这将是一次有趣的学习经历。如果您对如何减少这种麻烦有任何见解,请告诉我。

编辑:
我对知道我可以对代码强制执行什么样的模式更感兴趣。比如何翻译更容易翻译(即:IoC,SOA?)代码。

评论

您是否看过诸如.NET CLR或Perl6的Parrot之类的系统?他们将一组语言编译成中间表示,可以由通用解释器运行。如果您可以从中间表示返回到一种语言,则说明您有翻译器。

@Borealid AFAIK .NET CIL相对容易编译,但是希望能从中获得可读的代码。现在看鹦鹉。

其他语言也有类似的项目;我不确定他们的作者有多少。实际上,我需要一个框架并遵守严格的编码约定,从而在这里束缚了自己。

我无法添加任何特定知识,但是您是否看过睡衣(pyjs.org),特别是translator.py?这是python到javascript编译器。

重新编辑:如果您可以控制将要翻译的代码,那么最明显的事情就是避免难以翻译的构造!例如,如果没有任何指针算术,则将C轻松转换为Java。对于Python,我可能会远离闭包。您可以做的另一件事是编写源代码,使难于翻译的部分始终被惯用地编码,从而使其更易于识别和处理特殊情况。

#1 楼

自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定义回馈给整个PHP社区,还是与您自己的收入流过于紧密地关联而无法实现呢?

–TML
2010年8月17日,0:41

许多不希望对收入来源有所贡献,也没有力量去做和自己开源的人已经要求我将我们所做的一切都“开源”。如果您只为一个大型项目贡献一小部分,并且/或者您有其他收入来源,那么“开源”似乎还不错。如果您自己完成了所有工作,这是您唯一的收入来源,那么吸引力将大大降低。 [我不想讨论“自由软件”哲学的相对优点,因此我不会再对此发表任何评论。

–伊拉克·巴克斯特
2010年8月17日在2:04



我同意你在这里所说的话,这就是为什么我像我这样说这个问题。我想我们应该从响应中得出直觉,您认为它与您的收入关系太紧密,而且这绝对没有错-我只是想问一下。

–TML
10年8月20日在9:49

@IraBaxter您只说了有关与计算机相关的习惯的常见成语,这些习俗可以应用于许多其他习惯。与您撰写的所有文章唯一有关的是指向sensualdesigns.com(恰好是您的公司)的链接。

– amirouche
2014年4月3日23:01

您通常在答案中提供指向与Clang相关的页面的链接。这仅证明其他人可以制作网页。我们大多数人都认为写得好的网页意味着在后面进行认真,实际的工作,而不仅仅是欺骗性的欺骗读者的手段,就像您似乎在暗示您的答案一样。您实际上是否认为该网页是欺诈性的?该页面包含“相关”来源的参考信息;它是匿名的,因为这项工作需要合同。我无能为力。

–伊拉克·巴克斯特
16-10-6在11:30



#2 楼

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

简而言之:不要使用解析器

ast模块自Python 2.6起可用,因为它为您提供了现成的AST,因此更适合您的需求。我去年写过一篇文章,但总而言之,请使用parseast方法将Python源代码解析为AST。 parser模块将为您提供解析树,而不是AST。小心区别。

现在,由于Python的AST非常详细,因此对于AST来说,前端工作并不困难。我想您可以很快为功能的某些部分准备一个简单的原型。但是,获得完整的解决方案将花费更多时间,主要是因为这些语言的语义不同。语言的一个简单子集(功能,基本类型等)可以轻松翻译,但是一旦进入更复杂的层次,您将需要笨拙的机制来模仿一种语言的核心。例如,考虑一下Python中不存在的Python生成器和列表理解(据我所知,当涉及PHP时,这显然是很差的)。

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

评论


魏尔2to3只是AST到AST。它不支持做任何超出ast模块功能的事情。请注意,所有翻译都从主机python进程支持的语法到主机python进程支持的语法。没有翻译器会添加功能注释,因为2.6不支持它。

–习惯
2010年8月15日在20:37

...以及OP的问题可能是短期的,如何从Python 2.6 AST过渡到... PHP。 ast模块可能不想很好地表示PHP语法,因此它甚至都不是ast。

–伊拉克·巴克斯特
10年8月16日在1:30

@Aaron:2to3可以看作是使用ast生成的AST的示例。

– Eli Bendersky
10年8月16日在4:11

AFAIK,可以说2to3比将Python转换成PHP更容易(毕竟,从Python转换成Python,对吧)?甚至效果也不佳。请注意,尚未通过2to3推送大量的Python 2.6 ...因为显然还有很多后期翻译的手动修补工作。如果100%自动化,Python 2.6将会失效。

–伊拉克·巴克斯特
10年8月21日在21:40



#3 楼

编写翻译不是没有可能,尤其是考虑到Joel的实习生是在一个夏天完成的。

如果您想使用一种语言,这很容易。如果您想做更多的事情,那会有些困难,但不要太多。最难的部分是,尽管任何图灵完备的语言都可以完成另一种图灵完备的语言所能做的事情,但是内置数据类型却可以显着改变一种语言所要做的事情。

例如:

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


需要复制大量的C ++代码(好的,您可以使用一些循环结构来做得很短,但是仍然可以)。

顺便说一句,我想。

您是否曾经根据语言语法编写过分词器/解析器?如果没有,您可能想学习如何做,因为这是该项目的主要部分。我要做的是提供基本的图灵完整语法-与Python字节码相当相似。然后,您创建一个采用语言语法(也许使用BNF)的词法分析器/解析器,并基于该语法将语言编译为中间语言。然后,您要做的是相反的操作-根据语法将您的语言创建为目标语言的解析器。

我看到的最明显的问题是,一开始您可能会创建效率极低的代码,尤其是在Python之类的更强大的*语言中。

但是,如果以此方式进行操作,那么您可能将能够找到一种方法来优化输出。总结一下:


阅读提供的语法
将程序编译成中间语法(而且是图灵完整的语法)
将中间程序编译成最终语言(基于提供的语法)
...?
Profit!(?)


*通过强大的功能,我的意思是这需要4行:

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


向我展示另一种语言,它可以完成4行这样的工作,而我将向您展示一种与Python一样强大的语言。

评论


“您是否曾经根据语言语法编写过分词器/解析器?”我已经使用JavaCC做到了。

– NullUserException
2010年8月19日在15:42

乔尔的实习生在整个夏天做了一部分工作。他的源语言是现有语言的子集,并且大概可以对该子集进行一些调整。这使工作容易得多。同样,NullPointerException可能要从Python的较简单部分开始,也许要通过较难的内容进行手动转换(如问题中所述)。

– David Thornley
2010年8月19日15:54

@NullUserException:您将有一些了解,但是基本上您将要重新实现JavaCC,您将执行而不是Java作为输出语言。 @David,是的。甚至Thistle在某些语言构造上也需要一些帮助。如果我是OP,那么我会先追求功能,然后再进行优化,否则我将永远被困在试图让C ++进行字符串切片的过程中(包括步骤):p

–Wayne Werner
2010年8月19日在16:07

@WayneWerner作为记录,像C#这样的语言根本不需要换行符。 (至少,在除去单行注释之后没有。)因此您可以在一行中编写任何C#程序。但是我当然知道你在做什么。

–leviathanbadger
13年8月15日在20:40

@ aboveyou00:我认为那是不对的。如果不允许预处理器条件,则可能是正确的。

–伊拉克·巴克斯特
2014年3月28日在9:39

#4 楼

有几个答案告诉您不要打扰。好吧,这有什么帮助?你想学习吗?你可以学习。这是编译。碰巧您的目标语言不是机器代码,而是另一种高级语言。这一直都是做到的。

有一种相对简单的入门方法。首先,获取http://sourceforge.net/projects/lime-php/(如果您想使用PHP)或类似的代码,并查看示例代码。接下来,您可以使用一系列正则表达式编写词法分析器,并将令牌提供给生成的解析器。您的语义动作既可以直接用另一种语言输出代码,也可以建立一些数据结构(认为是对象,人),您可以对其进行按摩和遍历以生成输出代码。

您很幸运使用PHP和Python因为在很多方面它们是彼此相同的语言,但是语法不同。困难的部分是克服语法形式和数据结构之间的语义差异。例如,Python具有列表和字典,而PHP仅具有assoc数组。

“学习者”方法是构建对语言的受限子集有效的东西(例如仅打印语句,简单的数学和变量赋值),然后逐步消除限制。基本上,这就是该领域中所有“大人物”所做的。

哦,由于您在Python中没有静态类型,因此最好编写并依赖PHP函数,例如“ python_add”。 ”,它会根据Python的执行方式添加数字,字符串或对象。

显然,如果允许的话,它会变得更大。

评论


实际上,我没有说“别打扰”。我说的是,“以通用方式翻译语言非常困难”。如果OP继续使用Python树尝试生成PHP的原始方法,那么他将学到很多东西,我全都赞成学习经验。我也是从那里开始的。他将无法轻松添加新语言。

–伊拉克·巴克斯特
2010年8月17日下午13:35

@IraBaxter我不支持您的声明,使用Python-> PHP和PHP-> Javascript会很容易。 cf.答案中间的stackoverflow.com/a/22850139/140837的最后一部分我也处理您的“论点”

– amirouche
2014年4月3日22:47

#5 楼

对于使用ast.parse而不是解析器(我以前不知道)的观点,我将第二个@EliBendersky的观点。我也热烈建议您查看他的博客。我使用ast.parse做Python-> JavaScript转换器(@https://bitbucket.org/amirouche/pythonium)。我通过一些审查其他实现并自己尝试来提出Pythonium设计。我从也是我开始的https://github.com/PythonJS/PythonJS分叉了Pythonium,它实际上是一个完整的重写。整体设计的灵感来自PyPy和http://www.hpl.hp.com/techreports/Compaq-DEC/WRL-89-1.pdf文件。

从头到尾我尝试的一切最好的解决方案,即使看起来像是Pythonium营销,它实际上也不是(不要犹豫告诉我,网络礼仪似乎不正确):


实施Python使用原型继承的Plain Old JavaScript中的语义:AFAIK无法使用JS原型对象系统实现Python多重继承。后来我确实尝试使用其他技巧来做到这一点(参见getattribute)。据我所知,JavaScript中没有实现Python多重继承,最好的是单一继承+ mixins,我不确定它们是否可以处理钻石继承。类似于Skulpt,但没有Google Clojure。
我尝试使用Google clojure,就像Skulpt(编译器)一样,而不是实际阅读Skulpt代码#fail。无论如何因为基于JS原型的对象系统仍然是不可能的。创建绑定非常困难,您需要编写JavaScript和大量样板代码(请参阅https://github.com/skulpt/skulpt/issues/50,其中我是幽灵)。那时,还没有明确的方法将绑定集成到构建系统中。我认为Skulpt是一个库,您只需要将.py文件包含在要执行的html中,开发人员就无需进行任何编译阶段。
尝试过pyjaco(编译器),但是创建绑定(从Python代码调用Javascript代码)非常困难,每次创建的样板代码太多。现在我认为pyjaco更接近Pythonium。 pyjaco是用Python编写的(也是ast.parse),但是很多是用JavaScript编写的,并且使用原型继承。再次。但是在我看来,睡衣正在执行API-> API转换(或框架到框架),而不是Python到JavaScript的转换。 JavaScript框架使用页面中已经存在的数据或来自服务器的数据。 Python代码只是“管道”。之后,我发现睡衣实际上是一个真正的python-> js转换器。

我仍然认为可以进行API-> API(或框架->框架)转换,这基本上是我在Pythonium中所做的,但在较低级别。也许睡衣使用与Pythonium相同的算法...

然后我发现brython完全用Javascript编写,如Skulpt,不需要编译和大量的绒毛...而是用JavaScript编写的。

由于在该项目的过程中写了第一行,所以我了解PyPy,甚至包括PyPy的JavaScript后端。是的,如果找到它,您可以直接从PyPy用JavaScript生成Python解释器。人们说,那是一场灾难。我没有读为什么。但是我认为原因是它们用于实现解释器RPython的中间语言是为转换为C(也许是asm)而定制的Python子集。艾拉·巴克斯特(Ira Baxter)说,在构建某些东西时,您总是会做一些假设,并且可能会对其进行微调,使其在PyPy:Python-> C转换的意义上达到最佳。这些假设在其他情况下可能不相关,更糟糕的是,它们可以推断出开销,否则说直接翻译将很可能总是更好。用Python编写解释器听起来是一个(非常)好主意。但是出于性能原因,我对编译器更感兴趣,实际上将Python编译为JavaScript比解释它更容易。

我开始PythonJS的想法是将我可以轻松组合的Python子集转换为JavaScript。起初,由于过去的经验,我什至没有去实施OO系统。我实现的将Java转换为JavaScript的子集是:


在定义和调用时都具有完整参数语义的函数。这是我最感到自豪的部分。
/ if / elif / else
Python类型已转换为JavaScript类型(没有任何类型的python类型)
可以迭代仅限Javascript数组(用于in数组)
对JavaScript的透明访问:如果您以Python代码编写Array,它将转换为JavaScript中的Array。就可用性而言,这是其竞争对手之上的最大成就。
您可以将Python源代码中定义的函数传递给javascript函数。默认参数将被考虑。
它添加了一个名为new的特殊功能,该功能被转换为JavaScript new,例如:new(Python)(1,2,spam,“ egg”)被转换为“ new Python(1 ,2,垃圾邮件,“鸡蛋”)。
“ var”由翻译程序自动处理。(来自Brett(PythonJS贡献者)的发现非常好。
全局关键字
闭包
lambdas
列表理解
通过requirejs支持导入
单类继承+通过classyjs的mixin

这似乎很多,但与Python。它实际上是具有Python语法的JavaScript。

生成的JS是完美的,即。没有开销,无法通过进一步编辑来改善性能。如果您可以改善生成的代码,也可以从Python源文件中完成。另外,编译器也不依赖您在http://superherojs.com/编写的.js中可以找到的任何JS技巧,因此非常易于阅读。

PythonJS这部分的直接后代是Pythonium Veloce模式。完整的实现可以在以下网址找到:https://bitbucket.org/amirouche/pythonium/src/33898da731ee2d768ced3​​92f1c369afd746c25d7/pythonium/veloce/veloce.py?at=master 793 SLOC +与其他翻译器共享约100 SLOC的共享代码。 />
可以在Veloce模式cf下翻译pystones.py的改编版本。 https://bitbucket.org/amirouche/pythonium/src/33898da731ee2d768ced3​​92f1c369afd746c25d7/pystone/?at=master

设置了基本的Python-> JavaScript转换后,我选择了另一条将完整的Python转换为JavaScript的路径。除了目标语言外,glib进行基于对象的基于类的代码的方式是JS,因此您可以访问数组,类似地图的对象和许多其他技巧,而所有这些都是用Python编写的。 IIRC没有Pythonium转换器编写的javascript代码。获得单继承并不困难,这是使Pythonium完全兼容Python的困难部分:



Python中的spam.egg始终被翻译为getattribute(spam, "egg"),我没有对此进行特别介绍,但是我认为它花了很多时间,我不确定是否可以使用asm.js或其他任何东西来改进它。
方法解析顺序:即使使用Python编写的算法,也可以将其翻译为Python Veloce兼容的代码是一个很大的尝试。

getattributre:实际的getattribute解析算法有点棘手,它仍然不支持数据描述符。
基于元类的类:我知道在哪里插入代码但仍然...
最后一点不是最重要的:some_callable(...)始终转换为“ call(some_callable)”。 AFAIK转换程序根本不使用推理,因此,每次调用时,都需要检查它们将被调用的方式,即调用该对象的类型。

这部分是封装在https://bitbucket.org/amirouche/pythonium/src/33898da731ee2d768ced3​​92f1c369afd746c25d7/pythonium/compatible/runtime.py?at=master中它是用Python编写的,与Python Veloce兼容。

实际的兼容翻译器https://bitbucket.org/amirouche/pythonium/src/33898da731ee2d768ced3​​92f1c369afd746c25d7/pythonium/compatible/compatible.py?at=master不会直接生成JavaScript代码,最重要的是不会进行ast-> ast转换。我尝试过ast-> ast事情,即使ast.NodeTransformer都比cst更好,但也无法使用ast。>,更重要的是,我不需要做ast-> ast。

就我而言,从python ast到python ast至少可能会提高性能,因为我有时会在生成与块相关的代码之前检查块的内容,例如:


产量,到目前为止,生成器在JS中具有一种特殊的语法,因此当我要编写“ var my_generator = function”时,我需要知道哪个Python函数是生成器。

不要真正在每个翻译阶段访问每个节点。

整个过程可以描述为:

Python source code -> Python ast -> Python source code compatible with Veloce mode -> Python ast -> JavaScript source code


Python内置函数是用Python代码(!)编写的,IIRC有一些与引导类型有关的限制,但是您可以访问所有可以在兼容模式下转换Pythonium的内容。看看https://bitbucket.org/amirouche/pythonium/src/33898da731ee2d768ced3​​92f1c369afd746c25d7/pythonium/compatible/builtins/?at=master

读取从pythonium兼容生成的JS代码可以理解,但是源地图将极大地帮助您。

我可以根据这次经验为您提供的宝贵建议是种老屁:现有项目是封闭源代码还是免费的。当我回顾现有的不同项目时,我应该给它更多的时间和动力。
问问题!如果我事先知道PyPy后端是无用的,那是由于C / Javascript语义不匹配导致的开销。我可能会在6个月前或3年前提出Pythonium的想法。
知道你想做什么,有一个目标。对于这个项目,我有不同的目标:实践一些javascript,学习更多Python并能够编写将在浏览器中运行的Python代码(更多内容以及以下内容)。
失败就是经验
小步骤就是一个步骤
从小开始
梦想大
进行演示
iterate

仅使用Python Veloce模式,我感到非常高兴!但是一直以来,我发现我真正想要的是将我和其他人从Javascript中解放出来,但更重要的是能够以舒适的方式进行创建。这使我想到了Scheme,DSL,模型以及最终特定于域的模型(请参阅http://dsmforum.org/)。

关于Ira Baxter的回应:

估计一点都没有帮助。我花了大约6个月的空闲时间来使用PythonJS和Pythonium。所以我可以期望从6个月的全职工作中得到更多。我想我们都知道在企业环境中100个人年意味着什么,根本没有意义...

当某人说某件事情很难或更经常是不可能的事情时,我回答说“只花时间找到不可能的问题的解决方案”,否则就说什么都不是不可能的,除非在这种情况下证明是不可能的。 br />
如果没有证明不可能的话,那么它就有想象的余地:


找到证明不可能的证据




如果不可能,则可能存在“劣等”问题,可以解决。




如果不是这样的话不可能,找到解决办法

这不仅仅是乐观的思考。当我启动Python-> Javascript时,每个人都说这是不可能的。 PyPy不可能。元类太难了。等...我认为,唯一使PyPy超过Scheme-> C纸(已有25年历史)的革命是一些自动JIT生成(基于我认为是用RPython解释器编写的提示)。

大多数说某事“困难”或“不可能”的人没有提供原因。 C ++很难解析?我知道,它们仍然是(免费的)C ++解析器。细节是邪恶的吗?我知道。仅仅说不可能是没有帮助的,它比令人沮丧的“没有帮助”还要糟糕,而且有些人会劝阻其他人。我通过https://stackoverflow.com/questions/22621164/how-to-automatically-generate-a-parser-code-to-code-translator-from-a-corpus听说了这个问题。

最适合您的是什么?这样便可以定义下一个目标,甚至可以达到整体目标。


我对知道可以在代码上实施哪种模式以使其更容易实现感兴趣。翻译(即:IoC,SOA吗?)代码而不是翻译。


我看不到至少不能以一种不太完美的方式将一种语言不能翻译成另一种语言的模式。由于可以进行语言到语言的翻译,因此您最好首先实现这一目标。因为,根据http://en.wikipedia.org/wiki/Graph_isomorphism_problem,我认为两种计算机语言之间的翻译是树或DAG同构。即使我们已经知道它们都已经完成了,所以...

框架->我最好将其可视化为API-> API转换的框架可能仍然是您要记住的改进生成代码的方法。例如:Prolog是非常特定的语法,但是您仍然可以通过在Python中描述相同的图形来像计算一样进行Prolog ...如果我要实现Prolog to Python转换器,我不会在Python中实现统一,而是在C库中实现带有“ Python语法”,这对于Python编写者来说非常容易理解。最后,语法只是我们赋予其含义的“绘画”(这就是我开始使用scheme的原因)。恶意是语言的细节,我不是在谈论语法。语言getattribute挂钩中使用的概念(没有它,您可以生存),但是所需的VM功能(如尾递归优化)可能很难处理。您不必担心初始程序是否不使用尾递归,即使目标语言中没有尾递归,您也可以使用greenlets / event循环对其进行仿真。

对于目标语言和源语言,请查找:


大而具体的想法
小而普遍的想法

这样就会出现:


易于翻译的东西
难以翻译的东西

您也可能知道什么将转换为快速和慢速代码。

还有stdlib或任何库的问题,但没有明确的答案,这取决于您的目标。

成语代码或可读的生成代码也有解决方案...

针对PHP之类的平台比针对浏览器要容易得多,因为您可以提供慢速和/或关键路径的C实现。

鉴于您的第一个项目是将Python转换为PHP,至少对于我所知道的PHP3子集而言,自定义veloce.py是最好的选择。如果您可以为PHP实现veloce.py,那么您也许可以运行兼容模式...同样,如果您可以将PHP转换为可以用php_veloce.py生成的PHP子集,则意味着您可以将PHP转换为veloce.py可以使用的Python子集,这意味着您可以将PHP转换为Javascript。只是说...

您还可以看看这些库:


https://bitbucket.org/logilab/astroid
https://bitbucket.org/logilab/pylint-brain

另外,您可能对此博客文章(和评论)感兴趣:https://www.rfk.id.au/blog/entry / pypy-js-poc-jit /


来自艾拉·巴克斯特(Ira Baxter)的Google技术讲座非常有趣https://www.youtube.com/watch?v=C-_dw9iEzhA



评论


stackoverflow.com/questions/22621164/…中描述了关于一对一计算机语言到计算机语言翻译的唯一让我激动的事情。

– amirouche
2014年4月3日22:38在

我第二个关于数据类型的答案。在Pythonium中,我什至没有计划在没有asm.js的兼容模式下支持正确的整数和浮点类型。

– amirouche
2014年4月3日在22:41

好的,所以,如果我给您一个100K SLOC的Python程序包,并且您通过“翻译器”运行它,那么我是否能正常工作?修复它需要多少翻译后的工作?您在这里说的是,“鉴于已经存在用于构建AST的Python良好解析器,我可以在6个月内构建部分翻译器”。没有人感到惊讶。按照大多数人的标准,6个月并非“轻松”(引用您的另一条评论)。解决剩余的问题将需要更多的努力。我的回答是,基本上“做到这一点并不容易”,而“一般地做到这一点很难”。

–伊拉克·巴克斯特
2014年4月5日13:45

……这是对OP最初需求的回应:“理想情况下,我将能够(相对)轻松地添加其他语言。”,我的答案专门针对该语言。

–伊拉克·巴克斯特
2014年4月5日在14:02

我不同意,尤其是当您知道自己在做什么时,这很容易,接下来要做的并不难,这只是完成事情的问题。我不确定您在哪里处理与该问题有关的任何事情。您在第4或5段中说您的公司做到了,而且很难。但是,否则,您将散布有关该主题的FUD,而像在stackoverflow.com/questions/22621164/…中那样,使话题偏离主题。在6个月的全职时间内,我会写一名完整的翻译。

– amirouche
2014年4月6日在12:45

#6 楼

您可以看一下Vala编译器,该编译器将Vala(一种类似于C#的语言)转换为C。

评论


将Vala转换为C语言并简化gnome库的开发是其设计目标。

– amirouche
2014年4月3日在22:42