跳转至

008-计算机语言发展史

计算机语言的发展历史大致可以分为五个世代:

第一代语言:20世纪50年代中期以前,人们使用的是机器语言,也就是通常所说的第一代语言。机器语言将计算机指令中的操作码和操作数均以二进制代码表示,是计算机能直接识别和执行的语言。

第二代语言:从20世纪50年代中期开始使用第二代计算机语言,是符号汇编语言。汇编语言是用助记符号来表示机器指令的符号指令的符号语言,优点是比机器语言易记,缺点同机器上运行,程序简短易读,便于维护。

第三代语言:人们从20世纪60年代开始使用第三代语言。这类语言通常称为高级语言。因为,前两代语言与人们思维和表达问题解法的形式相差甚远,使用十分不方便,于是人们设计出了与人思维和表达问题解法的形式相近的编程语言——高级语言。高级语言是被高度封装了的编程语言,它以人类的日常语言为基础,使用一般人易于接受的文字来表示,使得程序员编写程序更容易,可读性更高。

第四代语言:使用第四代语言构造应用系统时,生产率有显著提高;使用第四代语言完成同样的作业所需代码行数,远较使用第三代语言时要少。因此,第四代语言又称为面向问题的语言和高生产率语言。

第五代语言:为人工智能领域应用而设计的语言,可以称为第五代计算机语言又称为。它主要使用在人工智能领域,帮助人们编写推理、演绎程序。

第一代:机器语言

机器语言是用二进制代码表示的计算机能直接识别和执行的一种机器指令的集合。它是计算机的设计者通过计算机的硬件结构赋予计算机的操作功能,每种处理器都有自已专用的机器指令集合,不同型号的计算机其机器语言是不相通的。

在设计计算机中央处理器时,设计师需要列出所有的机器指令,给每个指令分配一个二进制代码,然后设计硬件来完成该指令的功能 。

通用电子数字计算机刚开始发明的时候,人们只能直接用这些计算机能够直接运行的进制代码编写程序,所以称这些二进制代码为机器语言。使用机器语言编写程序是非常繁琐的,程序员必须记住每组二进制数对应的是什么指令 。

每条机器语言指令只能执行一个非常小的任务。指令的基本格式包括:操作码、寄存器和地址码,其中操作码指明了指令的操作性质及功能,寄存器是临时存放数据的电子器件,地址码则给出了操作数或操作数的地址

第二代:汇编语言

为了克服机器语言的缺点,人们将机器指令的代码用英文助记符来表示,代替机器语言中的指令和数据。例如用ADD表示加、SUB表示减、JMP表示程序跳转等,这种指令助记符号的语言就是汇编语言,又称符号语言。

例如,上述计算A=15+10的汇编语言程序如下:

Text Only
1
2
3
MoV A,15:把15放入累加器A中
ADD A,10:10与累加器A中的值相加,结果仍放入A中
HLT:结束,停机

由此可见,汇编语言在一定程度上克服了机器语言难读难改的缺点,同时保持了其编程质量高、占存储空间少、执行速度快的优点。故在程序设计中,对实时性要求较高的地方如过程控制等,仍经常采用汇编语言。

但汇编语言面向机器,使用汇编语言编程需要直接安排存储,规定寄存器和运算器的动作次序,还必须知道计算机对数据约定的表示(定点、浮点、双精度)等。这对大多数人员来说都不是一件简单的事情。

此外,该语言还依赖于具体型号的机器,不同的计算机在指令长度、寻址方式、寄存器数目、指令表示等方面都不一样,这样使得汇编程序不仅通用性较差,而且可读性也差 。

用汇编语言编写的程序,必须翻译成计算机所能识别的机器语言后,才能被计算机执行。

第三代:高级语言

高级语言(High-level Programming Language)是高度封装了的编程语言。它是以人类的日常语言为基础的一种编程语言,使用一般人易于接受的文字来表示,使程序员编写程序更容易,亦有较高的可读性,以方便对计算机认知较浅的人亦可以大概明白其内容。

由于早期计算机产业的发展主要在美国,因此一般的高级语言都以英语为蓝本 。

高级语言并不是特指的某一种具体的语言,而是包括很多编程语言,如流行的Java、C、C++、C#、Pascal、Python、BASIC等 。

高级语言与计算机的硬件结构及指令系统无关,它有更强的表达能力,可方便地表示数据的运算和程序的控制结构,能更好地描述各种算法,而且容易学习掌握

第四代:面向问题的语言

第三代语言是很有使用价值的,但是在编程上需要专门的训练。

面向问题的语言也叫第四代计算机编程语言,它是非常高级的计算机语言,用户只需要简单的培训即可编程。和解决一般问题的语言不一样,面向问题的语言主要解决特定的问题。

第三代语言的核心是过程以及一个程序是怎样完成一个特定任务的,而第四代语言是非过程化的,它关心的是说明程序要完成的是什么任务。

第四代语言比第三代语言更接近英语,更容易编程,更广泛地被非专业程序员所使用。一些第四代语言已经有了很具体的应用。比如数据库管理系统中的查询语言

