在很多人眼中,电脑是一个很厉害的存在:它可以帮你统计大量的数字,可以给你提供大量的信息,可以把遥远距离的信息展现在你的面前,可以做各种人类无法做到的事情。
很聪明很神奇对不对!~才怪啦!
在你面前的这个电脑,在拥有软件之前,就只是一堆电路板混合物。但是它有个很重要的特点:它拥有记录信息以及操控信息的能力。想象一下,电脑就像一个富豪家出生的孩子,身边是各种跑车游艇直升机。但是它什么都不懂,这些东西对它来说就一点用都没有。人类中的程序员,便是教会它知识的人,教会这个富二代怎么一步一步启动它的跑车:插钥匙,开引擎,挂档踩油门,呼!~
电脑是个听话的学生,它可以把学到的知识记得很牢,所作所为都是所学到的知识的反映。所以说,你面对的不是一台单纯的电脑,里面保存着数不尽的人类的思想,你所遇到的,都是人类思想的映射。信息保存在硬盘里,嗯,你可以拆开硬盘看看人类的思想长什么样。(骗你的。)
在现实生活中,人类用语言表达自己的思想,不同国家地区的人使用不同的语言。为了方便不同语言的人的交流,我们使用一些国际通用的语言,比如说英语。一个意大利人可以用英语跟日本人交谈,当他们这么做的时候,实际上是
1. 意大利人把自己的想法翻译成英语,
2. 日本人听到英语,把这段信息翻译成日语并加以理解。
人类跟电脑的交谈也是差不多一样的方式,可能比较复杂点。
初中或者高中的计算机课,希望你们在联机打游戏刷网站发呆之余,还能记得老师讲过,电脑的信息是二进制存储的。也就是说,电脑只认得“10101001010101001”这样的语言。所以程序员与电脑的对话类似于下图:
注:这幅图中间的“云朵”,其实包括了很多“层次”在里面。
在最开始的时候,那时候的程序员还被叫做计算机科学家(大概吧),他们是“直接”跟计算机进行对话的。嗯,你没有看错,就是直接写101100100110这样子,这便是机器语言。那时候的编程是通过在纸条上戳洞来完成的,大概是遇到0就戳一个洞吧,最终的程序的样子就是:
可想而知,写出来的东西不仅别人看不懂,他们自己其实也看不懂啦。之前说过的,程序员就是千方百计想着偷懒的人,这么难懂的机器语言当然没人想继续用。而一般来说,抓到规律的东西就可以用自动化的机制来代替人工。机器语言便是非常有规律的东西,于是科学家们在那之上,又创造了一门语言:汇编语言。有了汇编语言,科学家们就可以用比较易懂的方式来控制电脑了。比如说要电脑计算1+1,那么步骤大概是这样的(二进制数是乱写的,各位看官别当真):
在存储器上写个1 1000110010010110
在存储器上再写个 1 1101001001001010
放到加法器上加起来 1101010101101111
由于每个步骤都对应着一串固定的二进制指令,所以可以很方便地进行映射。负责这项工作的程序就叫做汇编程序。好了,有了汇编语言,科学家们就可以告诉电脑把大象放进冰箱要怎么做了,只要把步骤想好告诉电脑就行了。
但是懒惰的科学家还是觉得这不够:为什么我只是想算一算1+1等于几,但是我却需要控制电脑一步一步去完成,而且,计算1+1这个过程是固定的,为什么不继续用自动化的东西来完成?于是在汇编语言之后,科学家们有创造了一种更高级的语言,而且懒得取名了,直接称为高级语言。从此以后,科学家们只需要写“1+1” 就可以自动转变成0和1的长串,传输给电脑让它去计算了。完成这个转变过程的程序,叫做编译器。编程,也变成了难度少了很多的工作,随着计算机进入寻常百姓家,写程序的人再也不只是科学家了,专业写程序玩家,被称之为程序员。
有一个重点需要注意。机器语言是跟计算机本身相关的,汇编语言也是跟计算机的工作原理相关的,当前我们使用的电脑的基本原理跟设计都是差不多的,所以机器语言、汇编语言也是固定那样子。但是高级语言因为不用在乎具体硬件细节,可以更关注于表达思想,而人类思想百花齐放,所以高级语言也有很多种。
我在大学的时候一开始学的是一种叫C++的语言,后来转向Java。然后很多人都会说C或者C++是“面向过程”的语言,Java是“面向对象”的语言。直到毕业之后还有人问我,到底什么是“面向对象”编程。那时候我想了一下,说,其实这是一种思维方式,一种编程里面的世界观。
很高深对不对~~~
由于高级语言可以直接表达编程人员的思想,人类的思维方式千差万别,人类的世界观更是不尽相同,于是便有了各种各样形式各异的编程语言了。其目的,就是为了贴合思维方式,从而可以方便地把想法转换为代码。如果你认真学过不同的人类语言,你就会发现不同人类语言中也包含着不同文化不同国家的人的不同的思想。作为一个例子,所谓的“面向对象”编程,其思维方式就是认为问题里出现的“东西”,都可以抽象成一个一个的“对象”,通过这样的抽象,把问题简单化,模型化。相对的,另一种编程模型,“面向过程”编程,则是认为问题都可以分解为一个一个的步骤,所谓的解决问题,就是想好每个步骤按部就班地完成。
以上是我个人的理解,偏颇之处,我才不管啦!
下一节课,我们开始拿起枪,扛起炮,正式写代码!