本周在 p5p 2000/06/18

备注

您可以订阅此摘要的电子邮件版本,只需向 [email protected] 发送空消息。

请将更正和补充发送至 [email protected],其中 YYYYMM 是当前年份和月份。

本周的报告稍微提前了,因为我明天要去圣地亚哥 Usenix。下周的报告将涵盖我本周遗漏的内容,可能晚一些,因为我刚刚从 YAPC 返回。

本周内容相当杂乱。Doug McEachern、Nicholas Clark 和 Simon Cozens 做出了出色的工作,而其他一些人则浪费了很多时间。

方法调用速度提升

Doug McEachern 编写了一个补丁,以实现编译时优化:类方法调用,以及对具有声明类的变量(如 my Dog $spot)的方法调用,将方法调用的代码重写为如果请求了普通子程序调用。例如,如果您有

        my Class $obj = ...;
        $obj->method(...);

并且实际被调用的方法是 Parent::method,那么 Perl 将假装您实际编写了

        my Class $obj = ...;
        Parent::method($obj, ...)

而不是。Doug 发现方法调用确实变快了——在某些情况下比普通子程序调用还要快。(然而,我不明白这是如何可能的。) Doug 的方法的一个副作用(或者也许它是一个缺点?)是您现在可以启用方法调用上的原型检查。

这里还有大量工作要做。Doug 的补丁实际上并没有加快方法调用的速度;它用普通子程序调用替换了方法调用。看到一些真正使方法调用更快的工作将很好。

补丁。

更多尝试让 B::Bytecode 更快

B::Bytecode 的全部目的是加快 Perl 程序的启动时间。两周前 Benjamin Stuhl 报告说,字节码文件实际上比普通源文件要慢,可能是因为字节码文件太大,读取它们需要花费很多时间。

上一期摘要

Nicholas Clark 探索了压缩字节码文件。他修复了 [Byteloader.xs],使其成为一个真正的过滤器,可以安装在另一个过滤器之上;在这种情况下,是一个解压缩 gzip 数据的过滤器。

这没有奏效;解压缩的开销使得压缩的字节码文件甚至比未压缩的字节码文件还要慢。Time Bunce 指出,这是一个糟糕的测试,因为字节编译器和字节加载器将加载的许多模块是更大的脚本本来就需要的东西,但在 Nicholas 的 hello.pl 测试中根本不存在。

Nickolas Clark

  1. 目前字节码与脚本的大小相比过大。(我想有人给列表发了减少保存为字节码的操作树信息的改进,这应该会有所帮助)
  2. 对于简单的脚本,字节码比纯 Perl 慢。
  3. 使用通用数据压缩算法(zipdeflation)字节码仅压缩了 3 倍,这仍然使其比脚本大得多。
  4. 用 Perl 编写的解压缩过滤器运行非常慢。(但是写起来比用 C 编写容易得多)
  5. 尽管用 C 编写的解压缩过滤器要快得多,但它仍然无法与读取和解析字节码的速度相匹配,更不用说原始脚本(在这个例子中)。然而,它接近于未压缩的字节码。

Nicholas 的消息中还包含了关于字节码的许多其他有趣细节。

阅读相关内容。

字节序标记继续

Simon对他的补丁进行了另一次修订,使Perl能够自动处理各种Unicode变体编写的源代码。他做了很多工作,让词法分析器只在文件的非常开头识别BOM。(一个惊人的事实:如果你有

        ...some code here...
        #line 1
        #!/usr/bin/perl -wT
        ...more code...

#line 1会让词法分析器误以为接下来的内容是第一行,然后Perl会解释注释中随后的“命令行”选项,即使它们实际上不是文件的第一行。)

Simon:是的,pp_ctl中的这部分确实需要这么复杂,顺序也很重要。如果你要欺骗词法分析器,你必须非常令人信服。

显然,Simon后来发布了一个更简单的修订版本,使用了tell来检查BOM是否真的在文件开头,但这个修订版本没有出现在p5p上。

Slurp Bug

上个月,Joey Hess报告了Perl的slurping存在一个bug;它逐行读取,而它不应该这样做。

原始报告和测试案例。

没有人调查这个问题,Sarathy说这很遗憾,我认为这应该被视为一个暗示,即应该有人看一下。

EPOC 端口

Olaf Flebbe发布了一些他对EPOC操作系统的端口进行改进,这是一个用于掌上电脑和手机的操作系统。(有关更多详细信息,请参阅Perl发行版中的README.epoc。)

补丁。

README.hpux

Jeff Okamoto贡献了一个新的版本。

这就是它。

MacPerl 中的路径

上周,Peter Prymmer贡献了一个大补丁,尝试通过将许多Unix样式的路径名(如'../lib')替换为($^O eq 'MacOS') ? '::lib:' : '../lib'形式的构造,使测试套件在Macintosh上运行得更好。这引发了一场关于如何更好地处理这个问题的讨论。Chris Nandor建议创建一个paths.pl文件,测试套件可以要求它设置路径字符串。他指出,如果这个库与要求它的脚本在同一个目录中,那么在任何平台上都可以使用require。他还说,对路径转换有本地支持可能是一个坏主意。(这意味着require 'foo/bar.pm'实际上会加载foo:bar.pm,这是“正确的事情”,除非你实际上想要加载名为foo/bar.pm的文件。)

Matthias报告了他实际上在MacPerl中做了什么。

关于测试套件应该做什么的问题似乎没有得到解决。我还不确定Peter的大补丁是否被采纳。

非破坏性匿名函数

上周,Rocco Caputo报告说,即使在解释器关闭时,他的圣洁代码引用也没有被DESTROY。Nick Ing-Simmons提供了解释。我想这可以被称为一个特性。

解释。

回归测试所需的扩展

Nicholas Clark指出,如果你没有构建所有的Perl标准扩展模块,一些回归测试会失败,回归测试不应该依赖于扩展模块,除非它们明确测试扩展模块。

例如,测试文件io/openpid.t想要使用Fcntl模块;如果你决定不构建Fcntl,它就会出错。Nick提出要制作一个补丁,Sarathy也同意这是一个好主意。我还没有看到补丁出现。

Eudora 问题

我最初报告的Eudora篡改补丁文件的问题比我想象的要复杂。如果你使用Eudora,你可能会想阅读以下讨论。

Eudora讨论。

crypt 文档

Ben Tilly对crypt函数的文档进行了一些微小的更改,引发了一场漫长且无关的关于密码安全策略的讨论。

魔法自动减量

关于闲聊和无意义的递减魔法的讨论继续。

各种

大量的问题报告、错误修复、非问题报告、问题、回答以及一小部分垃圾邮件。我认为可能有一些争议,但它是在我跳过的线程中。

下周再见,您谦卑而顺从的仆人,


Mark-Jason Dominus

标签

反馈

这篇文章有什么问题吗?请在 GitHub 上打开一个 issue 或 pull request 来帮助我们。