我想知道的是计算机存储1和0 /低电压和高电压,内容十分重要的形式,所有的信息...但是当我们编译的程序,它 - 或者只是存储在补偿的任何数据 - 以二进制形式...那么如何将计算机2个数据的区分,因为所有它是由0和1组成的数据流......为了使我的问题更清晰,让我们一起来可笑的简单代码C:
void main() {
int A = 0;
int* pA = &A;
char c = 'c';
char* pC = &c;
return;
}
它不会做任何事情 - 只是使4个变量的类型int,指针为int,char和字符指针......现在这些都将保存在某个地方在0和1的形式......那么,如何计算机知道从哪个位做这样或那样的变化开始和在哪里结束? 对于开始你可能会说电脑有它的地址,还好,理所当然的。 但是,我们结束了吗?......而那些复杂的数据类型,例如对象/结构是什么?
最后但并非最不重要的,什么功能/程序?
那你现在阅读的段落也不过是字母和标点符号的流。 你怎么知道其中一个字开始和结束? 你怎么知道是什么的话是什么意思? 怎么这个文本流传达有用的信息?
你能说一下数学同样的事情。 当你看到写在页面上数学表达式,它们只是一系列数字和符号的,但他们是在一个紧凑的形式传达深理念的有力途径。 然后还有音乐。 怎样的点,标志和线条该流代表的东西瞬态音乐?
答案,当然,是有规则的。 字母不只是随机组合 - 他们有一个特定的顺序。 当你按照你和我都知道的规则,你能辨别的话,了解他们的个人意义,并结合成的想法。
这是与二进制数据相同。 从随机位区分数据的事情是规则,如果遵循,允许以有意义的方式对位的解释存在。 现在,你已经问了很多涉及各种规则的问题。 试图解释他们都将占用更多的空间比是在这样的一个答案是合理的(和更多的时间比我愿意投入到事业)。 但是,如果你拿起一本书上的计算机体系结构,你会发现的规则,他们是如何工作的,他们是如何组织进行充分的讨论,以及它们是如何实现的。 这真是有趣的东西!
如果你还没有准备好潜入实际的计算机体系结构的是,一个优秀的书,会给你很多有识之士的是哥德尔,埃舍尔,巴赫:永恒的黄金编织的侯世国。 这是一本厚书,和密集的想法。 但它也写得很好,有趣,你不一定要从头读到它来掩盖学到很多的东西着迷。
你可以回答所有这些问题(以及更多关于计算机)通过获取尽量靠近金属地:那是,学习assembly.I建议读的书大会的艺术 (免费提供在线)覆盖这些话题。 此外,阅读我的答案大会学习资源 。现在,让我简单地回答你的问题:
编译器实际上是一个任意地址分配给变量和硬编码这个地址(即实际常数如0xA3F0写入)将每一个指的是它的语句。
数据结构存储在许多不同的ways.However,谈论C结构时,事情更简单:他们只是存储变量,这种结构包含一个接一个,如果我们忽略的东西像填充和such.That之所以一结构的长度总是已知的。
实际上是在内存中的代码是stored.To“呼叫”功能放置功能,参数被加载到堆栈 ,或任何其他全局内存空间,然后一个跳跃,即跳转到该函数的地址made.when的功能完成,它就跳到调用它的地址(该地址存储在堆栈中了。)
要明白,编译器在高级语言具有上述ways.All功能转换代码的所有的努力都只是抽象,以使您的工作easier.In结束但它是很重要的只是位和字节,0和1,5伏和零伏。
更重要的是,现代建筑不要让OS中持家的itself.Much做所有的东西在硬件层面正在发生的事情太多,比如内存管理,标签什么内存地址用于什么目的等。
事实并非如此。 位的相同序列可以被解释为数字,字符串,代码,结构,不管。 计算机有没有知道什么位一堆的用意是的方式。
尝试这个:
int main() {
int A = 0;
char* pC = (char*)&S;
}
你会发现,它的工作原理。 它采用整数内存,并说我不想把它当作一个字符数组。 电脑会很乐意与此一起去。 它很少有用,但它可以做到的。
这是针对不同类型不同的唯一的东西就是他们是如何对待。 花车被视为不同的整数从字符串区别对待。 如果你看一下你的程序的低级别版本,你会发现,每一个操作包括特定于某种类型的数据。 所不同的是不在位,其在程序上的位如何操作。
计算机不知道,和电脑并不关心。 它所做的就是按照说明进行操作。 一个这样的指令可能会说:“把从该地址为32位,来自该地址的另一个32位;在32位,在第一和存储结果;通过使用所谓的‘补除’的方法结合这两个32位串上述地址”。 每一个指令规定:
电脑不小心操作做什么。 这只是计算机设计师是不够好,使操作对我们有用的人。
一个程序,如你给出的一个是在较高的水平非常现实的意义。 这需要翻译,产生形状的计算机可以理解的。 这样的翻译知道什么int
是,什么int *
是,并且知道两者有多少位,他们采取在内存中,其中计算机操作,可以有效地适用于他们。
因此,你几乎回答了你自己的问题:
对于开始你可能会说电脑有它的地址,还好,理所当然的。 但是关于到底是什么?
如果你知道开始和长度的结束是已知的。
更复杂的数据结构通常由单个的,更简单的部件。 所以,这样的翻译代码时,你拿的部分,为其指定偏移,使得没有任何一部分重叠另一个,然后使用偏移量来计算用于访问的部分地址。
过程和函数太复杂,无法说明如下。
但到了您的示例程序结束一个简要说明。 正如你所说的,它不会做任何事情。 一个聪明的翻译只会写指令“什么都不做”的计算机。 一个不太聪明的翻译人员分配地址在每次声明变量,并写入两个指令:“这个多少位预留空间;然后什么都不做”(是的存储每个变量所需的空间长度的位数)。 在任何时候,计算机需要知道你的程序中的变量什么。
编译程序将包括访问中,反映了高层次的类型模式的数据机器指令。 大多数组件语言有用于装载和操作不同大小的数据不同的指令(装载字节,字,长材等)或类型(符号和无符号整数,浮点数和长等)。 由于编译器具有编译期间键入向它提供的信息,它可以发射出治疗在存储器中的数据,这一切只是零和一汇编指令,如通过发出命令以通过数据的方式,是一致的操作具有适当的结构与类型系统。
对于结构和功能外,还有根据你所使用的语言太多可能的编码。 我教一个编译器当然去年夏天,我们花了功能和对象的布局两次讲座。 在第一个幻灯片和第二听课都可以在以前的链接。
希望这可以帮助!
在高级语言编写的语言和编译器的规则嵌入信息到创建的程序。 将CPU /处理器可以不在乎只是位了,他们没有比作为执行指令的时间很短的时间别的意思。 对于一个加法指令的位操作数增加或结果,对于负载或储存他们可能是地址或偏移地址等,但马上去后重新成为无意义位。
正如另一篇文章提到的这些话你正在阅读的是刚刚从字母组合,没有一次取一个意思,没有意义的网页浏览器或视频卡显示像素,但高层次的用户,他们做才有意义。 同样的,程序,缩小了一下,看看该程序作为一个整体,你会看到,指令和位组合形成实现可变类型,你已经编写和编译高级程序序列程序序列。
没有魔法吧