9

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

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

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

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

4

2 回答 2

8

简短的回答:不是。

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

该标准的相关报价是:

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

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

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

于 2020-09-28T00:35:01.973 回答
2

该标准没有指定抽象机器如何在内部工作,这就是重点。这个概念用于抽象出物理机器的内部工作。

内存的代码段或程序计数器仍然“以某种方式”在标准中描绘

不。标准只是说(粗略地说)语句是按顺序执行的,解释了评估顺序等。它没有处理器指令或程序计数器的概念。函数指针被描述为完全不透明,指向“函数”而不是单个指令。它甚至不保证函数与数据存储在同一内存中。

该标准也没有引入堆栈和堆的概念。它仅描述了以不同方式创建的对象的生命周期。指针经过仔细描述,不会将它们限制为标量。没有寄存器,缓存的概念......

于 2020-09-28T18:29:28.770 回答