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

问题描述

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

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

当然,我仍然想知道标准中是否仍然以某种方式描绘了诸如内存的代码段或程序计数器之类的概念,如果有,它们在何种程度上被描绘了? 在抽象机器中如何依次描述代码段的概念?

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

解决方法

简短的回答:不是。

我们实际上并没有在C ++规范的抽象机(或任何抽象机-其他语言也定义它们)上执行代码。我们在使用晶体管实现的 real 机器上或在晶体管上运行的软件中执行代码。语言规范中的抽​​象机用于定义有关真实计算机上的代码将执行的操作的边界-它必须“好像”在抽象机上运行,​​至少要在其出现的环境中运行。有关抽象机器定义。

该标准的相关引用为:

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

但是,对于“可观察到的行为”到底是什么没有真正的明确定义。

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

,

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

内存或程序计数器的代码段仍在标准中以某种方式显示

不。该标准只是说(大致而言)比语句是顺序执行的,解释evaluation order等。它没有处理器指令或程序计数器的概念。函数指针被描述为完全不透明,指向“函数”而不是单独的指令。甚至不能保证函数与数据存储在同一内存中。

该标准也没有介绍堆栈和堆的概念。它仅描述以不同方式创建的对象的寿命。仔细描述了指针,但并不将其限制为标量。没有寄存器,高速缓存等概念……