Acme-Perl-VM
view release on metacpan or search on metacpan
lib/Acme/Perl/VM/JA.pod view on Meta::CPAN
};
=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
print (1) # mark+1ããTOPã¾ã§ãå°åãï¼çµæ(ç)ãPUSH
ãããæ§ææ¨ãè§£éããåºæ¬çãªæµãã§ããããã°ã©ã ã®åå²ããµãã«ã¼ãã³ã®å¼ã³åºããªã©ãããã¨æ´ã«è¤éã«ãªãã¾ããï¼ä¸é£ã®æµãã¯åãã§ãã
以ä¸ã®ã»ã¯ã·ã§ã³ã§ã¯ï¼ä»®æ³ãã·ã³ã®å®è£
ã®ä¸ã§ç¹ã«éè¦ãªã³ã³ãã¼ãã³ãã«ã¤ãã¦èª¬æãã¾ãã
=head2 The Perl Stack (PL_stack_base)
Perlããã°ã©ã ã®æç¶ãã¨æ»ãå¤ã®ããã«ä½¿ãããã¹ã¿ãã¯ã§ãã
ãã®ã¹ã¿ãã¯ã¯çµã¿è¾¼ã¿é¢æ°ã¨ãµãã«ã¼ãã³ã®ä¸¡æ¹ã§ä½¿ããã¾ãã
ç¾å¨ã®perl5ã®å®è£
ã§ã¯ï¼ãã®ã¹ã¿ãã¯ã¯Cã®é
åã§è¡¨ç¾ããï¼å¿
è¦ã«å¿ãã¦C<realloc()>ã§æ¡å¼µããã¾ããã¹ã¿ãã¯ã®å
é ã¯ã¹ã¿ãã¯ãã¤ã³ã¿(C<PL_stack_sp>)ã¨ãã¦åç
§ã§ããã®ã§ããï¼ppcodeå
ã§...
APVMã§ã¯ããã¯Perlã®é
åã§è¡¨ç¾ããï¼ã¹ã¿ãã¯ãã¤ã³ã¿ã¯é
åã®æå¾ã®æ·»ãåã§ãã
ãã¼ã«ã«ã³ãã¼ã¯ä½ãã¾ããã
AVPMã¨ã®å¯¾å¿ï¼
perl APVM
PL_stack_base @PL_stack
PL_stack_sp $#PL_stack
dSP (nothing)
SP $#PL_stack
TOPs TOP
PUSHs(sv) PUSH($sv)
POPs POP
SPAGAIN (nothing)
PUTBACK (nothing)
EXTEND(SP, n) (nothing)
See also F<pp.h>.
=head2 The Perl Stack Marker (PL_markstack)
å¯å¤é·å¼æ°ãæ±ãããã®ã¹ã¿ãã¯ã®ãã¼ã«ã¼ã§ãã
äºé
æ¼ç®åãªã©ã¯å¼æ°ã®æ°ãåºå®ã§ããï¼C<print>ã®ããã«å¼æ°ã®æ°ãå¯å¤é·ã§ããçµã¿è¾¼ã¿é¢æ°ãããã¾ããå¯å¤é·å¼æ°ãæ±ãããã«ã¯ï¼å¼æ°ã¹ã¿ãã¯ä¸ã§å¼æ°ãå§ã¾ãä½ç½®ãä¿åããå¿...
å¯å¤é·å¼æ°ã®éå§ã宣è¨ããããã«ã¯ï¼C<PUSHMARK(SP)>ãã¯ãã使ãã¾ãã
ã¾ãï¼C<dMARK>ãã¯ãã«ããã¹ã¿ãã¯ããå¤ãããããï¼C<MARK>ãã¯ãã使ããããã«ãã¾ãã
APVMã¨ã®å¯¾å¿ï¼
perl APVM
PUSHMARK(SP) PUSHMARK($#PL_stack)
TOPMARK TOPMARK
POPMARK POPMARK
dMARK my $mark = POPMARK
MARK++ $mark++
*MARK $PL_stack[$mark]
dORIGMARK my $origmark = $mark
SP = ORIGMARK $#PL_stack = $origmark
See also F<pp.h>.
=head2 The Opcode Family
Perlããã°ã©ã ã®æå°åä½ã§ããï¼æç¶ãã¨ãã¼ã¿ãæã£ããªãã¸ã§ã¯ãã§ãã
opcodeã¯ã©ã¹ç¾¤ã¯Cã®æ§é ä½ã®å
é ã¡ã³ããããã¤ãå
±æããæ§é ä½ç¾¤ã¨ãã¦è¡¨ç¾ããã¾ãã
opcodeãªãã¸ã§ã¯ãã®æã¤æç¶ãã¯å¯¾å¿ããppcodeã§ããï¼C<op_ppaddr>ã¡ã³ãã§åç
§ãã¾ãããã¼ã¿ã¯Perlã®å¤ãCã®å¤ï¼ã¾ãã¯ä»ã®opcodeã¸ã®ãªã³ã¯ã§ãã
åopcodeãªãã¸ã§ã¯ãã¯ååã¨å¤é¨åºåç¨ã®èª¬æãæã¡ï¼ããããC<OP_NAME(op)>ï¼C<OP_DESC(op)>ãã¯ãã§å¾ããã¨ãã§ãã¾ãã
See also F<op.h>, F<cop.h>, F<opcode.h> and F<opcode.pl>.
=head2 The PPcodes
opcodeãæã¤æç¶ãã§ï¼å®éã«è¡ãå¦çãå®è£
ãã颿°ã§ãã
ãã¨ãã°ï¼OP_CONSTã«å¯¾å¿ããppcodeã¯ä»¥ä¸ã®ããã«ãªã£ã¦ãã¾ãï¼
/* in pp_hot.c (5.8.8) */
PP(pp_const)
{
dSP;
XPUSHs(cSVOP_sv);
RETURN;
}
ãã¯ããããã¤ãå±éããã¨ä»¥ä¸ã®ããã«ãªãã¾ãã
PP(pp_const)
{
dSP;
EXTEND(SP, 1);
PUSHs(cSVOPx_sv(PL_op));
PUTBACK;
return PL_op->next;
}
ä¸ã¤ã²ã¨ã¤ãé ã«è¿½ãã¨ä»¥ä¸ã®ããã«ãªãã¾ãã
=over 4
=item C<dSP>
ãã¼ã«ã«ã¹ã¿ãã¯ãã¤ã³ã¿å¤æ°(SP)ã宣è¨ãï¼ã°ãã¼ãã«ã¹ã¿ãã¯ãã¤ã³ã¿ã®å¤ã§åæåãã¾ãã
=item C<EXTEND(SP, 1)>
ã¹ã¿ãã¯ãã¤ã³ã¿ã«å¤ã1ã¤ããã·ã¥ãããã¨ã宣è¨ãã¾ãããã®ã¨ãï¼å¿
è¦ã«å¿ãã¦ã¹ã¿ãã¯ã¯æ¡å¼µããã¾ãã
=item C<cSVOPx_sv(PL_op)>
ç¾å¨å®è¡ä¸ã®opcodeã®svãã£ã¼ã«ããåç
§ãã¾ãã
=item C<PUSH(sv)>
ã¹ã¿ãã¯ãã¤ã³ã¿ãéãã¦å¼æ°ã¹ã¿ãã¯ã«å¤ã1ã¤ããã·ã¥ãã¾ãã
=item C<PUTBACK>
ãã¼ã«ã«ã¹ã¿ãã¯ãã¤ã³ã¿ãã°ãã¼ãã«ã¹ã¿ãã¯ãã¤ã³ã¿å¤æ°ã«æ»ãã¾ãã
=item C<< return PL_op->op_next >>
次ã«å®è¡ããopcodeãè¿ãã¾ãã
OP_CONSTã§ããã°å¯è½æ§ã®ããããã°ã©ã ã®çµè·¯ã¯å¸¸ã«ä¸ã¤ã§ããï¼OP_COND_EXPRã®ãããªå¶å¾¡ãæ
ãopcodeã§ããã°C<< PL_op->next >>以å¤ã®opcodeãè¿ããã¨ãããã¾ãã
=back
ppcodeã¯opcodeãªãã¸ã§ã¯ãã®C<op_ppaddr>ã¡ã³ããéãã¦åå¾ã»å¤æ´ãããã¨ãã§ãã¾ãããã®C<op_ppaddr>ãC<PL_check>ã¨ããã³ã³ãã¤ã«æããã¯ãã¼ãã«ãéãã¦å¤æ´ãï¼ããã°ã©ã ã®æåãå¤ã...
See also F<pp.c>, F<pp_hot.c>, F<pp_ctl.c>, F<pp_sys.c>, F<pp_sort.c> and F<pp_pack.c>.
=head2 The interpreter loop (PL_runops)
æ§ææ¨ãè§£éã»å®è¡ããã«ã¼ãã®å®è£
ã§ãã
ããã©ã«ãã§ã¯ï¼F<run.c>ã«ããC<Perl_runops_standard()>ãç¨ãããã¾ãã
ããã¯ï¼perl 5.8.8ã§ã¯ä»¥ä¸ã®ããã«ãªã£ã¦ãã¾ãï¼
int
Perl_runops_standard(pTHX)
{
while ((PL_op = CALL_FPTR(PL_op->op_ppaddr)(aTHX))) {
PERL_ASYNC_CHECK();
}
TAINT_NOT;
return 0;
}
C<PL_op>ã¯ç¾å¨å®è¡ä¸ã®opcodeãªãã¸ã§ã¯ããå
¥ã£ã¦ããã°ãã¼ãã«å¤æ°(ã¾ãã¯TLS夿°)ã§ããC<op_ppaddr>ã¯opcodeã«å¯¾å¿ããppcodeãå
¥ã£ã¦ããï¼ppcodeã¯æ¬¡ã«å®è¡ããopcodeãè¿ããã¨ã«ãªã£ã¦ãã¾...
C<PERL_ASYNC_CHECK()>ã¯åã«ã»ã¼ãã·ã°ãã«ã®å¦çãªã®ã§å®è¡ã«ã¯é¢ä¿ããã¾ããããããã£ã¦ï¼ã¤ã³ã¿ããªã¿ã«ã¼ãã®å®ä½ã¯ä¸è¡ããããã¾ããã
ã¨ããã§ï¼ãã®ãããªopcodeã®å¤æ
æ§ãå©ç¨ããå®è¡ã«ã¼ãã¨å¯¾æ¥µã«ããã®ãï¼switchæãifã®é£éã«ããåå²ãå©ç¨ããå®è¡ã«ã¼ãã§ããPerl4ã®å®è¡ã«ã¼ãã¯ãã®ãããªå®è£
ã§ãããï¼Perl5ã...
ã¤ã³ã¿ããªã¿ã«ã¼ãã«ã¤ãã¦ã¯ï¼APVMã®C<runops_standard()>ã§ãå®è£
ã¯ã»ã¼åãã§ãã
See also F<run.c>.
=head2 Other components
ãã®ä»ã«ãããã¤ãéè¦ãªã³ã³ãã¼ãã³ããããã¾ãã
=over 4
=item *
The Scratchpads (PL_comppad and PL_curpad)
=item *
The Save Stack (PL_savestack)
=item *
The Temporary Value Stack (PL_tmps)
( run in 3.455 seconds using v1.01-cache-2.11-cpan-97f6503c9c8 )