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