上一节课了解了图灵机,其中的“一套控制规则”就是程序,编写这套控制规则就是编程。编程所使用的一套符号系统是编程语言,即计算机程序语言。
机器语言
早期的计算机程序语言就是计算机控制指令——即图灵机的控制规则,每条指令就是一组二进制数,不同的计算机都有不同的计算机指令集——即图灵机的一套控制规则。用指令直接编写的程序就是机器语言。机器语言是计算机唯一能理解的语言,现在我们叫做可执行文件(例如Window的exe 文件)。所谓的软件破解就是直接修改可执行文件使程序跳过检查步骤;黑客也是修改可执行文件植入一段可执行代码(可能是木马、病毒、勒索程序等);杀毒软件也是扫描可执行文件,用一种独特的匹配算法找出“病毒”。早期计算机指令集是多种多样的,由电脑生产商自行决定,因此不同电脑要有不同的可执行文件。这种情况不利于计算机的推广,因此大家一起制定一套公用的指令集——即架构,例如x86_64架构。
汇编语言
使用二进制指令集开发程序是件非常繁琐的事,除非把大量的二进制数指令都记住,否则开发起来非常慢。为了提供编程效率,人们用一套字母组合代替二进制数的指令集,这种以字符串关键字代替二进制机器码的编程语言称为汇编语言。小改革大作用,因为同样的字符串关键字可以以不同的二进制机器码关联,所以不同的指令集,它的同一个程序的汇编程序相差不大,一种计算机的汇编语言程序,只要稍作改动就可以用于其他计算机,也就是说汇编语言开始,程序开始有了移植性。由于汇编语言只是指令集的映射,所以汇编语言被称为是低级语言。
高级语言
虽然汇编语言比机器码容易记忆,但仍然具有可读性差的缺点,大量的跳转指令和地址值很难让程序员在很短的时间理解程序的意思。寻求一种人类容易理解的语言计算机语言迫在眉睫。这种编程语言就是高级语言。
第一个高级语言是美国尤尼法克公司在1952年研制成功的Short Code。第一个被广泛使用的高级语言是FORTRAN,它是由美国科学家巴克斯设计并在IBM公司的计算机上实现的,与ALGOL60语言一样主要应用于科学和工程计算。FORTRAN语言有强大的生命力,目前还是工程计算的首选语言。
随后出现了Pascal和C语言,Pascal易于理解但功能比不上C语言。因此Pascal成了教学的首选语言,C语言则用于开发软件。虽然Pascal现在还有使用,不过越来越少了。
C语言不是从汇编语言而来,它是在其他语言基础上发展起来的。首先是Richard Martin开发一种高级语言BCPL,随后Ken Thompson简化BCPL语言,成为一门新的语言——B语言,最后Dennis Ritchie丰富了B语言,并将它命名为C语言。寓意很简单,因为字母C是字母B的下一个字母,示意语言的沿革。C语言目前还是被广泛使用的语言,是设备驱动和嵌入式系统的首选编程语言。
面向对象编程(OOP,Object Oriented Programming)
先举个例子,一个老师一对一教五个学生。开始是完一个再教下一个,因此这个老师只要重复他的教学过程,而无需注意那个学生。后来,他觉得在学生做练习时,他在等待比较浪费时间,就把学生集合在一起教学,这样他在一个学生做练习时教别的学生。这时他不但要考虑教学过程,也要记住每个学生的所处的学习状态。也就是说,在整个教学活动中老师不但要搞好教学流程,也要记住每个学生。每个学生对于整个教学活动是一个对象,老师要规划好整个教学活动就相当于“面向对象编程”了。其实,对象并不是学生本身,而是学生在整个活动程序中的映射。原来一个接一个教时,老师教一个学生只是一个过程,这个教学活动是5个过程构成;后来是1个过程和5个对象。对象是可以保存自己的运行状态的。
1967 年,挪威计算中心的克利斯登·奈加特与奥利-约翰·达尔开发了 SIMULA-I 和 SIMULA-67。SIMULA 被认为是世界上最早的面向对象编程的程序设计语言。SIMULA 首次引入了面向对象程序设计语言的基本概念:对象、类、继承、virtual quantities、多线程(准并行的)的程序执行。SIMULA 不仅引入了“类”的概念,还应用了实例这一思想——这可能是这些概念的最早应用。它具有很高的灵性,但无法胜任比较大型的程序。
20 世纪 60 年代后期是计算机历史承上启下的重要时期。这一时期有三种重要的语言问世,即 SIMULA-67、由一批顶尖计算机科学家共同设计的Algol68、以及为 IBM 360 系列机配套开发的 PL/I。这三种语言虽均有所创新,但 SIMULA-67 的面向对象概念的影响是最巨大而深远的。到了 20 世纪 70 年代,结构化程序设计语言(即本文的高级语言)和结构化分析与设计已无法满足计算机逐渐扩大的应用领域(例如家用电脑),于是面向对象技术(OOP)应运而生,SIMULA 语言便是 OOP 的始祖。
Smalltalk是在SIMULA基础上发展起来的语言,被公认为历史上第二个面向对象的程序设计语言,和第一个真正的集成开发环境(IDE)。Smalltalk由艾伦·凯,Dan Ingalls,Ted Kaehler,Adele Goldberg等于70年代初在Xerox PARC开发的。它把面向对象编程思想发挥得淋漓尽致,是第一套真正意义的面向对象编程语言。美国麻省理工大学著名的Scratch项目就是采用Smalltalk开发的。
集大成者C++语言,从命名上看出它是从C语言发展过来的。Stroustrup把SIMULA的类概念引入在C语言中,并把这个改造过的C语言命名为C with Class。到1983年12月由Rick Mascitti建议改名为CPlusPlus,即C++。
C++从SIMULA继承了类的概念,从Algol68继承了运算符重载、引用以及在任何地方声明变量的能力,从BCPL获得了“//”注释,从Ada得到了模板、名字空间,从Ada、Clu和ML取来了异常——C++是抄袭大王。
Java是一门面向对象的编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。
Python的创始人为荷兰人吉多·范罗苏姆(Guido van Rossum)。1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,作为ABC语言的一种继承。之所以选中Python作为该编程语言的名字,是取自英国20世纪70年代首播的电视喜剧《蒙提·派森的飞行马戏团》(Monty Python's Flying Circus)中的地名,然而Python有另外的意思——大蟒蛇。
ABC是由Guido参加设计的一种教学语言。就Guido本人看来,ABC这种语言非常优美和强大,是专门为非专业程序员设计的。但是ABC语言并没有成功,究其原因,Guido认为是其非开放造成的。Guido决心在Python中避免这一错误。同时,他还想实现在ABC中闪现过但未曾实现的东西。
就这样,Python在Guido努力下诞生了。可以说,Python是从ABC发展起来,主要受到了Modula-3的影响。并且结合了Unix shell和C的习惯。
Python近年来发展很快,已基本取代Pascal成为教学语言。
练习题:把下面有关Python错误的说法修正过来:
A、Python是美国吉多·范罗苏姆(Guido van Rossum)创立的。
B、Python在1989圣诞节期间正式发布。
C、Python名字的来由是开发人Guido养了一条大蟒蛇(英文Python)。
D、Python是一种脚本解释程序,在BASIC的基础上发展起来的。
注:BASIC(Beginners' All-purpose Symbolic Instruction Code,又译培基),意思就是“初学者通用符号指令代码”,是一种设计给初学者使用的程序设计语言。BASIC是一种直译式的编程语言,在完成编写后不须经由编译及连结等手续即可执行,但如果需要单独执行时仍然需要将其建立成执行档。BASIC是由达特茅斯学院院长、匈牙利人约翰·凯梅尼(John G. Kemeny)与数学系教师托马斯·卡茨(Thomas E. Kurtz)共同研制出来的。1964年BASIC语言正式发布。第一个BASIC程序在1964年5月1日早上4时,由BASIC编译程序进行编译后成功运行 。1975年,比尔·盖茨把它移植到PC上。