我该如何反编译Perl 6?

8

我们应该可以以某种方式完成这个操作。我记得在某处看到过,但我找不到我记得的东西了。主要想看编译器如何解释代码。

除了反编译,有没有办法在编译时观察它正在做什么?我认为看看它正在尝试做什么以及在哪里可能比尝试理解一些错误消息更容易。而且,反编译程序可以取消缩写和聪明才智,阐明实际发生的情况。

1个回答

10

我不确定你为什么想要这样做。此外,编译结果依赖于后端,并且您没有指定后端。无论如何,使用--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 后端。


1
--target=ast 显示的是简化/静态优化之前还是之后的状态?是否有更易读的后优化状态形式?我理解这个问题是在问是否有像 Perl 5 的 B::Deparse 这样的东西,它将优化后的“字节码”序列化回 Perl 代码,让您看到编译器如何“理解”您所写的内容,以及编译器是否认为两种语法是相同的。(我也很想在 Perl 6 中看到类似的东西)。 - smls
例如,这将使得在没有空格的压缩表达式中检查运算符优先级如何解析变得容易;以及是否将 if $a == 1|2 { ... } 编译为 if $a == 1 || $a == 2 { ... } 等。 - smls
1
@smls,--target=ast 显示静态优化器之前的内容。使用 --target=optimize 查看之后的内容。您还可以使用 RAKUDO_OPTIMIZER_DEBUG=1 环境变量,它会打印出优化器正在执行的所有步骤以及之前、之后和中间的所有信息。 - user2410502

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接