perl 5解释器是基于虚拟机的吗?

perl 5解释器是基于虚拟机的吗?

看过lua的部分源代码,lua解释器的工作原理大体如下:
(1) 解释器由编译器和虚拟机两个模块构成
(2) 编译器将LUA程序翻译成虚拟机指令
(3) 虚拟机解释这些虚拟机指令的含义
LUA解释器提供了一个选项可以观察LUA程序的中间表示,对于如下程序:

[Copy to clipboard] [ - ]
CODE:
function add(a, b, c)
     return a + b + c
end

可以使用luac -l列出它的虚拟机指令:

[Copy to clipboard] [ - ]
CODE:
ADD t a b
ADD t t c
RETURN t

perl 5解释器是基于虚拟机的吗?如果是的话,我如何观察perl程序的中间表示?谢谢。


QUOTE:
原帖由 pugs 于 2008-12-27 19:53 发表
perl 5解释器是基于虚拟机的吗?

是的。

QUOTE:
如果是的话,我如何观察perl程序的中间表示?

可以用 Perl 自带的一些模块,例如 B::*, 如

[Copy to clipboard] [ - ]
CODE:
$ perl -MO=Terse t.pl
LISTOP (0x8225f28) leave [1]
    OP (0x8193070) enter
    COP (0x8225ef0) nextstate
    LISTOP (0x819ee90) print
        OP (0x82851e8) pushmark
        UNOP (0x819ee70) entersub [2]
            UNOP (0x819ee50) null [142]
                OP (0x819a280) pushmark
                SVOP (0x819ee30) const [4] IV (0x81976a0) 10
                UNOP (0x819a298) null [17]
                    PADOP (0x819a1f0) gv  GV (0x8227da8) *factorial
        SVOP (0x82851c8) const [5] PV (0x8227d88) "\n"
t.pl syntax OK

或按照执行顺序

[Copy to clipboard] [ - ]
CODE:
perl -MO=Terse,exec t.pl
OP (0x8193078) enter
COP (0x819a548) nextstate
OP (0x819d780) pushmark
OP (0x820cf08) pushmark
SVOP (0x819a2b8) const [4] IV (0x81976a8) 10
PADOP (0x820cf20) gv  GV (0x8227da0) *factorial
UNOP (0x819a028) entersub [2]
SVOP (0x819d798) const [5] PV (0x8227d80) "\n"
LISTOP (0x819d7b8) print
LISTOP (0x819a580) leave [1]
t.pl syntax OK



[Copy to clipboard] [ - ]
CODE:
$ cat t.pl
use strict;
use warnings;

print factorial(10), "\n";

sub factorial {
        my $n = shift;

        return 1 if $n <= 1;
       
        return $n * factorial(--$n);
}

参见 http://www.faqs.org/docs/perl5int/




正是我需要的,谢谢!
see also Concise


QUOTE:
原帖由 lokchungk 于 2008-12-27 23:07 发表
see also Concise

是 B::Concise,这个其实 B:: 下的一组模块中的一个。