在香农拿到二进制和继电器之后,计算机开始了狂奔。接下来就是我们熟悉的现代意义上的计算机发展阶段了。包括后面的互联网。并由此我们熟悉的公司或者任务开始陆续登场了。像冯诺依曼、香农、图灵、IBM、惠普、微软、苹果、比尔盖茨、乔布斯等,然后再包括后面的谷歌、雅虎、Facebook等。

    计算机科学(下)--程序设计 - 图1
    继电器
    计算机科学(下)--程序设计 - 图2
    电子管
    计算机科学(下)--程序设计 - 图3
    晶体管

    晶体管中有三个端子: •基极:它为晶体管电极提供基极。 •发射极:由此产生的电荷载流子。 •收集器:由此产生的电荷载流子。

    如果晶体管为NPN型,我们需要施加0.7v的电压来触发它,并将该电压施加到基极管的晶体管tu 正向偏置条件导通,电流开始流过集电极到发射极(也称为饱和区域)。当晶体管处于反向偏置状态或基极引脚接地或不带电压时,晶体管保持截止状态,并且不允许电流从集电极流向发射极(也称为截止区域) )。

    计算机科学(下)--程序设计 - 图4

    如果晶体管为PNP型,则通常处于ON状态,但不是可以说是完美的,直到基脚完全接地为止。将基极引脚接地后,晶体管将处于反向偏置状态或被称为导通状态。作为提供给基极引脚的电源,它停止了从集电极到发射极的电流传导,并且晶体管处于截止状态或正向偏置状态。

    计算机科学(下)--程序设计 - 图5

    为保护晶体管,我们串联了一个电阻,使用以下公式查找该电阻的值:

    R B = V BE /I B

    至此我们只需要了解晶体管它是一种电信号控制的开关器件就可以了。还记得所有的信息都是为人类服务的,要把一个信息传递或者显示出来,中间过程我们不用在意,只要两端信息是一致的就可以。比如我写一个字,另一个人当即看到立刻接收到该信息,可是如果我们相距很远,应该怎么办?飞鸽传书这里先不谈,跟当面看到的信息是一样的,只不过时间延迟而已,其实这个写的动作,也就是人类自己的语言本身就是一种约定,那么是不是可以有另外一种约定,能够远距离传输信息,于是我们在一起的时候就约定使用烽火狼烟或者灯光的快闪慢闪这样的规则。既然可以这样约定,那么电信号也是可以传输信息的,就像刚提到的灯光快闪慢闪,这就是现在光纤的原理。
    想要控制计算机,就得让机器知道并且执行我们的命令,也就是要解决人与机器交流的问题。既然要交流,语言是不可缺少的。然而作为交流的双方,人类作为语言的设计者,必须要考虑计算机能够接受和处理指令信息,同时需要具有一定的语法规则。这跟英语汉语是一样的。只不过因为计算机是在美国出现的,所以首先考虑是美国的计算机科学家自己熟悉的英语来设计规则了,至于后来为啥汉语为基础的编程语言流行不起来,那就是英语和汉语之间的语言本质差别了,这个是语言学的问题,我们不做过多讨论。感兴趣的可以自己搜一下现在还在争论的英语类和汉语类哪个才是文明的体现,哪个才流行起来更加方便。
    既然是语言,在上个章节已经讲了计算机时如何变成现在这样的,既然已经变成这样方便了,那就应该把方便智能的特点表现出来,也就是这个方便是从人类的角度来看的。已经知道机器只会直接识别机器语言,即01010001这样的二进制数据。就跟我们早期上古文明的结绳记事一样,后来随着实际的需要,以提高沟通效率,开始出现文字,彼此约定成为规则,进而形成语言,首先是象形文字,也就是看到什么就给画出来,这样约定的成本,或者叫做学习成本是最低的,所以才有了文明的发展。现在我们站在时间线的最前端回溯历史会发现,最早的文字都是象形文字,然后一步步发展到现在有汉语和英语。汉字如果还稍稍有些象形文字的影子,那么英文字母可就真的看不懂了(当然我非专业人士),但神奇的是有限的字母通过不同组合可以表达现阶段几乎(因为现在已经发现有些信息是语言表达不出来的,但又真实存在)所有信息,而逐渐脱离形象化的阶段(这也许是英文更适用于计算机吧,因为都是有限的元素作为基本来组合出复杂信息,机器是0和1,英语是a和b。)。
    我们回到机器本身,因为人类语言已经有发展演变痕迹可循,那么是不可能让机器再去经过上千年的时间演变出高级语言的,必须认为干预,再说本身机器就是人类文明的成果,是其造物者。(这里再开脑洞,如果机器—硅基生命也经过上千年的发展,那么现在会是怎样的一个样子呢?)所以必须快速进行语言升级,否则人类使用机器就会显得笨重。既然能够01010001表示信息,那么在此基础上何不加一层约定。我们设想这样一个场景,现在A要让B用机器在纸上印出来“明天早上8点,吃饭”,现在B应该怎么做,只通过敲打机器的方式。最直接的就是把这9个字符,先刻出来9个模具,然后像盖章一样印在纸上,现在升级一步,想要用按钮一键就达到目的,那么做一个连杆结构替代人的手臂,可是如果A再换个信息呢,总不能把所有汉字都刻出来吧(这里是不是想到了印刷术,包括毕昇的活字印刷),但汉字有点多了,我们用英语举例吧,26个字母随便组合,只需要刻26个模具,再包括数字和其他特殊符号共100多个(ASCII码(American Standard Code for Information Interchange),为什么是128个?因为是为了凑整为2进制的整数倍数),有了这套信息交换标准,每一个字符就都可以用二进制表达。那么就能直接英文单词控制机器了,后来把这种助记符叫做汇编语言,还是一种比较低级的编程语言,所以就有了后来的高级编程语言。这里我们简要回顾一下主要编程语言之间的关系。
    首先是出现比较早的,并且在当时最流行的语言之一BASIC语言,BASIC语言诞生于1971年,设计的主要目的是为了让计算机语言可以被非理工科的学生使用(当时工课学生使用的Fortran—诞生于1957年的第一个计算机语言,和Algol 60—诞生于1968年的升级版,这两个编程语言很难被文科生掌握)。基于Fortran IV,语法受Algol 60影响就出现了BASIC语言。
    然后是C语言,C语言是B语言的改进版本,同时又引入了Algol 68语言的特点,B语言是1970年贝尔实验室设计UNIX操作系统是所使用的编程语言,B语言是以BCPL语言为基础,而1967年出现的BCPL语言又是基于1962年的CPL语言。而CPL又是基于Algol 60语言。
    接着是诞生于1983年的C++,在C语言的基础上以SIMUAL 67的方式对命令式编程的面向对象扩展。而SIMUAL 67是面向对象的起源语言,诞生于1964年,同时也是对Algol 60的扩展。因为对C语言的完全兼容,ASNI在1989年的标准化版本C 89中合并了两种语言,叫做C/C++。由于C/C++吸收了太多语言特性,使得C/C++成为最难精通的语言,没有之一。但它又是目前使用人数最多的语言。
    另一个是对C进行面向对象扩展的语言诞生于1983年的Objective-C,后来其被苹果公司选中,和C++相似,也是对C的面向对象的扩展。所不同的是C++是以SIMUAL 67的面向对象为基础,Objective-C是以Smalltalk的面向对象基础。而Smalltalk又是对SIMUAL 67的另一个方向扩展,完善并定义了消息发送和对象的继承关系。Objective-C随着苹果公司的发展而被广泛使用。
    下一个就是大名鼎鼎的Java了,其诞生于1995年,是第一个运行在虚拟机上的语言,在这之前的计算机语言要么有解释器执行源代码,要么将源代码编译连接成实际的计算机指令后再由计算机执行,前者叫做动态语言,后者叫做静态语言。Java运行于JM(Java虚拟机)上,JM和解释器的区别是:JM会将Java源代码编译成字节码,然后再由JM解释执行。由于编译和执行过程是交错的,所以从外部看来就像是JM直接直接执行Java源代码一样。
    但请注意Java1.0版本是C++的简化版本,即保留一小部分删掉一大部分功能。C/C++的竞争对手是Java,Java的竞争对手是C#。
    再接着是1989年,也是我们这次的主角Python了,它是一种面向对象的解释型脚本语言,python之前已经出现了脚本语言perl,perl和python都是保留了面向过程的特性。后来1996年基于对perl和python的不满而再出现一个叫做Ruby的纯面向对象的解释型脚本语言,而Ruby基本等于Smalltalk和Lisp的结合,Lisp是1958年出现的,是函数式编程的鼻祖。与之对应的是命令式编程。
    然后是诞生于1994年的Web服务器脚本语言PHP,和1995年的浏览器脚本语言JavaScript,能够嵌入进HTML中,只不过Javascript跟Java一点关系都没有,只不过是为了在名字上蹭当时Java的热度。
    接下来式.NET平台的主语言C#,2000年C#和.NET开发平台同时发布,C#1.0是基于Java和C++,以Java为基础讲更多的C++加入进来,并且吸收了一些Delphi和Visual Basic的特性,Delphi是一个集成开发环境(IDE),使用的是由传统Pascal语言发展而来的Object Pascal语言。它在本质上是一个代码编辑器而不是一种语言,但是由于Delphi是几乎是市场上唯一一个使用Pascal语言的产品,因此有的时候Delphi也成为了人们称呼Object Pascal的代名词。Borland公司已经把Object Pascal语言改称为Delphi语言。而pascal语言诞生于1971年,也来自于Algol 68,它的出现取代了Fortran作为程序设计入门语言的地位。
    Visual Basic是1987年微软推出的作为Basic语言的继承者Quick Basic语言改名而来,Quick Basic是DOS下的编程语言,后来随着Windows系统的推出加入了图像化设计,所以新版改名为Visual Basic,其是第一个支持可视化界面设计的语言。2001年迁移到.NET平台,改名Visual Basic .NET。