perl6 – 如何反编译Perl 6?

前端之家收集整理的这篇文章主要介绍了perl6 – 如何反编译Perl 6?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我们应该能够以某种方式做到这一点.我想我已经在某个地方看到了它,但我找不到我想起的东西.大多数情况下,我想看看编译器如何解释代码.

与反编译一起,有没有办法观察它在编译时正在做什么?我认为看到它正在尝试做什么,哪里可能比试图理解它的一些错误消息更容易.并且,反编译程序可以撤消所有的简写和聪明,以阐明实际发生的事情.

解决方法

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

猜你在找的Perl相关文章