4GL是按计算机科学理论指导设计出来的结构化语言,如ADA,MODULA-2,SMALLTALK-80等。

第五代:自然语言

尽管计算机语言经历了几代的发展,已经变得很像人类语言,但是,第四代语言离英语西班牙语这些人类使用的自然语言还有一段很长的距离。

第五代语言的标准定义是:合成了人工智能,允许直接的人类交流,另外,这些语言可以让计算机像人一样学习和处理新的信息,而不再像以前那样键入特定的命令来编码,我们可以使用英语或西班牙语这样的自然语言或人类语言更加直接地与计算机交流。下面这句自然语言的陈述可能出现在第五代语言的医疗程序中 。

如果病人感到头晕,那么就测量体温和血压 。

最近,第五代语言的定义已经延伸,它还包括可视化编程语言。可视化编程语言提供了一个自然的可视化编程界面。这个界面提供了直观的图标,菜单和绘制工具,可以用来创建程序代码。遵循这个定义,微软公司的可视化 BASIC语言就是第五代编程语言

计算机语言发展时间轴

1940年前-机器语言时代

最早出现的是机器语言。

机器语言,第一代计算机语言

计算机可以处理二进制,而二进制才是处理器的“母语”,这叫做机器语言或者机器码。

在计算机早期阶段,必须使用机器码来写程序。具体过程是这样的:

  • 先在纸上用英文写一个高层次版本,这种对程序的高层次描述,被叫做伪代码;
  • 用操作码表,将伪代码转成计算机可以理解的二进制的机器码;
  • 翻译完成后,就可以把生成的这些机器码喂进计算机运行。

我们需要知道所有的机器指令,且记住所有机器指令对应的二进制代码,才能设计好程序。这个过程是很繁琐的。而且每条机器语言指令只能执行一个非常小的任务,要想执行一个大的任务的话,代码量是无法想象的。

早期的程序设计均使用机器语言,程序员们将用0, 1数字编成的程序代码打在纸带或卡片上,1打孔,0不打孔,再将程序通过纸带机或卡片机输入计算机,进行运算。

Text Only
//指令部分范例
0000 //代表加载(LOAD)
0001 //代表储存(SET)
...
//暂存器部分范例
0000 //代表暂存器A
0001 //代表暂存器B
...
//内存部分范例
000000000000 //代表位址为0的内存
000000000001 //代表位址为1的内存
000000001000 //代表位址为16的内存
...
//集成范例
0000, 0000, 000000001000 //代表LOAD A, 16
0000, 0001, 000000000001 //代表LOAD B, 1

1940年后-汇编语言时代

汇编语言(Assembly Language),第二代计算机语言

靠机器语言实在是太麻烦了,所以在1940年-1950年,开发者们开发了汇编语言,它使用了大量的助记符来代替二进制指令

例如用ADD表示加、SUB表示减、JMP表示程序跳转等,这种指令助记符号的语言就是汇编语言,又称符号语言。

Text Only
mov eax, 3 //将3存入EAX寄存器(3是一个立即数)。
mov bx, ax //将AX的值存入到BX寄存器。

//ADD指令用来进行整形数据的相加。
add eax, 4 //eax = eax + 4
add al, ah //al = al + ah

//SUB指令用来进行整形数据的相减。
sub bx, 10 //bx = bx - 10
sub ebx, edi //ebx = ebx - edi

//INC和DEC指令将值加1或减1。因为1是一个暗指的操作数,INC和DEC的机器代码比等价的ADD和SUB指令要少。
inc ecx //ecx++
dec dl //dl--

例如,计算A=15+10的汇编语言程序如下:

Text Only
1
2
3
MoV A,15:把15放入累加器A中 
ADD A,10:10与累加器A中的值相加,结果仍放入A中 
HLT:结束,停机 

汇编语言将开发者从那些繁琐晦涩且难记的二进制指令中解脱了出来,一定程度上解决了机器语言难读难改的缺点。

计算机并不认识助记符,它只认识二进制码,所以先辈们开发了“汇编器”,用来将文字指令转换成二进制机器码。这样子,程序员可以专心文字编程,而不用管底层细节。

直到现在,汇编语言仍然在编程语言市场上占有一席之地,只不过这个席越来越小了。如操作工业机器人、单片机编程和某些计算机病毒的编写等。

1950年-高级语言的初生

高级语言,第三代计算机语言

也是目前市场的主流语言。

高级语言,是被高度封装了的编程语言。它以人类的日常语言为基础,使用一般人易于接受的文字来表示,使得程序员编写程序更容易,可读性更高。

当然,由于早期计算机产业的发展主要在美国,因此一般的高级语言都以英语为蓝本。

早期

Fortran (1955),名称取自"FORmula TRANslator"(公式翻译器),由美国计算机科学家约翰·巴科斯等人所发明;是世界上第一个被正式采用并流传至今的高级编程语言。从1956年正式使用,直到2022年已有66年历史,且经久不衰,至今仍是数值计算领域所使用的的主要语言。

