解释程序(例如:perl,shell)如何工作

时间:2019-06-23 08:05:16

标签: shell perl

我提出一个假设:1.操作系统创建一个进程空间来启动解释器; 2.解释器创建一个新的进程空间来启动需要解释的程序,将第一条语句翻译成机器语言; 3.第一条语句的执行结束并中断; 4.解释器翻译下一条语句,并动态修改和创建新指令。好吧,我不能弥补。我不明白解释和执行的概念。

1 个答案:

答案 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的地址,从而形成程序。

某些语言可能采用类似的方法。其他语言肯定采用不同的方法。