0

我将通过使用我想出的以下示例来说明我心中的疑问。

考虑下面编写的 C++ 代码:

#include<iostream.h>

void main()
{
 cout<<"LULZ \n";
 cout<<"\n Enter anything\n";
 int a;
 cin>>a;

 goto noexistence; 

}

现在,我的问题是,如果这段代码被编译然后在不同的情况下被解释,最终用户的输出会有什么不同?当我们编译它时,它会给出一个编译时错误并且会抱怨不存在这样的标签(noexistence)。

但是当这段代码被解释时会发生什么呢?我不知道是否有 C/C++ 的解释器(我从 CERN 听说过 CINT ROOT,但我不知道如何操作它)但从理论上讲,解释如何在标签不存在的情况下捕捉到这种谬误定义?

我问这个问题是因为我在解释中读过很多次,“代码是逐行执行的”。我永远无法理解“逐行”的概念。任何人都可以对此有所了解,因为这个问题现在正在吞噬我,呵呵。

4

2 回答 2

3

解释器读取输入代码并在执行前快速解析它。

有时,解析只是将行读入链表。如果这全部是解析解释器实现的,那么它将开始扫描所有输入行以查找 goto 标签,并打印一个错误,指出未找到标签。

更智能的解释器可以在继续执行已执行的行时创建跳转表。在这种情况下,可以在此表中搜索标签(用于向后引用),也可以在以下行中扫描(用于向前引用)。

另一个解释器可以选择解析所有输入中的所有标记,并在运行第一条语句之前创建一个跳转表。这样的解释器只会检查跳转表并打印出错误消息。

所以这一切都取决于。但是,编译器会在任何执行尝试之前解析输入并将其编译为可执行文件。

于 2012-07-29T09:27:18.160 回答
0

你读过关于编译器解释器字节码C++的东西吗?

C++ 标准没有说明如何执行 C++ 程序。你可以在头脑中(或用铅笔和纸)来做,你可以使用一群人类奴隶(但这是不道德的),你可以使用魔法来执行 C++ 程序。大多数人使用编译器和计算机。

你可以有一个 C++ 解释器

在实践和历史上,C++ 是从 C 演变而来的,主要(不为人知的)假设是它可以以某种方式用真实的编译器编译用于真实的硬件。

解释器和编译器不是黑白分明的;有中间方法(特别是转换为字节码或抽象语法树,然后对其进行解释)。

我当然不会将“解释器”定义为逐行工作的东西。大多数口译员不是这样工作的。他们通常至少读取和解析整个“函数”。

于 2012-07-29T09:23:21.250 回答