我们是否被迫创建必须具有文本、数据、堆和堆栈内存部分的进程?

ale*_*ari -9 c unix linux memory executable

我知道C程序在内存中的基本布局是代码/文本、数据、堆和堆栈。C 程序内存布局确实对应于内存中进程的更一般布局。

我的问题是:

  1. “C 程序布局 = 通用过程布局”关联源自何处?(如果我们考虑所有的计算机科学文献......)

  2. 如果我要为我创建的编程语言(让我们称之为“ONE”)编写一个编译器,我应该遵守哪些主要规则(假设我们使用的是带有 intel x86_64 的 Linux 操作系统)?

Eri*_*hil 5

“C 程序布局 = 通用过程布局”关联源自何处?(如果我们考虑所有的计算机科学文献......)

每个操作系统都有一种(或多种)加载程序并开始执行的方法。这包括它可以读取和加载的可执行文件的格式。可执行文件格式通常包含一些描述文件中的程序部分的标头,以及描述每个程序部分的信息。程序部分可以包含要加载到内存中作为对象的初始值的数据,或者可以包含要加载到内存中以供执行的指令。或者,程序部分可能只是内存中需要提供的可用空间量。

没有C程序布局。编译器就是翻译器。它将C语言翻译成机器语言。(这个过程通常涉及多个步骤:将C翻译成内部表示,对内部表示进行优化等操作,将内部表示翻译成汇编或其表示,将汇编翻译成机器语言,将机器语言和数据写入对象模块,并将目标模块链接到可执行程序。)

在 C 源代码中,使用了计算的抽象模型,如 C 标准中所述。没有指定特定的硬件堆栈(尽管指定了堆栈语义,因为参数和自动对象在函数调用中具有后进先出行为)。没有指定具体的程序布局。编译器将 C 源代码翻译为目标平台的可执行程序,这就是程序的进程布局。

如果我要为我创建的编程语言(让我们称之为“ONE”)编写一个编译器,我应该遵守哪些主要规则(假设我们使用的是带有 intel x86_64 的 Linux 操作系统)?

以链接器和程序加载器期望的格式写入文件。符合操作系统指定的应用程序二进制接口。