考虑以下两个程序:
unit module Comp;
say 'Hello, world!'
和
unit module Comp;
CHECK { if $*DISTRO.is-win { say 'compiling on Windows' }}
say 'Hello, world!'
天真地,我本来希望两个程序都编译成完全相同的字节码:该CHECK
块指定要在编译结束时运行的代码;检查变量然后什么都不做对程序的运行时行为没有影响,因此(我原以为)不需要包含在编译的字节码中。
但是,编译这两个程序不会产生相同的字节码。具体来说,编译没有CHECK
块的版本会创建 24K 的字节码,而使用它的版本会创建 60K。为什么这两个版本的字节码不同?字节码的这种差异是否有(或可能有)运行时成本?(似乎必须,但我想确定)。
还有一个相关的问题:DOC CHECK
块如何适应上述情况?我的理解是,即使编译器在不使用标志运行时也会跳过DOC CHECK
块。与此一致,当给定一个像上面这样的块时--doc
,hello-world 程序的字节码不会增加大小。DOC CHECK
但是,如果块包含语句,它的大小确实会增加。use
由此,我得出结论,这use
是某种特殊情况,甚至可以在DOC CHECK
块中执行。那是对的吗?如果是这样,我应该知道其他类似的特殊形式吗?