Acme-Perl-VM

 view release on metacpan or  search on metacpan

lib/Acme/Perl/VM/JA.pod  view on Meta::CPAN


=encoding utf-8

=head1 NAME

Acme::Perl::VM::JA - Pure PerlによるPerl5仮想マシンの実装(AVPM)

=head1 SYNOPSIS

    use Acme::Perl::VM;

    run_block{
        print "Hello, APVM world!\n";
    };


=head1 DESCRIPTION

C<Amce::Perl::VM>(APVM)はPure Perlで実装されたPerl5の仮想マシンです。

Perlディストリビューションにはコンパイルされた構文木にアクセスするためのモジュールが用意されており,B<B - The Perl Compiler>と呼ばれています。
APVMはこのBモジュールを利用して構文木を解釈・実行するモジュールです。

この文書では,Perl5の仮想マシンについて概説しつつ,APVMとPerl5実装との対応について解説します。

=head2 The Perl5 Virtual Machine

Perl5の仮想マシンはスタックマシンであり,組み込み演算子やサブルーチンなどの手続きの引数と戻り値を,スタックを通じてやり取りします。

この仮想マシンのマシンコードはopcodeと呼ばれ,これがコンパイルされたPerlプログラムの最小単位となります。opcodeはさらにデータと手続きからなるオブジェクトとして表現され,その...

opcodeオブジェクトは他のopcodeオブジェクトへのリンクを持つ木構造を成しており,このopcodeの木を構文木と呼びます。したがって,Perlプログラムを実行するというのは,opcodeを実行しつ...

ここでは以下のPerlコードを例にとり,プログラムの実行を追っていきます:

    print(10 + 20);

まず,このコードをコンパイルすると,以下のような構文木が生成されます:

    nextstate     # ステートメントの始まり
    print         # 引数リストを印字
      pushmark    # 可変長引数のためのマーク
      add         # 加算演算
        const(10) # 定数[10]
        const(20) # 定数[20]

構文木は子ノードから実行されるので,この構文木を解釈すると以下の順になります。

    nextstate
    pushmark
    const(10)
    const(20)
    add
    print

それぞれのopcodeは必要に応じてスタックから引数をポップし,戻り値をプッシュします。opcodeの実行とスタックの中身を同時に表すと以下のようになります。

    nextstate ()
    pushmark  ()       # mark = -1 (MARKについては後のセクションで解説)
    const(10) (10)     # スタックに値をPUSH
    const(20) (10, 20) # スタックに値をPUSH
    add       (30)     # 値を2つPOPし,演算結果をPUSH



( run in 2.379 seconds using v1.01-cache-2.11-cpan-5a3173703d6 )