编程语言的原理与方法 探究一些编程语言的历史以了解其关键性思想的源由

万物皆从0、1开始,电子计算机及其编程语言也是如此。是不是对一些编程语言和软件的关键性思想的源由很感兴趣?探究其历史可以获得较清晰的脉络。

我们知道,最早的编程是“开闭开关、连接电缆”的方式。冯诺依曼提出“存储程序控制”的概念后,自此开启了“程序控制计算机”的时代。CPU能够执行的一个指令集的指令是一个“01”序列,称为机器语言,用机器语言编程的程序称为机器语言程序,机器语言程序能够直接被机器执行,但难写、难读,难改。为此,人们考虑到这些“01”序列的指令和内存地址,是否可以用一些字母缩写来表示,做成一张相互对应的指令字母缩写表,这样编程不再面对“01”序列的机器指令,而是使用这样的一张指令字母缩写表,而查表、替换的工作正是程序所擅长的,于是出现了汇编语言(用字母缩写来表示机器指令和存储地址)和汇编器。更进一步的抽象,出现了高级语言和解释器、编译器,到了“程序翻译程序”的时代。

早期重要的程序设计语言的发展历程:

编程语言的原理与方法 探究一些编程语言的历史以了解其关键性思想的源由(1)

1 FORTRAN ( FORmula TRANslation ) 1958

最早的高级编程语言,专注于特定领域——科学与工程计算。其基本思想是将人类(而不是机器)熟悉的符号表示转换为高效的机器代码(机器指令)。

电子计算机的主要应用领域:a 数值计算, b 数据处理,如数据复制、存储、检索、报表打印等,c 过程控制; d 人工智能等。

以现代的观点来看,Fortran可以看作对“用代码直接描述应用领域”的首次尝试。

