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

Qua*_*isp 8 c++ language-lawyer program-counter abstract-machine

在我读到的关于 C++ 的第一本书中,它详细介绍了代码是如何在机器上实际执行的(它提到了程序计数器、调用堆栈、返回地址等)。我发现了解这些东西是如何工作的真的很有趣,尽管我知道没有必要了解计算机的工作原理来编写好的代码。

在这个问答网站上阅读相同的主题时,我发现它绝不是我以前学习的方式,因为我阅读的只是 C++ 的某个实现,这取决于某些计算机架构和特定的编译器。C++ 代码也可以在完全不同的东西上运行,只要有一个符合“正确”方式的编译器。标准和“抽象机器”的行为定义了正确的方法(我希望到目前为止我做对了)。

当然,我仍然想知道像内存的代码段或程序计数器这样的概念是否仍然在标准中“以某种方式”描绘,如果是,它们在多大程度上被描绘出来?抽象机中如何描述一个接一个执行的代码片段的概念?

由于有人在评论中询问我是否希望向我重复该标准:我无法很好地理解该标准,无法准确确定它对抽象机器的看法/或标准的哪些陈述可以被解释为关于“程序计数器”“代码存储”等抽象概念的陈述。所以是的,出于无能为力,我要求社区解释标准中的内容。这种解释的预期结果是仍然符合“抽象”标准的抽象机器内部结构的最详细概念。

Chr*_*odd 7

简短的回答:不是。

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

该标准的相关引用是:

执行格式良好的程序的一致实现应产生与具有相同程序和相同输入的抽象机的相应实例的可能执行之一相同的可观察行为。

然而,对于“可观察的行为”究竟是什么,并没有真正可靠的定义。

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