2001年1月21日 p5p 本周快讯

注释

您可以通过发送空消息到 p5p-digest-subscribe@plover.com. 订阅此摘要的电子邮件版本。

请将更正和补充发送到 perl-thisweek-YYYYMM@simon-cozens.org,其中 YYYYMM 是当前年份和月份。

sigsetjmp 处理持续进行

上周,关于 Perl 是否应该使用 sigsetjmpeval 跳出或到 die 进行了一些讨论。问题的一部分是,sigsetjmp 比较慢,所以如果我们能够不使用它,我们最好这样做。Nick Ing-Simmons 已经从当前源代码中删除了 sigsetjmp,但现在 Nick Clark 发现这有时会导致由于奇怪的优化而变慢。

讨论随后转向使用任何类型的非局部跳转与线程的问题。Alan 指出,sigjmpsigsetjmp 都完全不安全,由于 Perl 使用它们,Perl 的线程实现非常糟糕。没有关于如何解决这个问题或摆脱非局部跳转以捕获异常的好建议。Alan 声明 Perl 5 已无望,但说:

如果 perl6 有类似 perl5 栈的东西,eval/die 将必须实现为在 die 时回滚栈,而不是当前的 longjmp 诡计。

Alan 还建议,我们需要在 Perl 6 中创建自己的线程模型,以完全控制异常处理;关于 Perl 6 的讨论继续在 perl6-internals 邮件列表上进行。

本周有趣的部分开始于此 here.

安全信号

Nick 提出了一个程序,让人们尝试确认他对信号处理的怀疑。他的计划是在信号处理程序中设置一个标志,在每个操作执行后进行检查,这似乎是最明显的方法,但他担心有信号处理程序的系统,其中 SIGCHLD 不调用 wait,这意味着信号处理程序返回时仍会有未完成的子进程,这意味着将发送 SIGCHLD,这意味着处理程序将被调用,重复此过程。

但是,所有测试的平台都工作得合理,所以看起来 Nick 将会继续尝试实现安全信号。

大文件支持处理持续进行

关于 Linux 的大文件支持的上周讨论本周继续。问题是我们需要找到正确的预处理器指令来最大限度地利用系统;大多数看起来有用的指令(例如,_GNU_SOURCE)也暴露了我们不一定想要的其他东西。它还会在嵌入 Perl 的程序中引发问题。Russ Allbery 经历了所有这些,与 INN 和 autoconf 都有过。

最终,autoconf 的人决定放弃 glibc 2.1,因为它是大文件损坏的,并建议人们升级到 glibc 2.2 或手动添加 -D_GNU_SOURCE,如果它适用于他们的应用程序。

多重前递增

我决定提交一个补丁来使事情变得更糟,因为我决定

    print (++$i, ++$i, ++$i)

像John Vromans那样工作;目前,Perl在该情况下保留了几乎可以做任何事的权力,但它“显而易见”要打印的内容应该是(假设之前$i未定义)"123"。有人对此提出了一些质疑——首先,定义目前未定义的行为将使我们失去在未来进行聪明优化的权利,并且这种修复也会使所有人的预增量(pre-increment)和预减量(pre-decrement)行为变慢,而不仅仅是那些在单个语句中执行多次预增量的人。

我也在想,看到Perl在上面的代码中输出“333”所产生的困惑是否会被尝试在严肃程序中这样做所需的困惑所抵消。

Test::Harness 大补丁

Michael Schwern又施展了他的惯用伎俩,突然出现并贡献了一个40K的补丁——这一次,他重写了Test::Harness以支持许多合理的功能,比如在消息后添加注释,如下所示

    ok 123 - Testing the frobnicator

这样,当测试失败时,你可以搜索这个字符串。他与Andreas就一些新功能进行了往返讨论——Andreas认为,例如,允许大写输出会产生额外的噪音和干扰。Jarkko也同意,补丁也因此被放弃。

没有被吓倒,Schwern继续统一了skiptodo接口。不幸的是,这不能在不破坏现有代码的情况下完成,特别是CPAN模块,所以这个补丁也失败了。哦,真是尴尬。

标记符报告和美观打印

我再次做了些邪恶的事情。在听Knuth关于Literate Programming的演讲后,我回到了对Perl缺少美观打印器的哀叹,以及FAQ中的沮丧之词

没有程序可以像indent(1)为C所做的那样重新格式化Perl。扫描器和解析器之间的复杂反馈(这种反馈是混淆vgrind和emacs程序的原因)使得最好也难以编写独立的Perl解析器。

所以我不能构建一个独立的解析器,我就使用我们已有的——perl。通过在Perl每次决定一个标记是什么时调用一个报告函数,你可以生成一个程序中所有标记及其类型的列表。实现一个健壮的美化器留作读者练习;请在明信片上回答。

(附言:后来我得知Tim Maher的Perl美化器的存在,这同样是一个酷炫的技巧。)

Unicode

我怎么能一个星期不提到Unicode呢?Hiroto的qu运算符已经加入,显然有人在使用它,因为Nick Clark发现它正在一个UTF8散列中暴露出一个bug——$foo{something}$foo{qu/something/}被视为两个不同的键。Hiroto说他已经知道这一点,并打算发送一个补丁,但还没有做到。

EBCDIC上的UTF8支持开始工作,但它是以一种有点奇怪的方式完成的——我们实际上是用UTF8来编码EBCDIC本身,而不是Unicode。这意味着,虽然EBCDIC和非EBCDIC平台现在都“支持”UTF8,并且所有代码(总体上)都工作,但如果EBCDIC用户开始使用字符类或其他Unicode功能,可能会发生一些奇怪的事情。

各种

IV保护仍然存在bug。

让我告诉你,有几个人报告了bug报告系统的问题;Perl太棒了,甚至连它的bug都有bug。

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


Simon Couzens

标签

反馈

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