c++ - 代码如何在 C++ 抽象机上存储和执行?

标签 c++ language-lawyer program-counter abstract-machine

在我读到的关于 C++ 的第一本书中,它详细介绍了代码是如何在机器上实际执行的(它提到了程序计数器、调用堆栈、返回地址等)。我发现了解这些东西是如何工作的真的很有趣,尽管我知道没有必要了解计算机的工作原理来编写好的代码。
在这个问答网站上阅读相同的主题时,我发现它绝不是我以前学习的方式,因为我读到的只是 C++ 的某个实现,这取决于某些计算机架构和特定的编译器。 C++ 代码也可以在完全不同的东西上运行,只要有一个符合“正确”方式的编译器。标准和“抽象机器”的行为定义了正确的方法(我希望到目前为止我做对了)。
当然,我仍然想知道像内存的代码段或程序计数器这样的概念是否仍然在标准中“以某种方式”描绘,如果是,它们在多大程度上被描绘出来?
抽象机中如何描述一个接一个执行的代码片段的概念?
由于在评论中询问我是否希望向我重复该标准:
我无法很好地理解标准,无法准确确定它对抽象机器的看法/或者标准的哪些陈述可以解释为关于“程序计数器”“代码存储”的抽象概念的陈述......等等。所以是的,出于无能为力,我要求社区解释标准中的内容。这种解释的预期结果是仍然符合“抽象”标准的抽象机器内部结构的最详细概念。

最佳答案

简短的回答:不是。
我们实际上并不在 C++ 规范的抽象机器(或任何抽象机器——其他语言也定义它们)上执行代码。我们在用晶体管实现的真实机器上执行代码,或者在晶体管上运行的软件中执行代码。语言规范中的抽​​象机器用于定义真实机器上的代码将做什么的边界——它必须“好像”运行在抽象机器上,至少就其在环境中的外观而言涉及抽象机器定义。
该标准的相关引用是:

A conforming implementation executing a well-formed program shall produce the same observable behavior as one of the possible executions of the corresponding instance of the abstract machine with the same program and the same input.


然而,对于“可观察行为”究竟是什么,并没有真正可靠的定义。
那么为什么还要定义这些抽象机器呢?嗯,主要是因为有许多不同的真实机器,并且您想说您的代码将在其中任何一个上以相同的方式运行。真正的机器也非常复杂且难以推理。所以语言规范定义了一个抽象机器,它是它期望运行的真实机器种类的简化。特别是关于代码如何存储和执行的细节,这些细节大多在抽象机器中“抽象出来”——它没有指定,因此实现可以使用真实目标提供的任何机制,并且仍然符合规范

关于c++ - 代码如何在 C++ 抽象机上存储和执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64092889/

相关文章:

C++/SDL,一切都是白色的

c++ - 堆栈变量或函数声明

c++ - 使用空指针参数和不可能的后置条件构造标准异常

assembly - 是否可以修改或访问程序计数器?

c++ - 如何在 C++ 中等待像 mqwi_unlimited 这样的消息

c++ - 如何在 C++ 中一起使用 setw 和 setfill 来填充空格和字符?

c++ - 这是 != 运算符的重写候选者

c++ - 使用非 bool 返回值重载相等比较时,C++20 中的重大变化或 clang-trunk/gcc-trunk 中的回归?

mips - 如何在MIPS拱上获取当前的PC寄存器值?

delphi - Delphi调试中移动程序计数器