小实例:连续输入整数,直到输入0结束,将这些数据相加。如输入22↙33↙44↙0↙,输出结果(↙表示回车)。(其它实例相同,可以使用在线环境来调试:https://www.onlinegdb.com/)

! Fortran language integer num, sum sum = 0 10 read(5,*) num ! input if(num .eq. 0) goto 20 sum = sum num goto 10 20 write(6,*) sum ! output stop end

2 COBOL ( Common Business Oriented Language) 19世纪50年代末

也是专注于特定领域——商业数据处理。

3 LISP (LISt Porcessing) 1958

主要用于链表和符号处理,专注于人工智能领域,属于解释型的高级编程语言。在各自的应用领域中,Fortran和COBOL的设计目标都是为了解决现实世界中的问题,而List更加关注程序设计本身和程序的优雅性。函数式编程语言的思想部分源于Lisp,与基于读写内存位置的从机器出发的方式相反,函数式编程语言主张用数学方式来编写程序(纯数学没有赋值概念,甚至连操作的概念也没有,只是在一组给定条件下,“简单地”声明什么肯定是真的)。

4 Algol60 (ALGOrithmic Language) 19世纪60年代

与应用于特定领域(如科学、商业、表处理等)的理念不同,Algol的理念是“通用编程语言”。其为很多领域定下了新的标准:

Lexical scope

语法作用域

Use of grammar to define the language

使用文法定义语言

Clear separation of syntactic and semantic rules

语法和语义规则明确分离

Clear separation of language definition and implementation

语言定义和实现明确分离

Systematic use of (static, i.e., compile-time) types

系统化地使用(静态即编译时)类型;

Direct support for structured programming

直接支持结构化编程

Algol家族树:

编程语言的原理与方法 探究一些编程语言的历史以了解其关键性思想的源由(2)

Simula67和Pascal是很多(几乎是所有的)现代编程语言的祖先。

5 Pascal 1970

在Algol家族中,Algol68语言是一个巨大且雄心勃勃的项目。但因为太过复杂使它看上去“永远”也不能完成。Algol委员会的一个成员Niklaus Wirth决定设计、实现自己的简化版的Algol语言,也就是Pascal。Pascal确实简单,适合教学,也接近Fortran。

纯粹的Pascal被证明对于工业界来说太简单,太严格了。20世纪80年代,Anders Hejlsberg设计并实现了Turbo Pascal(与其它实现相比,有更加灵活的参数机制),后来又设计了类似C 的对象模型(但是仅有单一继承,并有更好的模块机制)。

Pascal家族树(简化版):

编程语言的原理与方法 探究一些编程语言的历史以了解其关键性思想的源由(3)

{Pascal language} var num,sum:Longint; begin readln(num); {input} sum := 0; while num > 0 do // loop begin sum := sum num; readln(num); end; writeln(sum); {output} end.

6 Ada 19世纪70年代

Ada语言是为美国国防部专门设计的,适合于为嵌入式系统编写可靠、可维护程序的语言。其设计目标是希望在程序设计语言中体现软件工程思想,并强调:

Data abstraction (but no inheritance until 1995)

Strong static type checking

Direct language support concurrency

7 Simula 19世纪60年代

Simula是Algol语言家族的成员,几乎就是Algol60的超集。“面向对象程序设计”的大多数思想都来自Simula:

Represent ideas as classes and class objects.

用类和类对象表示思想。

Represent hierarchical relations as class hierarchies (inheritance).

用类层次(继承)表示层次关系

因此,程序变成一组相互作用的对象,而不是单个的庞然大物。术语class和virtual function都来自于Simula。

8 C 1970年

用于编写系统软件(如编译器、解释器、操作系统)的高级语言。是一种过程式编程(以函数为主要模块)编程语言。

在1970年代,重要系统的程序设计,特别是操作系统的实现,必须使用汇编语言,但汇编程序不具备可移植性。一些个人和组织开始着手挑战这个领域,最终,C语言成为这些工作中的最成功者。

C的真正强大之处在于从语言特性到硬件设施的直接映射。创始人Dennis Ritchie曾简单地将C描述为“一种强类型、弱检查的语言”(a strongly typed, but weakly checked language)。

编程语言的原理与方法 探究一些编程语言的历史以了解其关键性思想的源由(4)

也就是说,C是一种静态(编译时)类型的系统,在程序中不按对象(a region of memory of a known type which holds a value of that type)定义的方式使用它是非法的,但C编译器因为效率的考量又不检查这种问题。

C语言的家族树结构:

编程语言的原理与方法 探究一些编程语言的历史以了解其关键性思想的源由(5)

C源于三种语言:英国的一直未完成的项目CPL;Martin Richards设计的BCPL(Basic CPL);以及由Ken Thompson设计的称为B的解释型语言。

CPL中的“C”最初始是指“Cambridge”,当帝国理工学院参与这个项目后,CPL中的“C”的含义成了“Combined”,而其主要设计者的名字其实也是以“C”开头——Christopher Strachey。

C 源于C,C 反过来又影响了C(e.g., function argument checking and consts)。

实例:

/* C language */ #include <stdio.h> main() { int num, sum; sum = 0; scanf("%d", &num); /* input */ while(num !=0) { sum = sum num; scanf("%d", &num); } printf("%d\n", sum); /* output */ }

9 C 开创于20世纪80年代

C 是一种偏向于系统的通用程序设计语言,它的特点是:

Is a better C

Supports data abstraction

Supports object-oriented programming

Supports generic programming

设计者Bjarne Stroustrup最初的设想是“支持类的C”,综合C和Simula的思想,但随着C 的实现,其越来越庞大和复杂。

/* C language */ #include <iostream> using namespace std; main() { int num, sum; sum = 0; cin >> num; /* input */ while(num !=0) // loop { sum = sum num; cin >> num; } cout << sum <<endl; /* output */ }

10 Java 20世纪90年代

Java是一门面向对象编程语言,不仅吸收了C 语言的各种优点,还摒弃了C 里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。

/* Java language */ import java.util.*; class Main { public static void main(String [] args){ int num, sum; sum = 0; Scanner keyboard = new Scanner(System.in); num = keyboard.nextInt(); /* input */ while(num != 0){ sum = sum num; num = keyboard.nextInt(); } System.out.println(sum); /* output */ } }

11 Javascript 20世纪90年代

一门嵌入HTML,由浏览器解释执行的基于原型编程、多范式的动态脚本语言,并且支持面向对象、命令式和声明式(如函数式编程)风格。

/* JavaScrip */ <script> var sum,num; sum = 0; num = parseInt(prompt("input a integer: ")) // input while(num != 0) // loop { sum = sum num num = parseInt(prompt("input a integer: ")) } alert(sum) // output </script>

12 Python 20世纪90年代初

Python是从ABC语言发展起来,主要受到了Modula-3(另一种相当优美且强大的语言,为小型团体所设计的)的影响。并且结合了Unix shell和C的习惯。

# Python language sum = 0 num = input("Enter new value, or 0 to end: ") # input while num != 0: sum = sum int(num) num = int(input("Enter new value, or 0 to end: ")) print(sum) # output

当前语言家族树:

编程语言的原理与方法 探究一些编程语言的历史以了解其关键性思想的源由(6)

附1 C#

/* C# language */ using System; class HelloWorld { static void Main() { int num, sum; sum = 0; num = Convert.ToInt32(Console.ReadLine()); // input while(num != 0){ // loop sum = sum num; num = Convert.ToInt32(Console.ReadLine()); } Console.WriteLine(sum); // output } }

附2 PHP

// PHP language <?php $sum= $num = 0; $num = intval(fgets(STDIN)); // input while( $num != 0) { // loop $sum = $sum $num ; $num = intval(fgets(STDIN)); } echo $sum; // output ?>

附3 VBA

' VBA Sub Main() Dim num%, sum% sum = 0 num = Val(InputBox("Please enter a int:")) ' input While num <> 0 ' loop sum = sum num num = Val(InputBox("Please enter a int:")) Wend Debug.Print sum ' output End Sub

附4 bat

:: bat script @echo off setlocal enabledelayedexpansion set sum=0 :begin set /p num="input a integer: " :: input if !num! == 0 goto end set /a sum = sum num goto begin :end echo %sum% pause>nul

附5 Go

/* go language */ package main import "fmt" func main() { var sum, num int sum, num = 0, 0 fmt.Scanf("%d",&num) // input for num != 0 { sum = sum num fmt.Scanf("%d",&num) } fmt.Printf("%v\n",sum) // output }

在线调试:https://www.bejson.com/runcode/golang/

附6 Ruby

# ruby language num = gets.chomp # input num = num.to_i sum = 0 while num != 0 do sum = sum num num = gets.chomp num = num.to_i end puts sum #output

附7 Perl

# Perl language $sum = 0; $num = <STDIN>; # input while( $num != 0 ){ $sum = $sum $num; $num = <STDIN>; } printf $sum; # output

附8 R

# R language data = c(22,33,44) sum = 0 for ( num in data) { sum = sum num } print(sum)

主要语言及贡献者和组织:

编程语言的原理与方法 探究一些编程语言的历史以了解其关键性思想的源由(7)

ref

1 Bjarne Stroustrup 《Programming Principles and Practice》

2 普林斯顿计算机公开课:what you need to know about computers, the internet, privacy, and security (美)布莱恩 W. 柯尼汉(Brian W. Kernighan)著

3 更多语言设计得的图片:https://www.angelfire.com/tx4/cus/people/

-End-

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页