c++ - 另一个混淆与 "Interpretation"的概念有关。请参见

标签 c++ compilation interpreter

<分区>

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

考虑下面编写的 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,但我不知道如何操作它)但从理论上讲,解释如何在标签不存在的情况下发现这种谬误定义?

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

最佳答案

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

有时,解析只是将行读入链表。如果这都是解析器实现的,那么它会开始扫描所有输入行以查找 goto 标签,并打印一条错误消息说找不到标签。

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

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

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

关于c++ - 另一个混淆与 "Interpretation"的概念有关。请参见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11708072/

相关文章:

python - 如何从 Python 脚本中获取当前的 Python 解释器路径?

Java XML RPC 客户端和服务器

c++ - 编译时常量与运行时常量

c++ - QReadWriteLock 递归模式不起作用

c - 使用 QtCreator [mac os] 找不到 -lrt 的库

compilation - 在Julia中要求类型声明

java - 用 Java 实现的小型/玩具语言编译器/解释器

c++ - 为什么这个字符串被神秘地修改了?

java - 为什么Gradle编译.java文件而不创建我的.jar?

c - 将 Ruby 解释器链接到 C 程序中