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

9
在我读的第一本关于C ++的书中,它稍微涉及了代码在计算机上实际执行的细节(提到了程序计数器,调用堆栈,返回地址等)。我发现了解这些东西的工作原理真的很有趣,尽管我知道了解计算机如何工作并不是写出好代码所必需的。
在这个问答网站上阅读同样的主题时,我发现这并不一定是我之前学习的方式,因为我所了解的只是C ++的某种实现,取决于特定的计算机架构和特定的编译器。只要有一个遵守“正确”行为的兼容编译器,C ++代码也可以在完全不同的东西上运行。然后,正确的方法由标准和“抽象机”的行为定义(我希望我到目前为止了解得没错)。
当然,我仍然想知道像内存中的代码段或程序计数器之类的概念是否仍然在标准中“以某种方式”被描述,并且如果是的话,它们被描述到什么程度?
在抽象机中,如何描述依次执行代码片段的概念?
因为有人在评论中问我是否想让标准重复一遍:
我无法理解标准的内容,以便准确地确定它对抽象机或标准哪些语句可以被解释为关于“程序计数器”“代码存储”等抽象概念的语句。因此,出于无能为力,我要求社区解释标准中的内容。预期结果是最详细的抽象机内部结构概念,仍符合“抽象”的标准。

通过了解代码在计算机上的实际执行方式,您可以使代码更加健壮和高效。例如,处理器的数据缓存。实现利用数据缓存的代码将使代码运行更加高效(并且更快),而不是让处理器经常重新加载缓存。同样适用于指令缓存。 - Thomas Matthews
添加了 Language-Lawyer 标签。 - Thomas Matthews
@ThomasMatthews 有些MCU没有缓存,而是直接从内存中执行。所以我同意你的观点——了解底层硬件确实是必要的。例如,我之前曾经在一个只有256字节内存的系统上工作过——你真的需要知道这一点才能编写可行的代码! - Jerry Jeremiah
你是在询问什么是抽象机器以及如何理解它,还是已经理解了这个主题并且想知道标准对抽象机器有哪些限制?我不明白 - “C++抽象机器上的代码是如何存储和执行的?”- 没有人知道,因为正如名称所示,它是“抽象”的。 “如何”总是一个广泛的问题。 “抽象”(“抽象化”)这个术语让你感到困惑吗? - KamilCuk
2
我认为这个问题需要更多的关注。加入一个小程序(几行代码),并描述您在书中阅读到的实现将如何处理该程序?然后,答案可以是解释C++抽象机如何评估特定程序的说明。 - cigien
显示剩余4条评论
2个回答

9
简短回答:不是。
我们实际上没有在C++规范的抽象机器(或任何抽象机器)上执行代码。 我们在由晶体管实现的真实机器上执行代码,或者在运行在晶体管上的软件中执行代码。 语言规范中的抽象机器用于定义有关真实机器上的代码将执行什么操作的界限 - 它必须以“好像”正在抽象机器上运行为基础,在抽象机器定义的环境方面至少如此。
标准中的相关引用如下:
“符合规定的实现执行一个格式良好的程序应产生与相应的实例及相同输入的抽象机器之一可能执行的可观察的行为相同。”
然而,“可观察行为”的确切定义并不存在。
那么为什么要定义这些抽象机器?主要是因为有许多不同的真实机器,您希望说明您的代码将在其中任何一个上以相同的方式运行。 真实机器也非常复杂且难以理解。 因此,语言规范定义了一个抽象机器,它是期望运行的真实机器的简化版本。 尤其是关于代码存储和执行方式的详细信息,这些细节在抽象机器中大多被“抽象出来” - 它不进行具体说明,因此实现可以使用任何目标提供的机制,并仍符合规范。

我明白了,代码实际上并没有在抽象机器上运行。从你的回答中,我得出结论:抽象机器的内部结构并不涉及代码存储、程序计数器等等...代码只是“运行”。如果是这样,对我来说问题还存在。仍然有一些关于抽象机器上代码执行的事情我们可以说(例如,正如另一个答案指出的那样,语句是按顺序执行的,因此,语句在抽象机器上执行是什么意思)。但也许我应该在一个新的问题中问这个问题。 - Quantumwhisp
1
有对可观察行为的定义。 - Language Lawyer
在我看过的任何规范中都没有这样的说明。偶尔会提到一些不属于“可观察行为”的事情(例如未命名临时对象的构造函数和析构函数中的副作用),但没有明确的定义是什么。大多数编译器似乎只将其他线程或进程可以观察到的事物视为“可观察的”,而不是可能被调试器或类似工具检查的事物。 - Chris Dodd
标准中有一个名为[intro.abstract]的部分,其中以“这些统称为程序的可观察行为”结束。http://eel.is/c++draft/intro.abstract#6 - BoP
@BoP:这是最近的改进,但仍然相当模糊。 "交互设备" 的定义仍然完全未确定,但至少涉及到抽象机器可观察行为的 "意图"。 它还表明代码存储和执行的方式不是 "可观察行为" 的一部分,即使像调试器这样的工具可能能够 "观察" 它。 但也许调试器是一种 "交互式设备"? - Chris Dodd

2

标准并未具体说明抽象机器的内部工作,这正是抽象化物理机器内部运作的概念的用途。

存储器代码段或程序计数器仍然以某种方式呈现在标准中

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

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


好的。但是有一个“执行”的概念,这个执行可以在另一个“执行”之前或之后发生...我不会得到关于这些执行内部如何工作的答案,因为正如你所说,那部分被抽象化了,而且抽象机器没有“内部”。但我仍然想知道抽象机器的工作可以描述得多么详细。到目前为止,我知道它是一种奇怪的东西,可以改变内存中的内容,正如你所说,它是按程序线程顺序依次执行的。我们能不能对此做出更多的描述呢? - Quantumwhisp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接