一、老子
老子是我国古代著名的老人家.
老子上学的时候,书都是写在竹片上的,比较费事,所以那时大学里的教授都不怎么喜欢写书,《易经》是唯一的教材。
老子读了四年的《易经》后,发觉被忽悠了,为了对得起学费,于是又忽悠了一篇名叫《道德经》的毕业论文:道生一,一生二,二生三,三生万物……
后来,有个老外不听爹妈劝,报了中国历史专业,闷头研究了四年老子的“智慧”,快毕业了,就扯了篇关于二进制的毕业论文。
他说二进制是最先进的计算方法,因为:
1.所有的数字(正数直接表示,负数用补码)都可以用二进制表示,比如:1 = 00000001;-1 = 11111110 = (255 - 1);
2.所有的数学计算(+、-、x、……)都可以转化为加法计算,比如:A x (-2) = 255 - (A + A);
3.所有的逻辑运算(即是与、或、非)也可以转化为加法计算,比如:1011 & 1001 = 1001 (按位加,将对应的进位作为结果就是了);
二、第一台计算机
后来,有些科学家根据这篇论文的想法,折腾出了一个可读写数据的二进制加法器。如下图:
![](http://images0.cnblogs.com/blog/639759/201406/061519351927963.jpg)
他们把每一种数据操作都给编了个号码,比如:1110表示两数相加,那么1110 0100 0001,即是表示将A=4和B=1丢进加法器里,求结果。
这种操作方式沿用至今。
三、第一个程序
当搞出这么个伟大的加法器后,科学家们再进一步,想出了用二进制数据来代表对数据的操作,比如:98表示两数相加,那么981543,即是表示将A=15和B=43丢进加法器里,得到C=58。类似了,用99表示两数相减。。。
于是第一个程序就出来了,它是由一堆用二进制表示的东西。
四、汇编代码
如果科学家仅满足于此,那现在这些程序猿估计对着这一堆的二进制加班会加到发疯了。但程序猿可不是科学家,他们是出了名的懒人。接着就设计出了一个软件,你写“ADD #15 #34",这个软件会一一对应地将其转化为981534.
这看似很简单的一步,极大地解放了程序的生产力。程序猿不用再去数那些个0和1了,出错少了,更容易理解了,于是有时间喝茶、回家陪老婆了。而这个动作叫编译,你写的那个代码,叫汇编代码。
五、C语言
简单地一步,就产生了这么大的效果,于是爱偷懒的程序猿再接再励,搞出了个软件,能将你写的 “i = 15 + 34", 变成“ADD #15 #34",然后做一下上一步,就可以让电脑去算了。更直观了,是不是,还有点眼熟,这就是C语言,俗称”高级语言“,总算是个正常人能懂的了。
然后是C++、C#(四个+,程序猿是多懒啊,命个名都懒得多想)、……
当然了,程序猿太懒了,懒得换个名字,这步还叫编译。
六、函数
搞出个高级语言的同时,又有些家伙觉得,把一堆的代码写在一起,还是不爽,喝个茶回来,又忘了刚才的代码了。看起来还是太费劲,于是又搞出了个”函数“这个东西(苦逼!又懒得想名字,我都不想吐这个槽了。。。)。只要你给这个“函数”命名命得中肯,它可以让你看一下代码,接着喝茶回来还以跟上刚才的思路流程,而且不同项目的相同功能函数,还可以用“复制”+“粘贴”搞掂。
七、源文件
再后来,程序猿复制粘贴搞多了,发现搞来搞去都是那几个函数,于是就把那几个函数放到一个c后缀结尾的文件里去,然后用一个h后缀的文件声明一下函数,然后在要用到这些函数的地方引用下这个h后缀的文件,编译器就自动去找了。
只要归类得合理,想用什么函数,就容易想到对应的头文件,加进来,就可以使用那个函数的,这确实省了不少陪老婆的时间。
这个xxx.c格式命名的文件就叫源文件,而那个xxx.h格式命名的文件就叫头文件。
八、Makefile
需求继续变得越来越复杂,项目越来越膨胀,文件越来越多,每增加一个文件,程序猿都得相应地去编译那个文件,受够了这种反复地体力劳动,于是程序猿决定把所有的要编译的文件写到一个叫Makefile的配置文件里,又写了个叫make的程序,只要运行这个程序,它就会去找Makefile,然后自动将相应的文件进行编译。就这样,增减这个配置文件里记录的文件名,以后编译器就会自动编译了。
九、IDE
由于程序猿看上去好像天天上班喝茶、叹空调,越来越多的人争着要来做程序猿。但要这帮子空有着一股热情人去学习怎么编译、链接,那无疑等于在你心急火燎的问路人甲,厕所在哪的时候,他却跟你说,前面第三个红绿灯,左转第五过道,跨过那个围栏……
然而,有抱怨的地方就有机遇,那些程序猿老鸟发现了这个机会,就将那些编译、链接工具和Makefile整合到了一起,所有的一切耍杂技般的动作,变成了一个按钮的点击操作,这让这些老鸟大嫌了一笔的同时,也让一帮子人傻呵呵的成为自己的打杂工。
如果你还在为刚才所说的厕所问题捉急的话,也许那越难吃的麦当劳和肯德基店里的人流能给你点提示。
十、静态库
需求继续复杂,项目继续膨胀。现在软件编译一下,得花两个小时了,都没法调程序了。
最后,他们又想出了个办法,把每个组写的代码编译到一个文件里去,标示好每个函数、变量在文件里的位置。要出货时,再根据每个二进制文件的位置信息组成一个最终的完整文件。这样,各个组干改代码只要编译自己的那部分就好了,大大节省了编译时间。
这些编译好的文件,就叫静态库,而这个组合到一起去的过程,就叫链接。
十一、动态库
需求继续复杂,项目继续膨胀。有一天,正在家里准备制造小程序猿的老程序猿,突然接到主管的电话,说刚发出去的软件,把客户的电脑内存吃完了,其它软件都用不了,都嚷着要退货。在这个要钱没老婆,要老婆没钱最终也将没老婆的情况下,他们又加了一天班,发现很多软件,其实都用到了相同的逻辑代码。于是他们把相同的逻辑功能的函数放到一个文件里,其它软件需要这些功能时,就将那文件调用到内存里,运行相应的函数,不要时再把内存释放出来。这样,就省了不少内存了。
这个文件就叫动态库,只有需要的时候,才会被调用到内存中执行。