Compiler construction 计算机如何区分两条数据?

Compiler construction 计算机如何区分两条数据?,compiler-construction,binary,low-level,Compiler Construction,Binary,Low Level,我想知道计算机以1s和0s/低电压和高电压的形式存储所有信息,yada-yada…但是当我们编译程序时,它-或者只是存储在comp上的任何数据-是二进制形式…那么计算机如何区分两个数据段,因为它包含的是一个0和1的流…为了让我的问题更清楚,让我们从C:中获取一个荒谬的简单代码。 void main() { int A = 0; int* pA = &A; char c = 'c'; char* pC = &c; return; } 它什么

我想知道计算机以1s和0s/低电压和高电压的形式存储所有信息,yada-yada…但是当我们编译程序时,它-或者只是存储在comp上的任何数据-是二进制形式…那么计算机如何区分两个数据段,因为它包含的是一个0和1的流…为了让我的问题更清楚,让我们从C:

中获取一个荒谬的简单代码。
void main() {
    int A = 0;
    int* pA = &A;
    char c = 'c';
    char* pC = &c;
    return;
}
它什么都不做——只做了4个int类型的变量,指向int的指针,char和指向char的指针…现在这些变量将以0和1的形式存储在某个地方…那么,计算机如何知道这些变量从哪个位开始,在哪里结束?首先,你可能会说计算机有它的地址,好吧,是的。但是结尾呢?…还有像对象/结构这样的复杂数据类型呢


最后但并非最不重要的一点是,函数/过程如何?

编译后的程序将由机器指令组成,这些指令以反映高级类型的模式访问数据。大多数汇编语言都有不同的指令来加载和操作不同大小(加载字节、字、长字符等)或类型(有符号和无符号整数、浮点和长字符等)的数据。由于编译器在编译过程中具有可用的类型信息,因此它可以发出汇编指令,通过发出命令以与类型系统一致的方式对数据进行操作,将内存中的数据(全部为0和1)视为具有适当的结构

对于结构和函数,根据您使用的语言,有许多可能的编码。去年夏天,我教了一门编译器课程,我们花了两堂关于函数和对象布局的课。和可在前面的链接中找到


希望这有帮助

没有。相同的位序列可以解释为数字、字符串、代码、结构等等。计算机无法知道一堆比特的用途

试试这个:

int main() {
    int A = 0;
    char* pC = (char*)&S;
}
你会发现它是有效的。它接受整数内存,并表示我希望将其视为字符数组。计算机将很乐意与此配合。它很少有用,但可以做到


对于不同的类型,唯一不同的是如何对待它们。浮点数与整数的处理方式不同,整数与字符串的处理方式不同。如果查看程序的低级版本,您会发现包含的每个操作都是特定于特定类型的数据的。区别不在于位,而在于程序如何在位上运行。

你可以通过尽可能接近金属来回答所有这些问题(以及关于计算机的更多问题):即学习组装。我建议阅读这本书(在线免费提供),其中也涵盖了这些主题。另外,请阅读我的答案。现在,让我简要回答您的问题:

  • 你是对的,计算机只能看到无限的比特流。操作系统负责创建文件系统。甚至ram也可以被认为是一个非常简单的文件系统(页面或段就是文件)。这意味着操作系统在某个地方有一个表,它可以跟踪每个程序存储了什么,什么是数据,什么是代码等

  • 基本级别的变量只不过是字节

    a=b+1

编译器实际上为变量分配了一个任意地址,并将硬代码(即写入实际常量,例如0xA3F0)此地址分配给引用它的每个语句

  • 数据结构以许多不同的方式存储。然而,当谈到c结构时,事情更简单:如果我们忽略填充之类的内容,它们只会一个接一个地存储此结构包含的变量。这就是为什么结构的长度总是已知的原因

  • 函数实际上是存储代码的内存中的位置。要“调用”函数,将参数加载到或任何其他全局内存空间中,然后跳转(即转到)到函数的地址。函数完成后,跳转到调用它的地址(地址也存储在堆栈中)

  • 重要的是要理解,编译器以上述方式完成所有翻译代码的艰苦工作。高级语言的所有功能都只是为了简化您的工作而进行的抽象。然而,最终它只是位和字节、0和1、5伏和0伏


更重要的是,现代体系结构不允许操作系统自己完成所有这些工作。大部分管理工作也发生在硬件层面,例如内存管理、标记内存地址的用途等。

您现在阅读的段落只不过是一连串的字母和标点符号。你怎么知道一个词的开头和结尾?你怎么知道这些词的意思?这个文本流是如何传达有用信息的

关于数学你也可以这么说。当你在一页纸上看到数学表达式时,它们只是一系列数字和符号,但它们是以紧凑的形式传达深刻思想的有力方式。还有音乐。那一串串的点、旗和线是如何代表像音乐一样短暂的东西的

当然,答案是有规则的。这些字母不仅仅是随机组合的——它们有一个特定的序列。当你遵循你我都知道的规则时,你就能够辨别单词,理解它们各自的意思,并将它们组合成思想

二进制数据也是如此。数据与随机位的区别在于规则的存在,如果遵循这些规则,可以以有意义的方式解释这些位。现在,你问了很多问题