编译器和解释器之间的混淆?

kev*_*mes 3 c compiler-construction error-handling interpreter mingw

我在某处阅读了有关编译器和解释器的以下文档: -

编译器搜索程序的所有错误并列出它们.如果程序没有错误,则将程序代码转换为机器代码,然后程序可以通过单独的命令执行.

解释器按语句检查程序语句的错误.检查一个语句后,它将该语句转换为机器代码,然后执行该语句.该过程一直持续到最后一个程序语句发生.

我怀疑来自以下代码:

int main()
{
    printf("hello")
    scanf("%d",&j);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我正在使用MINGW GCC编译器.当我编译上面的代码后发生以下事情:

首先我得到了错误

error: expected ';' before 'scanf()'
Run Code Online (Sandbox Code Playgroud)

在我纠正上述错误后,我得到第二个错误

error: 'j' undeclared (first use in this function)
Run Code Online (Sandbox Code Playgroud)

所以我想知道为什么两个错误都没有一次列出?

Som*_*ude 5

编译器和解释器在技术上是两个不同的东西,虽然边界有时可能非常流畅.

编译器基本上只是一个语言翻译器.它将源语言作为输入并生成目标语言作为输出.

解释器采用一种语言(无论是高级还是低级)并执行语言描述的代码.

困惑主要是因为大多数现代脚本语言都包含编译器和解释器,其中编译器采用脚本语言并创建较低级别的等效项(类似于二进制机器语言),然后解释器将读取和执行.


至于编译器错误的问题,很可能是因为编译器scanf由于第一个错误而无法继续解析调用,而只是跳过它(包括未声明的变量).

您还应该知道,在C中,某些错误实际上会导致代码中出现更多错误,例如,这些错误是正确的

int j
printf("Enter something: ");
scanf("%d", &j);
Run Code Online (Sandbox Code Playgroud)

由于在声明变量后缺少分号j,您将收到错误,但scanf由于编译器无法找到变量j,您也会收到该行的错误,即使该scanf调用是正确的.

另一个在不相关代码中产生后续错误的典型错误示例是忘记头文件中结构的终止分号.如果它是最后一个结构,你甚至可能在头文件中没有任何错误,只是源文件中包含头文件的无关错误.

  • @kevingomes No. GCC是一个编译器,而不是一个解释器(从技术上来说,它应该包含一个C的小子集的解释器,称为"常量表达式",但这就像它的1%的功能).这与报告错误的方式无关.你的推理基于废话定义. (2认同)