1940之前

第一个编程语言比现代的计算机还早诞生。首先,这种语言是种编码(en:code)。

于1801年发明的提花织布机(或称甲卡提花织布机,英文:en:Jacquard loom),运用打孔卡上的坑洞来代表缝纫织布机的手臂动作,以便自动化产生装饰的图案。

Ada Lovelace在1842年至1843年间花费了九个月,将意大利数学家Luigi Menabrea关于查尔斯·巴贝奇新发表机器分析机的回忆录翻译完成。她于那篇文章后面附加了一个用分析机计算伯努利数方法的细节,被部分历史学家认为是世界上第一个电脑程序。 [1]

Herman Hollerith在观察列车长对乘客票根在特定位置打洞的方式后,意识到他可以把资讯编码记载到打孔卡上,随后根据这项发现使用打孔卡来编码并纪录1890年的人口统计资料。

第一个计算机程式码是针对他们的应用面设计的。在20世纪的前十年主要是用十进制来算数,后来人们发现不只是用文字,也可以用数字来表现逻辑。举例来说,阿隆佐·邱奇曾以公式化(formulaic)的方式表达λ演算图灵机是一种纸带标记(tape-marking)机器(就像电话公司用的那种)操作方法抽象化后的集合。图灵机这种透过有限数字(finite number)呈现机器的方式,奠定了程式如同冯·诺伊曼结构计算机中的资料一样地储存的基础。但不同于λ演算,图灵机的程式码并没有办法成为高阶编程语言的基石,这是是因为它主要的用途是分析算法的复杂度

就像许多历史上的"第一次"一样,第一个现代编程语言也很难界定。最一开始是因为硬件限制而限定了语言,打孔卡允许80行(column)的长度,但某几行必须用来记录卡片的顺序。FORTRAN则纳入了一些与英文字词相同的关键字,像是"IF"、"GOTO"(原字词为go to),以及"CONTINUE"。之后采用磁鼓(magnetic drum)作为内存使用,也代表计算机程式也必须插入(interleave)到磁鼓的转动(rotation)中。和现今比较起来,这也让编程语言必须更加依赖硬件(hardware-dependent)。

对部分的人认为必须在"编程语言"的状态确立之前,根据能力(power)以及可读性(human-readability)的程度来决定历史上第一个编程语言是什么语言。提花织布机和查尔斯·巴贝奇所制作的差分机(en:Difference Engine)都具备在大量限制下,简单描述机器应执行行为的语言。也有种并非设计给人类运用的受限特定领域语言(en:domain-specific language),是将打孔卡运用到自动演奏钢琴(en:player piano)上。

1940年代

最早被确认的现代化、电力启动(electrically powered)的计算机约在1940年代被创造出来。程序员在有限的速度及内存容量限制之下,撰写人工调整(hand tuned)过的组合语言程式。而且很快就发现到使用组合语言的这种撰写方式需要花费大量的脑力(intellectual effort)而且很容易出错(error-prone)。

Konrad Zuse于1948年发表了他所设计的Plankalkül编程语言的论文[1]。但是在他有生之年却未能将该语言实作,而他原本的贡献也被其他的发展所孤立。

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

1950与1960年代

有三个现代编程语言于1950年代被设计出来,这三者所衍生的语言直到今日仍旧广泛地被采用:

另一个1950年代晚期的里程碑是由美国与欧洲计算机学者针对"算法的新语言"所组成的委员会出版的ALGOL 60报告(名称取自"ALGOrithmic Language"(算法语言))。这份报告强化了当时许多关于计算的想法,并提出了两个语言上的创新功能:

  • 巢状区块结构:可以将有意义的程式码片段群组成一个区块(block),而非转成分散且特定命名的程序。
  • 词汇范围(lexical scoping):区块可以有区块外部无法透过名称存取,属于区块本身的变数、程序以及函式。

另一个创新则是关于语言的描述方式:

  • 一种名为巴科斯-诺尔范式 (BNF)的数学化精确符号被用于描述语言的语法。之后的编程语言几乎全部都采用类似BNF的方式来描述程式语法中上下文无关的部分。

Algol 60对之后语言的设计上带来了特殊的影响,部分的语言很快的就被广泛采用。后续为了开发Algol的扩充子集合,设计了一个名为Burroughs(en:Burroughs large systems)的大型系统。

