我们应该可以以某种方式完成这个操作。我记得在某处看到过,但我找不到我记得的东西了。主要想看编译器如何解释代码。
除了反编译,有没有办法在编译时观察它正在做什么?我认为看看它正在尝试做什么以及在哪里可能比尝试理解一些错误消息更容易。而且,反编译程序可以取消缩写和聪明才智,阐明实际发生的情况。
我们应该可以以某种方式完成这个操作。我记得在某处看到过,但我找不到我记得的东西了。主要想看编译器如何解释代码。
除了反编译,有没有办法在编译时观察它正在做什么?我认为看看它正在尝试做什么以及在哪里可能比尝试理解一些错误消息更容易。而且,反编译程序可以取消缩写和聪明才智,阐明实际发生的情况。
我不确定你为什么想要这样做。此外,编译结果依赖于后端,并且您没有指定后端。无论如何,使用--target=
参数,您可以获得中间结果。最有用的是:
$ perl6 --target=parse -e 'say "foo"'
- statementlist: say "foo"
- statement: 1 matches
- EXPR: say "foo"
- args: "foo"
- arglist: "foo"
- EXPR: "foo"
- value: "foo"
- quote: "foo"
- nibble: foo
- longname: say
- name: say
- identifier: say
- morename: isa NQPArray
- colonpair: isa NQPArray
--target=parse
显示解析结果。
$ perl6 --target=ast -e 'say "foo"'
- QAST::CompUnit :W<?> :UNIT<?>
[pre_deserialize]
- QAST::Stmt
- QAST::Stmt
- QAST::Op(loadbytecode)
- QAST::VM
[jvm]
- QAST::SVal(ModuleLoader.class)
[moar]
- QAST::SVal(ModuleLoader.moarvm)
- QAST::Op(callmethod load_module)
*snip*
--target=ast
显示抽象语法树。
$ perl6 --target=mast -e 'say "foo"'
MAST::Frame name<<unit-outer>>, cuuid<2>
Local types: 0<obj>, 1<obj>, 2<obj>, 3<obj>,
Outer: <none>
Instructions:
[0] MAST::Op getcode
MAST::Local index<3>
MAST::Frame name<<unit>>, cuuid<1>
[1] MAST::Op capturelex
MAST::Local index<3>
[2] MAST::Op getcode
MAST::Local index<1>
MAST::Frame name<<unit>>, cuuid<1>
[3] MAST::Op takeclosure
*snip*
而 --target=mast
展示了实际生成的字节码,这种情况下是针对 MoarVM 后端。
--target=ast
显示的是简化/静态优化之前还是之后的状态?是否有更易读的后优化状态形式?我理解这个问题是在问是否有像 Perl 5 的B::Deparse
这样的东西,它将优化后的“字节码”序列化回 Perl 代码,让您看到编译器如何“理解”您所写的内容,以及编译器是否认为两种语法是相同的。(我也很想在 Perl 6 中看到类似的东西)。 - smlsif $a == 1|2 { ... }
编译为if $a == 1 || $a == 2 { ... }
等。 - smls--target=ast
显示静态优化器之前的内容。使用--target=optimize
查看之后的内容。您还可以使用RAKUDO_OPTIMIZER_DEBUG=1
环境变量,它会打印出优化器正在执行的所有步骤以及之前、之后和中间的所有信息。 - user2410502