最近一直浸淫在计算机编程中无法自拔。哲学 认识论中讲过。人类的求知的过程是由两次飞跃。第一是从感性认识到理性认识;第二是从理性认识到实践。这段话对有些人是适用的。我就是其中的一名。在知乎上求助问题“学计算机要懂汇编吗?”,地下有人回复说,对有些人是必须要学会的。因为当我们满脸疑惑的问别人,别人可能会甩我们一脸“你问这个有用吗?”,可我们的脑袋上都套着一句话“你不明白这个,你怎么能看第二章呢?”,对于我来讲,知识的断层是特别影响我求知的道路。
说说我的学习路线。《VS2010轻松学习C#-从零到深入-天轰穿.NET4趣味编程视频教程》,田老师是一个嬉笑怒骂皆文章的人,是一个没有被体制内教育束缚的人。实践证明,一个人若要是想干成一件事情,循规蹈矩的路子不一定是唯一的路子。第二步,《c#高级编程》(第6版),讲得是深入的c#的基础知识。第三步,《汇编语言》(王爽 第2版)。通过视频我大概了解了什么是编程,编程到底是怎么起作用的。这是我的一个感性认识。然后我需要用专业的知识填充我的理性认识。
下面说一下 计算机的原理,这些编程语言,到底是怎么就让计算机工作了:
归根到底,计算机是怎么就能工作呢?其实这个原理的本质 和 “人 按了一下开关 灯就亮”是一样的,“人按开关”,是一个命令,开关接受到命令之后,电流接通,灯变亮了,从“0”变成了“1”。 计算机的机器指令是一列二进制数字,计算机将之转变为一系列的高低电平(高低电压),以使计算机的电子器件收到驱动,进行运算。
我们把这个过程独立出来“执行计算机指令,进行运算”,进行这个步骤的就是我们熟知的CPU,每一个种类的CPU,由于硬件的设计和内部结构的不同,就需要用不同的电平脉冲来控制,使它工作。所以每一种类的CPU都有自己的机器指令集,也就是机器语言。这样的话,编程的作用就是,用一堆的 0 1 符号控制各个“开关”,实现自己想要达到的效果。这种编程语言,就叫做机器语言。比如,让8086cpu 计算s= 768+12288-1280,机器语言是这样子的:
101100000000000000000011 000001010000000000110000 001011010000000000000101
这样子很难受了,每一个CPU都有不同的机器语言库,要自己算个东西,得把每个机器语言库的01语言代表的意思都记住。太麻烦了,不行,得想个办法。
我能不能这样,我想命令机器,把在A上存储的东西移动到B上。我就直接写 "mov a , b"?然后指定一个规则,让机器自己翻译成01语言,这样就不用记那么多的数字了。可问题又来了,如何翻译成01语言呢?
刚开始我一直在找编译器的原理,找各种编译的方法。但是不管怎么样都是一头雾水。知道天降一本神书《编码-隐匿在计算机软硬件背后的语言》解释我心中多年的困惑。上网上百度书评,基本都是好到爆。上一段的那个问题,推荐读这本书,这本书中会告诉你期盼已久的答案。