我将通过使用下面的例子来说明我的疑问。
考虑下面写的C ++代码:
#include<iostream.h>
void main()
{
cout<<"LULZ \n";
cout<<"\n Enter anything\n";
int a;
cin>>a;
goto noexistence;
}
现在,我的问题是,如果编译了这段代码,那么最终用户的输出将如何不同,然后在不同情况下解释?当我们编译它时,它会给出编译时错误并且会抱怨没有这样的标签存在(不存在)。
但解释这段代码会发生什么?我不知道C / C ++是否有解释器(我听说过CERN的CINT ROOT,但我不知道如何操作它)但理论上讲,解释如何解释这个标签不是这样的谬论定义
我问的是这个问题,因为我在解释中读了很多次,“代码是逐行执行的”。我永远无法理解“逐行”的概念。任何人都可以对此有所了解,因为这个问题现在正在吃我。
答案 0 :(得分:3)
解释器读取输入代码并在执行前快速解析它。
有时,解析只是将行读入链表。如果这是解析器实现的所有解析,那么它将开始扫描goto标签的所有输入行,并将打印错误,表示找不到标签。
更智能的解释器可以在执行已执行的行时创建跳转表。在这种情况下,可以在此表中搜索标签(用于向后引用),也可以在以下行中进行扫描(用于前向引用)。
另一个解释器可以选择解析所有输入中的所有标记,并在运行第一个语句之前创建一个跳转表。这样的解释器只会检查跳转表并打印出错误消息。
所以这完全取决于。但是,编译器会解析并在任何执行尝试之前将输入编译为可执行文件。
答案 1 :(得分:0)
您是否阅读了有关compilers,interpreters,bytecodes,C++
的内容C ++标准没有说明如何执行C ++程序。你可以在头脑中(或用铅笔和纸),你可以使用一堆人类奴隶(但这是不道德的),你可以使用魔法来执行C ++程序。大多数人使用编译器和计算机。
您可以拥有C ++的解释器
实际上和历史上,C ++已经从C发展而来,主要(不为人知)假设它可以用真实编译器以某种方式编译为真实硬件。
口译员和编制者不是黑人和白色区别;有中间方式(特别是转换为字节代码或abstract syntax tree,然后解释)。
我当然不会将“解释器”定义为逐行工作的东西。大多数口译员都不这样做。通常至少会读取并解析整个“函数”。