总有人和我说计算机真神秘,程序语言很难学,各种不懂。个人感觉其实如果不是去研究那些复杂的算法,基础的程序语言还是很容易学习的。很多童鞋们在学习程序语言的时候没有搞清楚来龙去脉,只是简单死记语法,没有站在计算机的全局角度来学习计算机语言。工欲善其事,必先利其器,这里我说说自己对计算机和程序语言的粗浅理解。
计算机其实一点都不神秘,作为人类先贤的伟大发明之一,它和人其实很像。简化点说计算机和人一样,大家都有配套输入核心,中央处理核心,输出处理核心以及把这些部件链接起来的链路和让部件工作的能量 。人需要靠五官接收外界信息(输入核心),然后经过大脑加工处理(中央处理核心),通过人的行为言语表情(输出核心)给出反馈。计算机也是一样的,通过键盘,鼠标等设备接受信息(输入核心),然后经过CPU+内存(中央处理核心)按照规定的规则解析,再通过显示器或者其他设备(输出核心)给出反馈。只不过人类的五官接受信息复杂,人脑的加工处理充满变数,同一个问题在不同环境不同心情的反馈可能完全不一样,而计算机只要是相同输入则是固定反馈,除非硬件故障。人对同样的问题为啥变数无数只能问上帝:),可能来自于输入的模糊性,大脑的复杂性。计算机的世界里面则是简单的黑白分明,所有的数据不是0就是1,所以相同输入,只会有同样的结果。
PS:一台计算机不是只有CPU一个处理核心,实际上所有的计算机部件都有自己的处理核心,这也和人一样,人的五官都有自己的处理系统,只是把处理之后的信息传输给大脑。计算机每个部件的核心也是按照自己和CPU约定好的规则交流。
既然计算机只能认识0和1(二进制),那么计算机是如何理解我们的输入,又是如何进行处理,怎么给出绚丽多彩的视频显示呢?不得不说人类太聪明了,这里照搬了人与人交流的方法。想想现在碰到一个原始人,你要怎么和他交流呢?首先当然教会他语言,大家在同样的channel上才能交流。人与计算机的交流也是一样,为了两者可以沟通,必须要有一种大家都懂的中间语言。作为硬件电路的计算机,只有高低电平(0/1)的概念,是个笨学生,当然无法像原始人一样直接学习人类的语言。所以人作为比较聪明的一方,就需要帮助计算机建立自己的语言,用这种建立的语言,达到和计算机通信的目的。
PS:计算机虽然很笨,但是他很勤快,比人类计算速度快了N多倍,名副其实:计算机。计算机存在的意义是代替人类做一些靠人手很难处理过来的事情,比如复杂运算。
为计算机设计语言,其实和人类的自己用的交流语言一样,定义语法(怎么输入),定义语义(语法表达什么意思,就是说语法会怎样处理,得到什么结果)。由于计算机只能认识0和1,所以设计出来的语言自然全部都是0和1组成的,这种语言就是传说中的机器语言(全部都是0和1组成的语言)。比如说对人来说1+2=3,如何翻译成对应的机器语言呢?人们告诉CPU说如果你收到0000000000000001就代表数据1,收到0000000000000010就代表数据2,收到101010101010101010101010代表操作+,那么对于+这个语法,你要把收到的2个数据的进行合并操作,把结果3 0000000000000011作为输出。
PS:这里的指令都是乱编的,只是讲个大概,真的要实现这个对人来讲很简单的语义对计算机器件核心还有很多复杂的地方。比如既然机器语言里面所有数据都是0和1,计算机如何确定执行1+2呢,如何阶段输入1,+,2呢,数据存储在什么地方接受输入,又是从什么地方反馈输出呢?简单点说处理核心通常是有很多条线路来接受输入的,还会有辅助线路来帮忙提示输入的起始和结束。输出当然也会有很多条线路,数据是放在处理核心的寄存器里面做处理。更复杂的大家可以自己去找资料看,我这里就不误人子弟了。
既然是给计算机制定语言,问题就来了,到底是让处理核心只实现一些简单的加,移位操作就好呢,还是说让处理核心尽可能会做更多复杂的事情呢?这就是当年响当当的精简指令集和复杂指令集之争。
现在用机器语言写代码的非常非常少了。因为这种语言实在是太难记了,先贤们决定来些简化,于是乎汇编语言出现了。汇编语言使用了很多对人类来说较为可读的语法,来代替复杂的机器语言语法,比如说引入加法符号,使用10进制,其实本质上就是增加了一层汇编语言到机器语言的自动翻译功能。现在计算机核心CPU的厂商,都会在自己的CPU的文档里面给这款CPU或者这个系列的CPU定义了一套汇编语言,告诉大家要这款CPU的聪明程度。汇编语言很好,不过可以执行的命令通常都非常少,而且经常要对数据做位操作,从编码效率上来说实在是不敢恭维。在计算机硬件性能飞速发展的黄金岁月里,如此低的开发效率实在无法让人忍受。先贤们又开始想办法了,在汇编语言上面再套一层,包装更加可读,可重用,更容易编码的新语言,于是我们看到了伟大的C语言诞生了。当然还有些其他语言,在C面前大部分都被打倒了。在增加了C语言到机器语言的自动翻译之后,计算机软件开始迅速发展。很多人把C语言作为高级语言的标识,其实发展到今天,C已经被很多语言作为了底层包装,比如Java,Erlang,Perl,Python等等。
所有这些语言其实都是做一件很简单的事情,告诉大家基于我这个语言,你要和计算机交流。基本上就是你可以使用什么样的语法,然后就可以得到什么样的结果。程序是用来和计算机沟通的工具,虽然千变万化,各自程序语言层出不穷,本质上都是在做翻译,把自己的程序语言翻译成计算机能够懂的机器语言。比如说C++说要计算机在屏幕给出一条输出"hello world",那么你就要用C++编写一条语句cout<<"hello world",对于Java来说语法就是System.out.print("hello world")。所以学习程序语言,首先就是要和学习外语一样,背熟基本语法,然后把自己想计算机做的事情,按照计算机语言的语法翻译过去,就大功告成了。当然由于计算机是非常笨的,基本语法一般都不是很多,所有通常有人会把一些基本语法比如输入输出,循环,加减乘除处理的语法组合在一起,形成按一定条件输入参数就能得到某种规则的结果的可重用函数库,这些让世界变的越来越美好的东西,也是需要努力记住,这样就可以成为一个基本的码农了。要想变成更加高级的码农,涉及的东西就非常非常多了,操作系统,网络知识,数据存储知识,数据挖掘,系统安全,系统架构,系统调优,高效可重用开发,这里就不展开了。
当然由于计算机比较笨,我们简单的一条cout命令是不可能让计算机能够在屏幕上给你显示hello wold的。这后面除了其他的可重用函数库,还有一个很重要的软件在帮你做很多翻译工作——操作系统。什么是操作系统呢?计算机需要输入输出设备,需要中央处理CPU,需要内存,需要储存设备,需要电源,需要电路版把这些设备链接起来,而这些设备都各有各的核心,每种设备都有很多厂商生产,不同厂商给各自的核心定义的处理规则也不一样。人们使用计算机当然是作为一个整体,给计算机一个输入,然后期望一个输出。如果每次都要自己把所有器件整合起来,显然是很多重复劳动,而且可能为了一个简单输出就要写n多行代码。为了把计算机作为一个整体来管理使用,先贤们为计算机编写了高度可重用,可扩展的软件——操作系统。操作系统作为计算机开机之后启动的软件,管理好了计算机所有硬件资源的协作和操作,把直接的复杂硬件操作简化为一些简单的程序语言语法操作(翻译机功能,主流操作系统windows,linux,unix都是提供c语言语法操作)或者操作系统自己定义的命令行操作,代替硬件和码农交互,让码农的生活变得美好,高效起来,当然操作系统不是这么简单的翻译机功能,还有很多系统调度,系统调优等等功能。
计算机的效率是那么的高,大家都希望它可以为人类做更多的事情,可是如果人人都要去学习命令行语言才能和计算机交流那也太难为大家,而且耗时长,效果不一定好。于是乎伟大的可视化来了,包装程序语法的输入输出成图形界面,键盘,鼠标操作,计算机的使用从此迅猛普及,不懂程序语言一样可以用电脑做很多事情,PPT,上网页浏览信息,看网络电视。感谢伟大的可视化操作。
我们可以看到,计算机的发展其实是一层一层包装的发展,从简单的0/1处理的机器语言,到复杂的可视化界面操作,中间有n层自动翻译机才实现了人与计算机的简单交流。一步一个脚印,世界才会更美好,有点敏捷开发的影子,先做出核心功能,再慢慢完善。
计算机的世界千变万化,每天都有很多新东西涌现出来,要学的东西很多,但是道生一,一生二,二生三,三生万物,万变不离其宗。程序是用来和计算机沟通的语言,虽然千变万化,各自程序语言层出不穷,本质上都是在做翻译,把自己的程序语言翻译成计算机能够懂的机器语言。多去思考为什么,对于快速学习理解新东西很有帮助。