延续Algol的关键构想所产生的成果就是ALGOL 68

  • 语法跟语意变的更加正交(orthogonal),采用匿名的历程(routines),采用高阶(higher-order)功能的递回式输入(typing)系统等等。
  • 整个语言及语意的部分都透过为了描述语言而特别设计的Van Wijngaarden grammar来进行正式的定义,而不仅止于上下文无关的部分。

Algol 68一些较少被使用到的语言功能(如同步与并列区块)、语法捷径的复杂系统,以及型态自动强制转换(coercions),使得实作者兴趣缺缺,也让Algol 68获得了很难用(diffcult)的名声。尼克劳斯·维尔特就干脆离开该设计委员会,另外在开发出更简单的Pascal语言。

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

1967-1978:确立了基础范式

1960年代晚期至1970年代晚期的期间中,编程语言的发展也有了重大的成果。大多数现在所使用的主要语言范式都是在这段期间中发明的:

这些语言都各自演展出自己的家族分支,现今多数现代编程语言的祖先都可以追朔他们其中至少一个以上。

在1960年代以及1970年代中结构化程式设计的优点也带来许多的争议,特别是在程式开发的过程中完全不使用GOTO。这项争议跟语言本身的设计非常有关系:某些语言并没有包含GOTO,这也强迫程序员必须结构化地编写程式。尽管这个争议在当时吵翻了天,但几乎所有的程序员都同意就算语言本身有提供GOTO的功能,在除了少数罕见的情况下去使用GOTO是种不良的程序风格。结果是之后世代的编程语言设计者发觉到结构化编程语言的争议实在既乏味又令人眼花撩乱。

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

1980年代:增强、模组、效能

1980年代的编程语言与之前相较显得更为强大。C++合并了面向对象以及系统程式设计。美国政府标准化一种名为Ada的系统编程语言并提供给国防承包商使用。日本以及其他地方运用了大量的资金对采用逻辑编程语言结构的第五代语言进行研究。函数编程语言社群则把焦点转移到标准化ML及Lisp身上。这些活动都不是在开发新的范式,而是在将上个世代发明的构想进一步发扬光大。

然而,在语言设计上有个重大的新趋势,就是研究运用模组或大型组织化的程式单元来进行大型系统的开发。Modula、Ada,以及ML都在1980年代发展出值得注意的模组化系统。模组化系统常拘泥于采用泛型程式设计结构:泛型存在(generics being)、本质(essence),参数化模组(parameterized modules)。(参阅多型)

尽管没有出现新的主要编程语言范式,许多研究人员仍就扩充之前语言的构想并将它们运用到新的内容上。举例来说,Argus以及Emerald系统的语言配合面向对象语言运用到分散式系统上。

1980年代的编程语言实作情况也有所进展。计算机系统结构RISC的进展假定硬件应当为编译器设计,而非身为人类的组合语言程序员。借由中央处理器速度增快的帮助,编译技术也越来越积极,RISC的进展对高阶语言编译技术带来不小的关注。

语言技术持续这些发展并迈入了1990年代。

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

1990年代:互联网时代

1990年代未见到有什么重大的创新,大多都是以前构想的重组或变化。这段期间主要在推动的哲学是提升程序员的生产力。许多"快速应用程序开发" (RAD) 语言也应运而生,这些语言大多都有相应的集成开发环境垃圾回收等机制,且大多是先前语言的衍生语言。这类型的语言也大多是面向对象的编程语言,包含有Object PascalVisual Basic,以及C#Java则是更加保守的语言,也具备垃圾回收机制。与其他类似语言相比,也受到更多的观注。新的脚本语言则比RAD语言更新更好。这种语言并非直接从其他语言衍生,而且新的语法更加开放地(liberal)与功能契合。虽然脚本语言比RAD语言来的更有生产力,但大多会有因为小程式较为简单,但是大型程式则难以使用脚本语言撰写并维护的顾虑。尽管如此,脚本语言还是网络层面的应用上大放异彩。

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

现今的趋势

编程语言持续在学术及企业两个层面中发展进化,目前的一些趋势包含有:

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

编程语言发展史上的杰出人物

