作者矢泽久雄,YAZAWA股份有限公司董事长兼总经理。本书以通俗易懂的方式来解析程序的运行机制,可以了解CPU的寄存器和内存的运行方式。无论任何事情,了解其本质非常重要,只有了解本质才能利用效率。这样一来,即时有了新技术出现也能容易的理解并掌握。
一、对程序员来说CPU是什么
CPU(Central Processing Unit,中央处理器)是计算机的大脑,它的内部由数百万至数亿个晶体管构成。CPU有四个构成部分:控制器、寄存器、运算器、时钟。程序员只需了解寄存器即可,因为程序是把寄存器作为对象来描述的,CPU是寄存器的集合体。
二、数据是用二进制表示的
要想对程序的运行机制形成亿大致的印象,就要了解信息(数据)在计算机内部是以怎样的形式来表现的,又是以怎样的方法进行运算的。在C和Java等高级语言编写的程序中,数值、字符串和图像等信息在计算机内部都是以二进制数值的形式来表现的。通过电流信号,我们可以给CPU发送指令或者传递数字信息等,比如让电脑计算1+2的时候,就要把进行加法计算的命令和1和2这两个数字通过电流的方式传递给CPU。CPU的引脚有电流通过的时候数值为1,没有电流通过时数值为0,所以只能用二进制数来表示计算机的信息。
三、计算机进行小数运算时出错的原因
当遇到无限循环小数时,计算机无法正确表示数值,最后都变成了近似值。计算机这个功能有限的机器设备,是无法处理无限循环的小数的。因此,在遇到循环小数时,计算机就会根据变量数据类型所对应的长度将数值从中间截断或者四舍五入。我们知道,将0.333……这样的循环小数从中间阶段会变成0.3333,则是它的3倍是无法得出1的,计算机运算出错也是同样的道理。
四、数量使用有棱有角的内存
计算机是进行数据处理的设备,而程序表示的就是处理顺序和数据结构。由于处理对象数据是存储在内存和磁盘上的,因此程序必须能自由地使用内存和磁盘。
上图是内存IC的引脚配置示例,虽然这是一个虚拟的内存IC,但它的引脚和实际的内存IC是一样的。VCC和GND是电源,A0~A9是地址信号的引脚,D0~D7是数据信号的引脚,RD和WR是控制信号的引脚。将电源连接到VCC和GND后,就可以传递比如0或1这样的信号。大多数情况下,+5V的直流电压表示1,0V表示0。数据信号引脚有D0~D7共八个,表示一次可以输入输出8位(=1字节)的数据。此外,地址信号引脚有A0~A9共十个,表示可以指定0000000000~1111111111共1024个地址。而地址用来表示数据的存储场所,因此我们可以得出这个内存IC中可以存储1024个1字节的数据。因为1024=1K,所以该内存的IC的容量就是1KB。
五、内存和磁盘的亲密关系
从都具有存储程序命令和数据这点看,内存和磁盘的功能是相同的。在计算机的5大部件中,内存和磁盘也都是被归类为存储部件。不过利用电流来实现存储的内存,同利用磁效应来实现存储的磁盘,还是有差异的。而从存储容量来看,内存是高速高价,而磁盘是低俗廉价。
六、亲自尝试压缩数据
RLE(Run Length Encoding,行程长度编码)算法,是把内容用“数据 x 重复次数”的形式来表示的压缩方法。例如:AAAAAABBCDDEEEEEF = A6B2C1D2E5F1。哈夫曼算法是指:为各压缩对象文件分别构造最佳的编码体系,并以该编码体系为基础来进行压缩。压缩算法的种类大概有一二十种,之所以会存在如此多得压缩算法,是因为压缩比率、压缩需要的处理时间(压缩的复杂程度)以及各种文件的需求等是不一样的,因此,至今学界都不能提出一个万能的压缩算法。
七、程序是在何种环境中运行的
由于同一个程序能被大量用户使用,所以说程序具有很大的价值。如果将程序拿来出售的话,只要销量大,肯定就能收到非常可观的利润。即便是自由软件,若有大量的用户使用的话,那也是一件让人高兴的事。大家也都希望自己编写的程序被尽可能多得用户喜欢并使用吧。但是,如果环境不同,程序是无法运行的。例如,在Macintosh上直接运行Windows用的程序,基本上无法实现的,这是因为运行环境不同造成的。运行环境 = 操作系统 + 硬件。
八、从源文件到可执行文件
把EXE文件的内容Dump一下,Dump是指把文件内容,每个字节用2位十六进制数来表示的方式。本地代码的内容就是各种数值的罗列,这些数值就是本地代码的真面目。每个数值都表示某一个命令或数据,而计算机就是把所有的信息作为数值的集合来处理的。能够把C语言等高级程序语言编写的源代码转换成本地代码的程序称为编译器。编译器转化生成的本地文件,并不能直接运行,还要链接处理。
九、操作系统和应用的关系
利用计算机运行程序大部分都是为了提高处理效率。例如,Microsoft Word这样的文字处理软件,是用来提高文本文件处理效率的程序,Microsoft Excel 等表格计算软件,是用来提高账本处理效率的程序。类似于文字处理软件这样,为了提高特定处理效率的程序总称为“应用”。程序员的工作就是编写各种各样的应用来提高业务效率。而应用的运行环境,也就是操作系统,则直接从软件商店等处购买就可以了。不过,一定不能忽略操作系统,否则就无法编写应用。这是因为,程序员是通过利用操作系统提供的功能来编写应用的。
十、通过汇编语言了解程序的实际构成
在加法运算的本地代码中加上add(addition的缩写)、在比较运算的本地代码中加上cmp(compare的缩写)等,这些缩写称为助记符,使用助记符的编程语言称为汇编语言,汇编语言和本地代码是一一对应的关系。通过编译器输出汇编语言的源代码,不会转化成本地代码的伪指令,汇编语言的语法是“操作码+操作数”
十一、硬件控制方法
“计算机如果没有软件,就仅仅是个箱子”,也就是说,即使计算机这种看起来很了不起的设备(硬件),离开了软件依然什么也做不了,因为软件的存在是硬件正常运行的必要条件。虽然说计算机领域的新技术在不断涌现,但计算机能处理的事情始终只是对数据进行运算,并把结果输出,这一点是不会发生任何变化的。不管程序内容是什么,最终都是数据的输入输出和运算。
十二、让计算机“思考”
程序就如同是由计算机执行的各种指令罗列起来的文章,计算机内部的CPU,通过对该文章的内容进行解析和运行,来控制连接到计算机的各种外围设备。具体来说,控制就是指CPU和各种设置之间配合进行数据的输入输出处理。计算机并不智能,它只是运行了表现人类思考方式的程序而已。也就是说,开发程序的程序员,赋予了计算机这些智能,程序只是人类的想法在计算机上进行了重现。
读后感:对程序的运行机制有了大致的了解,明白了如何用二进制表示小数、部分压缩算法、程序运行流程。但是对汇编语言还是很晦涩难懂,内存和寄存器的相关知识还不够全面,有需要的话还会深入学习。