2009-06-30 60 views
15

在我的新工作中,更多的人使用Python而不是Perl,而且我有一个非常有用的API,我自己编写,我想用Python提供给我的同事。是否有编程工具用于Perl到Python的转换?

我认为将Perl代码编译为Python代码的编译器对于这样的任务非常有用。在尝试编写解析Perl的东西(或者至少是我在定义API时使用的Perl子集)之前,我从咨询公司得到了bridgekeeper

对于我来说,聘请顾问来翻译这个API几乎肯定是不值得的,但这是一个非常有趣的工具。

有谁知道编译器会解析(或尝试解析!)Perl5代码并将其编译为Python?如果没有这样的事情,我该如何开始编写一个简单的编译器来解析我的面向对象的Perl代码并将其转换为Python?有没有可以用作起点的ANTLR或YACC语法?

编辑:我发现perl.y,这可能是一个起点,如果我要推出我自己的编译器。

回答

28

詹姆斯,

我建议你刚刚改写在Python模块,有以下几个原因:

  1. 解析Perl是DARN硬。除非这对你来说是一项重要和理想的练习,否则你会花更多的时间在翻译上花费更多的时间,而不是有用的工作。
  2. 通过重写它,您将有很大的机会练习Python。学习最好是通过做,完成你真正需要完成的任务是一个伟大的恩赐。
  3. 最后,Python和Perl有很不相同的哲学。要获得更多Pythonic API,最好只用Python重写它。
+1

PERL是完整的构造,不会轻易地转换为Python。 PERL要求人们阅读并理解代码背后的意图。 – 2009-06-30 10:08:45

+6

s/PERL/Perl/g(除非你比我怀疑的要好) – ijw 2009-06-30 10:39:59

6

我从来没有试过它,似乎没有维护,但也许PyPerl是一个选项?

这个API有多大?如果真的这有用,那么你为什么不重写它在Python中。编写自动转换器可能需要更长的时间,然后重写API。

即使你设法自动重写它,结果代码可能不会是非常pythonic无论如何。

一定要通过weismat检查出的答案和eliben

+0

or Inline :: Python – 2009-06-30 11:12:43

16

我认为你应该重写你的代码。解析结果的质量取决于您的Perl编码风格。 我认为下面的报价总结了理论方面很好。 维基百科:Perl in Wikipedia

Perl有一个图灵完全语法解析,因为可通过在编译阶段执行的运行时代码的影响[25]因此,Perl不能由直接的Lex/Yacc词法分析器/解析器组合来分析。相反,解释器实现自己的词法分析器,它与修改过的GNU野牛分析器进行协调,以解决语言中的歧义问题。

通常会说“只有perl可以解析Perl”,这意味着只有Perl解释器(perl)才能解析Perl语言(Perl),但即使这样也不是真的。由于Perl解释器可以在其编译阶段模拟图灵机,因此需要确定停机问题以便在每种情况下完成解析。这是一个长期以来的结果,暂停问题是不可判定的,因此即使Perl不能总是解析Perl。 Perl使得用户可以在自己的编译阶段访问其完整的编程能力。理论纯度方面的成本很高,但实际的不便似乎很少见。

其他解析Perl的程序,例如源代码分析器和自动压缩器,不得不与不明确的语法结构竞争,而且还要与一般情况下Perl解析的不可判定性相抗衡。 Adam Kennedy的PPI项目专注于将Perl代码解析为文档(保持其文档完整性),而不是将Perl解析为可执行代码(甚至连Perl本身都无法做到)。肯尼迪首先推测说,“解析Perl受到'停顿问题'的困扰”[26],并且后来证明了这一点。[27]

7

在5.10开始,你可以编译的Perl启用实验Misc Attribute Decoration和PERL_XMLDUMP环境变量设置为一个文件名,以获得解析树(包括注释 - 语言翻译非常有帮助)的XML转储。尽管如文档所述,这是一项正在进行的工作。

4

尽可能把它转换成python或者用python重写它可能很有趣,但我不会让它成为我的第一选择。那么你会被卡在一个分叉代码库。你所做的任何修改都必须重复。

为你的API写一些你可以从Perl之外访问的包装器。一种可能性是RESTful界面。另一种方法是,如果您不想处理网络问题,则需要创建一组访问API的命令行工具(可能将信息作为JSON传递)。然后你可以编写一个简单的python库,使用httplib2或subprocess访问包装器API(取决于你如何实现包装器)。

只要界面发生变化,您仍然需要更新Python API,但现在只能用于界面更改。

3

你可以尝试编写一个分析器PPI,将其转储到一些中间形式,然后从那里写入Python。很难但可行。有用?呃....

或者您可以将您的代码移植到Perl 6,等待Pynie准备就绪,以允许在相同的运行时间内从Python直接调用Perl6!毕竟这并不遥远。太糟糕了Ponie已经死了。

相关问题