08 ELF和静态链接:为什么程序无法同时在Linux和Windows下运行? 08 ELF和静态链接:为什么程序无法同时在Linux和Windows下运行?过去的三节,你和我一起通过一些简单的代码,看到了我们写的程序,是怎么变成一条条计算机指令的;if…else 这样的条件跳转是怎么样执行的;for/while这样的循环是怎么执行的;函数间的相互调用是怎么发生的。 我记得以前,我自己在了解完这些知识之后,产生了一个非常大的疑问。那就是,既然我 2022-08-23 专栏 > 深入浅出计算机组成原理
07 函数调用:为什么会发生stack overflow? 07 函数调用:为什么会发生stack overflow?在开发软件的过程中我们经常会遇到错误,如果你用 Google 搜过出错信息,那你多少应该都访问过StackOverflow这个网站。作为全球最大的程序员问答网站,Stack Overflow的名字来自于一个常见的报错,就是栈溢出(stack overflow)。 今天,我们就从程序的函数调用开始,讲讲函数间的相互调用, 2022-08-23 专栏 > 深入浅出计算机组成原理
09 程序装载:“640K内存”真的不够用么? 09 程序装载:“640K内存”真的不够用么?计算机这个行业的历史上有过很多成功的预言,最著名的自然是“摩尔定律”。当然免不了的也有很多“失败”的预测,其中一个最著名的就是,比尔·盖茨在上世纪 80年代说的“640K ought to be enough for anyone”,也就是“640K 内存对哪个人来说都够用了”。 那个年代,微软开发的还是 DOS 操作系统,程序员 2022-08-23 专栏 > 深入浅出计算机组成原理
10 动态链接:程序内部的“共享单车” 10 动态链接:程序内部的“共享单车”我们之前讲过,程序的链接,是把对应的不同文件内的代码段,合并到一起,成为最后的可执行文件。这个链接的方式,让我们在写代码的时候做到了“复用”。同样的功能代码只要写一次,然后提供给很多不同的程序进行链接就行了。 这么说来,“链接”其实有点儿像我们日常生活中的 标准化、模块化生产。我们有一个可以生产标准螺帽的生产线,就可以生产很多个不同的螺帽 2022-08-23 专栏 > 深入浅出计算机组成原理
11 二进制编码:“手持两把锟斤拷,口中疾呼烫烫烫”? 11 二进制编码:“手持两把锟斤拷,口中疾呼烫烫烫”?上算法和数据结构课的时候,老师们都会和你说,程序 = 算法 +数据结构。如果对应到组成原理或者说硬件层面,算法就是我们前面讲的各种计算机指令,数据结构就对应我们接下来要讲的二进制数据。 众所周知,现代计算机都是用 0 和 1组成的二进制,来表示所有的信息。前面几讲的程序指令用到的机器码,也是使用二进制表示的;我们 2022-08-23 专栏 > 深入浅出计算机组成原理
12 理解电路:从电报机到门电路,我们如何做到“千里传信”? 12 理解电路:从电报机到门电路,我们如何做到“千里传信”?我们前面讲过机器指令,你应该知道,所有最终执行的程序其实都是使用“0”和“1”这样的二进制代码来表示的。上一讲里,我也向你展示了,对应的整数和字符串,其实也是用“0”和“1”这样的二进制代码来表示的。 那么你可能要问了,我知道了这个有什么用呢?毕竟我们人用纸和笔来做运算,都是用十进制,直接用十进制和我们最熟悉的符号不 2022-08-23 专栏 > 深入浅出计算机组成原理
13 加法器:如何像搭乐高一样搭电路(上)? 13 加法器:如何像搭乐高一样搭电路(上)?上一讲,我们看到了如何通过电路,在计算机硬件层面设计最基本的单元,门电路。我给你看的门电路非常简单,只能做简单的“与(AND)”“或(OR)”“NOT(非)”和“异或(XOR)”,这样最基本的单比特逻辑运算。下面这些门电路的标识,你需要非常熟悉,后续的电路都是由这些门电路组合起来的。 这些基本的门电路,是我们计算机硬件端的最基本的 2022-08-23 专栏 > 深入浅出计算机组成原理
14 乘法器:如何像搭乐高一样搭电路(下)? 14 乘法器:如何像搭乐高一样搭电路(下)?和学习小学数学一样,学完了加法之后,我们自然而然就要来学习乘法。既然是退回到小学,我们就把问题搞得简单一点,先来看两个 4 位数的乘法。这里的 4位数,当然还是一个二进制数。我们是人类而不是电路,自然还是用列竖式的方式来进行计算。 十进制中的 13 乘以 9,计算的结果应该是 117。我们通过转换成二进制,然后列竖式的办法,来看看整 2022-08-23 专栏 > 深入浅出计算机组成原理
15 浮点数和定点数(上):怎么用有限的Bit表示尽可能多的信息? 15 浮点数和定点数(上):怎么用有限的Bit表示尽可能多的信息?在我们日常的程序开发中,不只会用到整数。更多情况下,我们用到的都是实数。比如,我们开发一个电商 App,商品的价格常常会是 9 块9;再比如,现在流行的深度学习算法,对应的机器学习里的模型里的各个权重也都是 1.23这样的数。可以说,在实际的应用过程中,这些有零有整的实数,是和整数同样常用的数据类型,我们也需要 2022-08-23 专栏 > 深入浅出计算机组成原理
16 浮点数和定点数(下):深入理解浮点数到底有什么用? 16 浮点数和定点数(下):深入理解浮点数到底有什么用?上一讲,我们讲了用“浮点数”这样的数据形式,来表示一个不能确定大小的数据范围。浮点数可以大到 3.40×10383.40×1038,也可以小到1.17×10−381.17×10−38 这样的数值。同时,我们也发现,其实我们平时写的 0.1、0.2 并不是精确的数值,只是一个近似值。只有 0.5这样,可以表示成 2−12− 2022-08-23 专栏 > 深入浅出计算机组成原理