首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Perl有单独的"perl“编译器和"perlcc”前端?

为什么Perl有单独的"perl“编译器和"perlcc”前端?
EN

Stack Overflow用户
提问于 2010-09-01 19:56:39
回答 6查看 4K关注 0票数 3

我试图用我的Perl代码制作一个可执行文件,然后我意识到在perl编译器中没有这样的选项。经过一些搜索之后,我找到了perlcc,它是Perl编译器的前端,并完成这项工作(生成一个二进制文件)。

为什么Perl有单独的编译器和前端?例如,(例如,C/C++中的gcc )本身就是一个完整的工具。是这样的吗,还是有一些好的理由?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-09-01 20:21:28

这个答案是很久以前写的,并没有反映出目前的状况。我宁愿删除这个答案,但我不能,因为它被接受了。请参阅Reini的回答

对于人们来说,将Perl程序编译成二进制程序并不是典型的做法。很多人都想这样做,但这不是它的工作方式。你想做什么?也许还有另一种方法来做你想做的事。

Perl程序实际上分两个阶段执行:编译时和运行时。它也是一种动态语言,所以您不能告诉您在编译阶段结束时需要编译的所有内容,在编译阶段您可能需要运行一些代码。

在这种情况下,Perl更像Java或Ruby,而不是C。运行Perl程序时,perl解释器将加载所有源代码并将其编译为抽象语法树。perl在运行时执行(或解释)的就是字节码。这与Java、Ruby和Python所做的事情是一样的。

Perl的缺点之一是,它没有像其他语言那样保存编译结果的好方法。这意味着每次都会编译源代码。对于pperl和特定于域的工具,比如mod_perl或fastcgi,有一些解决办法。

其中有一些模糊位,包括BEGIN块、eval等等,但这主要是它的工作方式。在perlmod中有更多的细节。

如果我们从我们现在所知道的一切开始,这个设计壁垒就不会存在,而且实际上,在Perl 6中它并不存在。:)

票数 7
EN

Stack Overflow用户

发布于 2011-03-02 21:23:44

我相信您所指的是带有perlcc的B::C套件,它与perl一起出现,直到5.8.9。从那时起,我接手了perl编译器的开发,自1997年以来一直没有得到增强,并修复了大部分剩余的bug。

为什么perl有独立的编译器和前端?

首先(对于其他人):perl是perl解释器的唯一正式前端。

perlcc是编译器B::CB::Bytecode (-B)和B::CC (-O)的前端,C链接器部分也是cc_harness

没有人真的想搞乱后端的各种选择。使用perlcc要容易得多。像gcc一样作为所有后端和中间步骤的驱动程序。gcc对于所有中间步骤也有不同的可执行文件:cc1, cc1plus, collect, as, ld

你想自己打电话给cc1吗?我从没见过这个。

这能充分回答你的问题吗?

顺便说一句,以前的答案基本上都是完全错误的,没有人直接回答拉泽的问题。

@briandfoy: perlcc是而不是是一个死工具,它正在稳步开发,是用于生产代码的。启动时间大大加快。你可以运送单一的可执行文件。90%的普通perl工作。您也可以使用.pmc (就像python那样),但是只有大型站点才能这样做。我建议使用CPAN的版本。

perlcc基本上是在检查时创建一个转储,然后执行转储。所以perlapp (PAR、perl2exe、perlapp)在语义上存在差异,它们在开始之前创建转储并执行它们。参见来自B::C的perlcompile.pod on CPAN。

@mkb: perlcc支持没有受到影响。p5p只是没有足够的能力来修复剩下的bug。所以我就这么做了。见http://search.cpan.org/dist/B-C/

@Chas:当然,perl5会编译成某种“字节码”,即optree。可以使用B::字节码编译器转储它,而ByteLoader用于运行它。还有MAD,它将转储到XML。还有-u,它将转储为二进制表示。它可以用于undump到exe。只是一个简单的链接类的步骤是必要的,我还没有时间。

@Novikov: Perl编译为字节码,然后运行以下代码。正如大多数脚本语言所做的那样。Perl有perlcc,所以您可以将其编译为本机可执行文件。

@zigdon:你把这个和包装者混在一起,比如perl2exe和PAR。

也许是因为perl编译器在FAQ中的输入仍然是错误的,所以我们有这种混乱。

票数 7
EN

Stack Overflow用户

发布于 2010-09-01 20:00:16

更正:它曾经是一个单独的前端.perl实际上不是字节码的编译器。“已编译的”Perl的最终形式是一组抽象语法树,然后由解释器使用。Perlcc支持失败是因为语言变化得足够快,以至于无法跟上。它解决的问题大多是可以通过其他方式解决的,这些方法不需要对单独的源树进行持续维护。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3621670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档