答案 0 :(得分:1)
这是一个示例解释器:
while (<>) {
my ($cmd, @args) = split;
if ($cmd eq '...') { ... }
elsif ($cmd eq '...') { ... }
elsif ($cmd eq '...') { ... }
else { ... }
}
这表明,解释程序不是在与解释程序不同的进程中运行。
这也指出不一定要翻译成机器语言。
请注意,Perl是一种编译语言,而不是解释性语言。
$ perl -MO=Concise,-exec -e'print("Hello, world!\n");'
1 <0> enter
2 <;> nextstate(main 1 -e:1) v:{
3 <0> pushmark s
4 <$> const[PV "Hello, world!\n"] s
5 <@> print vK
6 <@> leave[1 ref] vKP/REFC
-e syntax OK
也就是说,编译后的表格不是本机指令。有不同的处理方法,但是Perl有效地解释了这些方法。以下是该解释器:
int
Perl_runops_standard(pTHX)
{
OP *op = PL_op;
PERL_DTRACE_PROBE_OP(op);
while ((PL_op = op = op->op_ppaddr(aTHX))) {
PERL_DTRACE_PROBE_OP(op);
}
PERL_ASYNC_CHECK();
TAINT_NOT;
return 0;
}
(从here复制。)
运算符实际上是排列在链接列表中的数据结构(带有用于跳转的其他指针),而不是字节流编码指令。上面的循环遍历列表,执行与每个操作关联的功能。这些函数返回要执行的下一个op的地址,从而形成程序。
某些语言可能采用类似的方法。其他语言肯定采用不同的方法。