今天是10曰24日,有人把这个日子定为程序员的节日,因为1024这个数字和程序员密切相关。
下面我就为大家解密,1024跟程序员有什么关系,程序员写程序又到底是怎么回事。
我们所使用的电脑和手机装着各种各样的软件,能帮我们完成各种各样的任务,帮我们工作,供我们娱乐,这部神奇的机器似乎无所不能。
但是你关掉显示器,拆开机箱, 会发现里面只有密密麻麻的电路, 这些电路以一种神奇的方式运转, 帮我们完成我们想要做的事情。
就拿机箱中最主要的部件CPU来说,他其实是由无数个逻辑开关组成,每个开关只能表示两种值0和1,开关闭上就是1,开关打开就是0,就像手电筒一样,开关闭合,点亮灯泡表示1,开关放开, 熄灭灯泡表示0。这无数多个逻辑开关通过一种叫做继电器的电子元件连接,经过各种奇妙的组合,最终就是我们所使用的CPU。虽然我们使用的现代集成电路型CPU比这个要先进无数倍,基础运行原理却没有本质的变化, 它们依然只能识别0和1这两个数字。
比如说你要让电脑的机箱报警1次,你跟CPU说:“你让电脑给我叫一下”,CPU是不会理你的。 CPU只认得由0和1组成的命令,你需要给CPU发送一条表示让机箱报警的命令,比如说11100101,它才会按照你的要求去完成任务。如果你要让机箱叫10下,那么同样的命令要发十次。
这些0和1组成的命令就是计算机程序的本质,任何软件最终都是以这种形态在计算机上运行的,我们把它称之为机器语言或者机器指令。
这种由0和1组成的命令对机器而言甚易理解,对人类而言却难以识别。这样的命令, 读个几条几十条还勉强能接受,几万条, 几十万条,几百万条呢?试想一下对着满屏幕的密密麻麻的0和1,会是什么感受? 任何一个智商落在天才智商界限以下的普通人,都没有办法高效的阅读这些指令。
为了克服这种障碍,有人发明出一种叫做汇编语言的东西,汇编语言是机器语言的人类可阅读形式。
比如说让机箱报警的指令11100101,如果使用汇编语言实现的话就是warn指令。汇编器最终会把warn指令转换成11100101,因为CPU只认得0和1,不认得英文字母,但是对于人而言,warn指令比11100101要友好的多。换句话说, 汇编语言的编译器会把人类看的懂,CPU看不懂的汇编语言命令代码转换成CPU看的懂,人类却很难看的懂的机器指令。就像你的身体, 需要蛋白质、脂肪、维生素等营养元素来维持身体的新城代谢,可你吃下去的食物是蔬菜、水果、肉类,你的嘴巴认识这些食物,你的身体却不认识。这个时候, 你的消化系统就充当起了转换器, 将食物转换为你身体所需的营养元素。 这其实和电脑运行是同样的道理, 你的身体好比电脑, 他需要营养元素也就是0和1组成的指令来维持运行,你吃下去的食物是汇编指令,你的消化系统就是将食物转化成营养元素也就是将汇编语言转换成机器语言的转换器。
读到这里,是不是感觉到了眉目,程序员的工作就是写汇编指令。事实上, 的确存在以写汇编代码为职业的程序员。 然而, 计算机技术发展日新月异, 现在,这类程序员只占到程序员总群体的极少一部分。 绝大多数程序员不用汇编语言写程序,他们使用的是比汇编语言更加高级更加易于使用的高级编程语言。
来看一个例子
这是一个供普通电脑用户使用的计算器软件,我们用它计算8加9的值,并将结果16显示。
假设我们不考虑软件的图形用户界面实现,只关注值的计算,此次运算的程序大概长这样子,代码以C语言为例
这便是大多数程序员使用的语言,也就是所谓的高级语言。
那我们可不可以使用汇编语言来实现这个程序呢,答案是可以的,下面是汇编语言的实现形式
使用高级语言和使用汇编语言实现这次计算,哪一种编码效率高,哪一种简单,哪一种可读性强,哪一种易于维护?不言而喻
因为高级语言比汇编语言好用,所以程序员们都放弃汇编语言转而使用高级语言。
可是我们电脑中的CPU是不认识高级语言的。这个时候高级语言编译器闪亮登场,它的作用就是将高级语言的代码转换成汇编语言的代码,就跟汇编语言转换器将汇编代码转换成机器代码是一样的道理。
这个时候,一切都已明朗, 软件的整个运行过程如下
我们假定某个软件是使用解释型语言开发的,那么, 当软件的使用者执行软件的某一个功能时
第一步,这个功能会被转换为开发这个软件的语言的代码
第二步,这门语言的代码会被语言的解释器转换成汇编代码
第三步,汇编语言转换器会把汇编代码转换成机器代码
第四步,CPU执行机器代码,完成用户的操作
那上面讲的这些跟1024有什么关系呢?我们已经知道, 计算机CPU只认识0和1组成的指令,这种指令还有另外一个名称, 叫做二进制,而我们人类使用的数字系统是十进制。
零,一,二,三,四,五,六,七,八,九,十,我们是这样数数的,从零到九, 每一个数字都由一个字符表示,分别是0-9,而十并没有单独的字符表示,它使用一和零的组合“1”,“0”表示,所以,在十进制数字系统中,所有数值都是0-9的组合。
同样,在八进制数字系统中,只能用0-7范围内的数字进行表示。 零,一,二,三,四,五,六,七,接下来不是八, 像十进制的十一样, 八进制的八也用“1”和“0”的组合表示。
同样,二进制只能使用0-1范围内的数字来表示。零,一,不好意思,二进制没有二,如同八进制没有八一样,二进制的二也是用“1”和“0”的组合来表示,10在二进制系统中就表示2。
一,二,三,四,五,六...一千零二十四,我们从一数到一千零二十四,在十进制数字系统中,使用1024表示;在八进制数字系统中使用2000表示;在二进制数字系统中则使用10000000000表示,这像不像一串CPU的机器指令? 是的,CPU认得出这串数字。 如果使用科学计数法表示那么这串数字就是2的10次方。
1024 = 2的10次方 = 10000000000
512 = 2的9次方 = 1000000000
256 = 2的8次方 = 100000000
128 = 2的7次方 = 10000000
64 = 2的6次方 = 1000000
32 = 2的5次方 = 100000
16 = 2的4次方 = 10000
8 = 2的3次方 = 1000
4 = 2的2次方 = 100
2 = 2的1次方 = 10
1 = 2的0次方 = 1
看出来程序员和1024的关系了吗?我告诉你们,没什么关系,这一切只是 1024 = 2的10次方 = 10000000000 的偶然而已, 512、256、128这些数字对与程序员而言跟1024没有差别。
有同学说1KB = 1024Byte, 1MB = 1024KB, 1GB = 1024MB, 1TB = 1024GB, 1PB = 1024TB,这才是1024的意义!但是这些容量单位不仅仅跟程序员有关系吧?普通的电脑和手机用户甚至比程序员更关注这些单位
如果从这个角度讲,那么10月24日不但是程序员的节日,更是所有电脑用户的节日,我们所有电子设备爱好者应该普天同庆,大家一起嗨!