History of programming language的更多相关文章

  1. Questions that are independent of programming language. These questions are typically more abstract than other categories.

    Questions that are independent of programming language.  These questions are typically more abstract ...

  2. The history of programming languages.(transshipment) + Personal understanding and prediction

    To finish this week's homework that introduce the history of programming languages , I surf the inte ...

  3. iOS Swift-元组tuples(The Swift Programming Language)

    iOS Swift-元组tuples(The Swift Programming Language) 什么是元组? 元组(tuples)是把多个值组合成一个复合值,元组内的值可以使任意类型,并不要求是 ...

  4. iOS Swift-控制流(The Swift Programming Language)

    iOS Swift-控制流(The Swift Programming Language) for-in 在Swift中for循环我们可以省略传统oc笨拙的条件和循环变量的括号,但是语句体的大括号使我 ...

  5. iOS Swift-简单值(The Swift Programming Language)

    iOS Swift-简单值(The Swift Programming Language) 常量的声明:let 在不指定类型的情况下声明的类型和所初始化的类型相同. //没有指定类型,但是初始化的值为 ...

  6. Java Programming Language Enhancements

    引用:Java Programming Language Enhancements Java Programming Language Enhancements Enhancements in Jav ...

  7. The Swift Programming Language 英文原版官方文档下载

    The Swift Programming Language 英文原版官方文档下载 今天Apple公司发布了新的编程语言Swift(雨燕)将逐步代替Objective-C语言,大家肯定想学习这个语言, ...

  8. The Swift Programming Language 中文翻译版(个人翻新随时跟新)

    The Swift Programming Language --lkvt 本人在2014年6月3日(北京时间)凌晨起来通过网络观看2014年WWDC 苹果公司的发布会有iOS8以及OS X 10.1 ...

  9. [iOS翻译]《The Swift Programming Language》系列:Welcome to Swift-01

    注:CocoaChina翻译小组已着手此书及相关资料的翻译,楼主也加入了,多人协作后的完整译本将很快让大家看到. 翻译群:291864979,想加入的同学请进此群哦.(本系列不再更新,但协作翻译的进度 ...

随机推荐

  1. MongoDB: 原子性和事务

    在MongoDB中, 文档级别的的写操作是原子性的, 甚至是在对某个文档的操作中修改其多个内嵌的子文档, 也是原子性的. 在一个写操作同时修改多个文档的情况, 对其中单独的某个文档而言是原子的, 但是 ...

  2. sql server 用脚本管理作业

    转自:https://blog.csdn.net/yunye114105/article/details/6594826 摘要: 在SQL SERVER中用脚本管理作业,在绝大部分场景下,脚本都比UI ...

  3. 代码处理 iOS 的横竖屏旋转

    一.监听屏幕旋转方向 在处理iOS横竖屏时,经常会和UIDeviceOrientation.UIInterfaceOrientation和UIInterfaceOrientationMask这三个枚举 ...

  4. HDU1556:Color the ball(简单的线段树区域更新)

    http://acm.hdu.edu.cn/showproblem.php?pid=1556 Problem Description N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定 ...

  5. 使用jQuery包装节点

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  6. [golang note] 协程基础

    协程概念 √ 协程通常称为coroutine,在golang中称为goroutine. √ 协程本质上是一种用户态线程,它不需要操作系统来进行抢占式调度,在实际实现中寄存在线程之中. √ 协程系统开销 ...

  7. [环境配置] 如何为Apache绑定多IP多域名

    在Apache服务器上绑定方法比较简单,主要因为Apache是个开源独立的服务器软件,而且支持跨平台安装和配置,支持丰富的API扩展,所以很多人对Apache的好感要甚于IIS,Apache的优点就不 ...

  8. 牛客国庆集训派对Day2 Solution

    A    矩阵乘法 思路: 1° 牛客机器太快了,暴力能过. #include <bits/stdc++.h> using namespace std; #define N 5000 in ...

  9. CCPC-Wannafly Winter Camp Day2 (Div2, onsite)

    Class $A_i = a \cdot i \% n$ 有 $A_i = k \cdot gcd(a, n)$ 证明: $A_0 = 0, A_x = x \cdot a - y \cdot n$ ...

  10. .net Core 发布并布署到Iis

               配置 Program.cs代码 namespace WebApplication8 { public class Program { public static void Mai ...