6

我正在使用 PAR::Packer,这个问题突然出现在我的脑海中。PAR::Packer 在 Perl 中是如何工作的?它实际上是否将 Perl 脚本编译为 .exe,就像 g++ 将 C++ 源代码编译为 .exe 一样,或者它是否像 Python 中的 py2exe 一样工作,将解释器和脚本打包成 .exe?

4

2 回答 2

10

为了明确这一点:

  • PAR::Packer这样的工具不会“编译”你的 Perl 脚本。他们将 perl 解释器与您的源文件和任何需要的模块捆绑到一个大的可执行文件中。当它运行时,原始源代码被提取并提供给封闭的 perl。

    这工作得相当好,但不会提高速度(相反......)。唯一的优点是您可以将程序作为单个(尽管很大)文件分发,而无需依赖。

  • 有一个非常实验性的工具perlcc,它能够将一些 Perl 程序转换为 C 或 Perl 字节码序列化。正如文档所说:

    不保证以这种方式生成的代码可以正常工作。整个 codegen 套件(包括 perlcc)应该被认为是非常实验性的。强烈建议不要将其用于生产目的。

    这是因为 Perl 语言不支持静态编译。它需要能够在主执行阶段发生的同一会话期间在解析某些动态功能期间执行代码。

还有其他商业工具,通常与 PAR::Packer(创建胖可执行文件)属于同一类别。

摘要:如果您想要一个可执行文件,请使用 PAR::Packer。如果您想要速度,请内联一些 C(或使用 XS)。没有工具可以将所有 Perl 脚本编译成机器码。

于 2013-08-14T19:08:53.893 回答
2

我正在使用 PAR::Packer,这个问题突然出现在我的脑海中。PAR::Packer 在 Perl 中是如何工作的?

它实际上是否将 Perl 脚本编译为 .exe,就像 g++ 将 C++ 源代码编译为 .exe

没有 pp 和 perl2exe 没有。(虽然 pp 是免费的)。

但它看起来像 perlcc

还是它像 Python 中的 py2exe 一样工作,将解释器和脚本打包成 .exe?

pp 和 perl2exe,是的

例如,sendemail.exe 看起来像是在 PAR Packer 或 Perl2exe 中完成的,它将解释器打包到 exe 中。

您可以在 7-zip 中打开 sendemail.exe!那里有一些文件夹,但实际上看不到它的实际文件。

我想这是某种形式的自解压可执行文件,但是,它执行代码。

你可以用进程监视器来监控它,你看。

或者,使用进程资源管理器,看看它是否使用了它创建的临时目录中的任何 dll。

它创建一个临时目录,例如

C:\Users\user\AppData\Local\Temp\pdk-user <--- Win7

或者

C:\Documents and Settings\user\Local Settings\Temp\pdk-user<-- 操作系统

它创建的临时目录包含一堆奇怪的命名 DLL 和一个名为 perl58.dll 的 DLL,这无疑是 perl 解释器

我确定有一次我看到它有一个正常名称的 dll。SSLEAY32.DLL 有趣的是,当我运行 pl 文件时,它使用了我的 c:\perl64 目录中具有相似名称的 dll。所以EXE看起来真的有点像黑客。直接运行pl文件更可靠。

该目录中的 DIR /s/b 显示-

178c2b604baa8a7f1ebc80539f378bff.dll
1823e8f62785746fd29cf0b06c636600.dll
465d2954d90fe6225ea61b3907c91da8.dll
6145f78a34d5ced8200800f1455d578a <-- the directory with the perl58. dll
9c50b5816b0e35f047e41f5899721d46.dll
f4e2e0db77ed1e6572c2f490479cd815.dll
f72f556d99dfb6b0c3bb37f123e2ee96.dll
6145f78a34d5ced8200800f1455d578a\perl58.dll

除了 perl58.dll 之外,没有显示正常的命名 DLL(尽管我过去曾在那里看到过正常的 DLL)。

如果您查看进程资源管理器,您会看到它使用 perl58.dll 和其他正常命名的 dll

如果你查看 PAR 网站,一个页面描述了 perl2exe

Perl2Exe 是商业的命令行应用程序,可以从 perl 源构建独立的可执行文件。它通过创建一个包含

一个独立的 perl 解释器(能够理解 perl 5.8.x)你的 perl 脚本和你的 perl 脚本引用的所有 perl 模块。

pp - PAR Packager 提供相同的功能,但是是免费的。

如果你看这里

http://www.perlmonks.org/?node_id=237943

...the perl2exe tool is not a way to hide your source code.
Now it's even come to the attention of the security community (reported in bugtraq, for example).

For details, see the report from net-security's page.

Please stop supporting perl2exe. Please use PAR for a complete installation package, or perlcc to simply compile the top-level program.

-- Randal L. Schwartz, Perl hacker 

因此,PP 和 perl2exe 将解释器组合到 EXE 中,当它以 7zip 打开时,您会发现 EXE 有一些有趣的非典型性!

perlcc 可以正确编译。

它似乎已经有一段时间没有维护了http://www.perlmonks.org/?node_id=654568,人们说它有问题,但最近在 2014 年 6 月http://www.yapcna 上做了一些工作。 org/yn2014/talk/5603 它比解释的 perl 获得更好的性能。(与打包解释器的 EXE 不同,后者比正常运行 perl 脚本要慢)。

于 2014-09-22T11:30:37.810 回答