【问题标题】:Sequence of Raku program compilation and execution (maybe nested compile phases?)Raku 程序编译和执行的顺序(可能是嵌套编译阶段?)
【发布时间】:2023-03-13 21:07:01
【问题描述】:

以下程序正确编译失败:

sub f(Int $a) { my Str $b = $a }
say f 42;
say f 'foo';

具体来说,第 3 行会导致编译错误(带有 ===SORRY!=== 错误消息);此错误发生在执行第 2 行之前,因此永远不会达到 &f 中的类型不匹配。

但是,具体来说,这个错误是在什么时候发生的呢?我以为它发生在 CHECK phase 期间,但惊讶地发现 raku -c 不会产生编译错误;它报告Syntax OK

为了更深入地研究这一点,我在上面的 sn-p 中添加了日志记录代码:

BEGIN note 'begin';
CHECK note 'check';
INIT  note 'init';
END   note 'end';

sub f(Int $a) { my Str $b = $a }
say f 42;
say f 'foo';

使用raku -c 运行修改后的代码会打印“begin\n check\n Syntax OK”;使用 raku 运行它会打印 "begin\n check\n ===SORRY!===" (以及错误消息的其余部分)。

如果我删除了 say f 'foo' 行(以及因此的编译错误),raku -c 仍会打印“begin\n check\n Syntax OK”但raku 会打印“begin\n check\n init\n Type检查失败... \n end"(再次省略错误消息的正文)。

这里发生了什么?生成 ===SORRY!=== 的编译错误是否发生在 CHECK 和 INIT 之间的某个时间(是否有这样的时间?)?还是raku -c 实际上没有像raku --help 所指示的那样“运行 BEGIN 和 CHECK 块”?还是别的什么?

相关:如果有的话,这与“嵌套编译时间”的概念有什么联系?此代码的执行是否涉及任何嵌套的编译时间,还是仅在使用模块时发生?有什么方法可以记录/记录单独的编译阶段(可能是正确放置的 BEGIN 块?)还是没有公开?

【问题讨论】:

    标签: compilation raku compile-time rakudo


    【解决方案1】:

    SORRY 消息是静态优化器的副作用。观察以下之间的行为差​​异:

    $ raku -e 'sub foo(Int $a) { }; foo "foo"'
    ===SORRY!=== Error while compiling -e
    Calling foo(Str) will never work with declared signature (Int $a)
    

    和:

    $ raku --optimize=off -e 'sub foo(Int $a) { }; foo "foo"'
    Type check failed in binding to parameter '$a'; expected Int but got Str ("foo")
      in sub foo at -e line 1
    

    这发生在CHECKINIT 时间之间,除非它已被禁用。请注意,禁用静态优化器会导致运行时错误。

    【讨论】:

    • 有趣,谢谢!万一其他人好奇,that SORRY 消息确实如此,但并非所有 SORRY 消息。如果我们引入语法错误(例如raku --optimize=off -e 'sb foo(Int $a) { }; foo "foo"),我们仍然可以在没有优化器的情况下得到 SORRY 错误。
    • 确实如此。 SORRY 表示这是编译期间发生的错误。好吧,更准确地说,也许是:在 INIT 移相器运行之前。
    • 目前正在开发的新编译器前端将重新排序并且通常会围绕各种错误处理进行转换,这也是意料之中的,因为构建 Raku 编译器的合理方法不止一种。我宁愿怀疑当前不在-c 中的问题中的类型错误最终可能会作为结构变化的副作用而出现。
    猜你喜欢
    • 2011-05-30
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 2010-10-06
    • 2014-01-09
    • 1970-01-01
    • 1970-01-01
    • 2015-06-30
    相关资源
    最近更新 更多