同期被提出的还有:

  • LISP,名称取自"LISt Processor"(枚举处理器),由约翰·麦卡锡等人所发明;
  • COBOL,名称取自"COmmon Business Oriented Language"(通用商业导向语言),由被葛丽丝·霍普深刻影响的Short Range Committee所发明。

1967-1978年

1967-1978年,确立了编程语言的基础范型。

大多数现在所使用的主要语言范型,都是在这段期间中发明的。

  • simula:于1960年代晚期由奈加特与Dahl以Algol 60超集合的方式发展,同时也是第一个设计支持面向对象进行开发的编程语言;
  • C:于1969至1973年间由贝尔实验室的研究人员丹尼斯·里奇与肯·汤普逊所开发,是一种早期的系统程序设计语言;
  • Smalltalk,于1970年代中期所开发,是一个完全从零开始(ground-up)设计的面向对象编程语言。
  • Pascal,于1970年提出,是第一个结构化编程语言,具有丰富的数据类型和简介灵活的操作语句,采用子程序、程序码区块、各种循环结构等,代替传统的goto。是高级语言发展历程中的一个重要的里程碑。
  • Prolog,于1972年由Colmerauer、Roussel,以及Kowalski所设计,是第一个逻辑程序语言;
  • ML,于1973年由罗宾·米尔纳所发明,是一个基于Lisp所建构的多态(polymorphic)类型系统,同时也是静态类型函数编程语言的先驱;

这些编程语言,各自演变出了自己的家族分支,现今大多数现代编程语言,都可以追溯它们中的一个或者多个作为祖先

C语言的诞生历程:

  • 1963年,英国剑桥大学基于ALGOL 60推出了CPL(Combined Programming Langurage)语言;
  • 1967年,英国剑桥大学的 Matin Richards对CPL语言做了简化,推出了 BCPL (the Basic Combined Programming Language)语言;
  • 1969年,美国贝尔实验室的肯·汤普森(Kenneth Lane Thompson),以BCPL语言为基础,又作了进一步的简化,设计出了很简单而且很接近硬件的B语言(取BCPL的首字母),并且用B语言写了初版UNIX操作系统(又叫UNICS);
  • 1972年,美国贝尔实验室的丹尼斯·里奇(D.M.Ritchie )在B语言的基础上最终设计出了一种新的语言,他取了BCPL的第二个字母作为这种语言的名字,这就是C语言。1973年初,C语言的主体完成。汤普森和里奇迫不及待地开始用它完全重写了UNIX操作系统

1980年代

1980年代,各大始祖级别编程语言开始壮大自身,愈发成熟。同时也提出了很多新的编程语言。

比如说,

  • C++合并了面向对象以及系统程序设计。
  • 美国政府标准化一种名为Ada的系统编程语言并提供给国防承包商使用;
  • 日本以及其他地方运用了大量的资金对采用逻辑编程语言结构的第五代语言进行研究;
  • 函数编程语言社区则把焦点转移到标准化ML及Lisp身上

总的来说,这一阶段,大家的活动都不是开发新的范型,而是将上个时代的构想进一步发展壮大。

不过,这个阶段,在语言设计上有个重大的新趋势,就是研究运用模块或大型组织化的程序单元来进行大型系统的开发。

在这段期间被开发出来的重要语言包括有:

  • 1980 - Ada
  • 1980 - R语言
  • 1983 - C++
  • 1984 - Common Lisp
  • 1984 - MATLAB
  • 1985 - Eiffel
  • 1986 - Erlang
  • 1987 - Perl
  • 1988 - Tcl
  • 1989 - FL (Backus)

1990年代

90年代,整体来说,同样没有什么大的范式创新,基本是以前构想的组合或者优化。这段时间考虑的主要是如何提升程序员的生产力。这一阶段,许多"快速应用程序开发" (RAD) 语言也应运而生,这些语言大多都有相应的集成开发环境、垃圾回收等机制,且大多是先前语言的派生语言。这类型的语言也大多是面向对象的编程语言。

在这一阶段被开发出来的重要语言包括:

  • 1990 - Haskell
  • 1991 - Python
  • 1991 - 微软提出了Visual Basic
  • 1993 - Ruby
  • 1993 - Lua
  • 1994 - CLOS (part of ANSI Common Lisp)
  • 1995 - Java
  • 1995 - Delphi (Object Pascal)
  • 1995 - JavaScript
  • 1995 - PHP
  • 1997 - REBOL
  • 1999 - D

1995年,Netscape公司的Brendan Eich,在网景导航者浏览器上研发出了JavaScript。最开始取名LiveScript,因为Netscape与Sun合作,Netscape管理层希望它外观看起来像Java,因此取名为JavaScript。但其实js跟java一点儿关系没有。

2000年-新时代

2000年后,编程语言持续进一步发展,趋势也有很多,比如说更重视分布式及移动式应用等。

这段时间被开发出来的重要语言有:

  • 2001 - C#
  • 2001 - Visual Basic .NET
  • 2002 - F#
  • 2003 - Scala
  • 2003 - Factor
  • 2006 - Windows PowerShell
  • 2007 - Clojure
  • 2009 - Go
  • 2011 - Kotlin
  • 2014 - Swift