【问题标题】:How does the interpretive program(ex:perl,shell) work解释程序(例如:perl,shell)如何工作
【发布时间】:2023-03-05 00:35:01
【问题描述】:

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

【问题讨论】:

  • idownvotedbecau.se/noresearch 做一些搜索和阅读,你会发现它很容易。这超出了 SO 的范围。
  • 查看口译员的wikipedia 页面。此外,this 论文还提供了几个解释器的比较。它可以帮助您解决您的问题。
  • 当你运行一个 Perl 程序时,编译器首先编译源代码然后执行它。在我看来,这似乎使 Perl 更像是一种编译语言而不是解释语言。

标签: shell perl


【解决方案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。)

操作实际上是排列在链表中的数据结构(带有其他用于跳转的指针),而不是字节编码指令流。上面的循环遍历列表,执行与每个操作关联的函数。这些函数返回下一个要执行的操作的地址,从而形成程序。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    相关资源
    最近更新 更多