如何在计算机内存中存储和访问变量及其引用?

How a variable and its reference is stored and accessed in computer memory?

变量如何存储在计算机内存中?

例如:当我们指定

整数 x = 15;

通常,计算机在其 ram 中分配一个 4 字节的内存块,在分配的 4 个字节中以 0 和 1 的形式存储值 15,x 指的是分配的 4 个字节内存的地址。

现在,我的疑问是 x 是如何指代内存位置的。引用存储在何处以及如何存储?

当我们使用 x 时,它如何知道引用该内存位置。

对于 java 和 python 等不同的语言,这是否不同?

这对于不同的数据类型是否不同?

如果你能制作视频或博客来澄清这一点,我将很高兴。

Typically the computer in its ram allocates a 4 bytes...

整句话完全正确。只是,有不同类型的分配。最简单的一个是计算机在某个时刻有一定数量的空闲和连续内存。当一个程序启动时,所有的(空闲和连续的)内存都会被分配给新程序。程序完全负责管理内存,并且不要在该内存区域之外写入。这就是 DOS(实模式)的工作原理——非常简单。该程序(好吧,它的运行时)仅被告知内存区域的起始地址和结束地址。它 "maps" 一些 "base" 注册到那个 ram,例如,地址 0 指的是起始地址,程序可能知道变量 X 所在的位置。更高级的操作系统超越了,例如,具有阻止程序试图在其允许的 ram 之外读取或写入的机制。甚至更进一步,更复杂的 OS 可以在一开始给程序一些 ram,然后在程序要求时提供更多 ram。

Now, my doubt is how x refers to the memory location. Where and how the reference is stored ?

通常,引用根本不存储在(已编译的)程序中。你(程序员)称之为 "X",因为程序只是变成了一个地址。第一个变量地址为 0,第二个变量地址为 4,依此类推。 调试符号,当没有被剥离时,跟踪给地址的 "high level" 名称;但它们由调试器使用,在技术上不是 "program".

的一部分

When we use x how it knows to refer to that memory location.

让我们编写一个简单的 C 程序:

int x = 15;
int y = 20;
int s;

s = x+y;

编译器看到 "int x" 并将地址 0 分配给 x。然后看到 "int y" 并为其分配地址 4。然后将地址 8 分配给 "s"。当然这些地址是在整个编译过程中被记住的。 同时它看到那些 "x=15" 和 "y=20",因此输出这些指令:

"store an integer of 4 bytes, value 15, at address 0"  
"store an integer ..., 20, at address 4"

最后它看到 "s=x+y" 并输出:

"take in the left hand the int (4 bytes) value at address 0"
"take in the right hand the int value at address 4"
"poor the left hand in the right hand"
"poor the right hand in 4 bytes at address 8"

如您所见,没有更多的 x y 或 s,只有地址(这是一个非常简化的解释)。

Is this different for different languages like java and python?

是的,但不是太多。变量的名称总是指一个地址。纯解释型语言要记名,因为没有编译和执行的分离,像java这样的midway语言(我说midway是因为java既是编译器又是解释器)可以做到甚至更复杂的事情。

Is this different for different data types?

对于简单类型,没有。在C语言中,如果不考虑指针和堆,所有的变量都是一样对待的,只是它们的长度发生了变化。一个 int 可以是 4 个字节长,一个 char 可能是一个字节,一个数组有一个程序员指定的长度,但是变量总是引用包含值的缓冲区的第一个位置。编译器为每个变量保留其地址、类型和长度,因此当它在源代码中遇到变量名称时,它可以知道要做什么(编译什么指令)。


"can you tell me how exactly the "x 的编辑变为 0" 部分发生在编译期间的计算机中"

概念很简单。编译器读取源代码的文本。每次遇到变量声明时,它都会为其分配第一个空闲地址,然后将其增加变量的大小。开始时,该地址为 0。编译器读取 "int x;" 后,x 的地址变为 0,并且 "current" 地址递增(对于 int,可能为 4 或 8)。变量名称、它们的类型和它们的地址被保留,并形成一个 查找 table。这个table用来检查你没有声明一个标识符两次,用来知道当source引用一个已经声明的变量时去哪里读写。如果源代码引用了一个未声明的变量,编译器会报错,因为它在查找 table 中找不到该变量。请注意:您将 link 发布到一个讨论指针的视频;指针也是变量,但它们引入了其他概念。我所说的关于地址的内容也适用于指针,从某种意义上说,它们只是变量,但它们的值使用方式不同——我不明白你为什么坚持使用它们。