编程语言

编程语言（programming language）是用来表达计算机程序的电脑语言。它是一套标准化的交流技巧，一种能够让程序员准确地定义计算机所需数据的语言，以向计算机发出指令并精确地定义不同情况下应当采取的行动。

最早的编程语言早在电脑发明前就已问世，当时是用来控制提花织布机及自动演奏钢琴的动作。在电脑领域已发明了上千不同的编程语言，而且每年仍有新的编程语言诞生。很多编程语言需要用指令方式说明计算的程序，而有些编程语言则属于宣告式程式设计，说明需要的结果，而不说明如何计算。

编程语言的描述一般可以分为语法 (程式语言)及语义。语法是说明编程语言中，哪些符号或文字的组合方式是正确的，语义则是对于编程的解释。有些语言是用规格文件定义，例如C语言的规格文件也是ISO标准中一部分，2011年后的版本为ISO/IEC 9899:2017，而其他语言（例如Ada或者Perl）有一份编程语言实现文件，视为参考实现。

## 概论

编程语言原本设计是专用于计算机，也用来定义算法或者数据结构。故而程序员试图使程序代码容易阅读。

<image>

编程语言往往使程序员能够比使用机器语言更准确地表达他们所想表达的目的。对那些从事计算机科学的人来说，懂得程序设计语言是十分重要的，因为在当今所有的计算都需要程序设计语言才能完成。

之所以有那么多种不同的编程语言存在的原因是，编写程序的初衷其实也各不相同；新手与老手之间技术的差距非常小，而且有许多语言对新手来说太容易学；还有，不同程序之间的运行成本（runtime cost）各不相同。

有许多用于特殊用途的语言，只在特殊情况下使用。例如，PHP专门用来显示网页；Perl适合文本处理；C语言被广泛用于操作系统和编译器的开发（所谓的系统编程）。

高级语言的出现使得计算机程序设计语言不再过度地依赖某种特定的机器或环境。这是因为高级语言在不同的平台上会被编译成不同的机器语言，而不是直接被机器执行。最早出现的编程语言FORTRAN的一个主要目标，就是实现平台独立。

虽然大多数的语言既可被编译又可被解译，但大多数仅在一种情况下能够良好运行。在一些编程系统中，程序要经过几个阶段的编译，一般而言，后阶段的编译往往更接近机器语言。这种常用的使用技巧最早在1960年代末用于BCPL，编译程序先编译一个叫做“0代码”的转换程序（representation），然后再使用虚拟器转换到可以运行于机器上的真实代码。这种成功的技巧之后又用于Pascal和P-code，以及Smalltalk和二进制码，在很多时候，中间过渡的代码往往是解译，而不是编译的。

如果所使用的翻译的机制是将所要翻译的程序代码作为一个整体翻译，并之后运行内部格式，那么这个翻译过程就被称为编译。因此，一个编译器是一个将人可阅读的程序文本（叫做源代码）作为输入的数据，然后输出可执行文件（object code）。所输出的可执行文件可以是机器语言，由计算机的中央处理器直接运行，或者是某种模拟器的二进制代码。

如果程序代码是在运行时才即时翻译，那么这种翻译机制就被称作直译。经直译的程序运行速度往往比编译的程序慢，但往往更具灵活性，因为它们能够与执行环境互相作用。

## 特点

每一种程序设计语言可以被看作是一套包含语法、词汇和含义的正式规范。

这些规范通常包括：

- 数据和数据结构
- 指令及流程控制
- 引用机制和重用
- 设计哲学

程式语言不成文规定：

- 标识符（Identifier）命名常规

大多数被广泛使用或经久不衰的程式语言，拥有负责标准化的组织，经常会晤来创造及发布该程式语言的正式定义，并讨论扩展或贯彻现有的定义。

### 数据和数据结构

现代计算机内部的数据都只以二元方式储存，即开-关模式（on-off）。现实世界中代表信息的各种数据，例如名字、银行账号、度量以及同样低端的二元数据，都经由程序设计语言整理，成为高阶的概念。

一个程序中专门处理数据的那个系统被称为程序语言的类型系统（type system）；对类型系统的研究和设计被称为类型理论（type theory）。语言可以被分为静态类型系统（statically typed systems），例如C++和Java，和动态类型系统（dynamically typed systems），例如Lisp，JavaScript，Tcl和Prolog。前者可被进一步分为包含宣告类型（manifest type）的语言，即每一个变量和函数的类型都清楚地宣告，或type-inferred语言（例如MUMPS，ML）。

大多数语言还能够在内置的类型基础上组合出复杂的数据结构类型（使用数组，列表，堆栈，文件等等）。面向对象语言（Object Oriented Language，又译作“物件引导语言”、“面向对象编程语言”）允许程序员定义新的数据类型，即对象（objects），以及运行于该对象的函数（functions）和方法（methods）。

除了何时以及如何确定表达式和类型的联系，另外一个重要的问题就是语言到底定义了哪些类型，以及允许哪些类型作为表达式的值。诸如C编程语言之类的底层语言允许程序命名内存位置、内存区域以及编译时的常量；ANSI C甚至允许表达式返回结构值（struct values）。功能性的语言一般允许变量直接使用运行时计算出的值，而不是指出该值可能储存的内存地址。

常见的数据结构：

- 数组
- 记录
- 链表
- 堆栈
- 队列
- 树
- 图
- 堆
- 散列

### 指令及流程控制

一旦数据被确定，机器必须被告知如何对这些数据进行处理。较简单的指令可以使用关键字或定义好的语法结构来完成。不同的程序语言利用序列系统来取得或组合这些语句。除此之外，一个程序语言中的其他指令也可以用来控制处理的过程（例如分支、循环等）。

### 参照机制和重用

参照的中心思想是必须有一种间接设计储存空间的方法。最常见的方法是通过命名变量。根据不同的语言，进一步的引用可以包括指向其他储存空间的指针。还有一种类似的方法就是命名一组指令。大多数程序设计语言使用宏调用、过程调用或函数调用。使用这些代替的名字能让程序更灵活，并更具重用性。

## 功能

编程语言可借助机械、电机、电子、电脑、手机完成人类需求的计算、功能与目的。

### 实体的传输连结

透过低阶程式语言或高阶程式语言，将实体间接达成传输连结或控制实体。

### 应用程式的发展

高阶编程语言可发展多功能的应用程序软件，例如工程计算、操作系统、文件处理、播放软件、网页设计、手机应用程式(App)等。

## 使用

编程语言已超过上千种，大部分用在计算领域。程式语言和人类使用的自然语言在精确度和完整性上有很大的差异。

人们在用自然语言沟通时，内容可以不明确，甚至小的错误，而听的人仍然可能理解说的人想要说的内容。但电脑不同，电脑“只做被告知要做的事”，无法理解程式设计者想要写的程式。语言的定义、编程以及编程输入的组合需完整定义程式执行时的外部特性。另一方面，算法的概念可以表示为虚拟码抑或者为编成码，是交织有自然语言和程式码的程式语言，和其他人沟通时使用，此时就不一定要那么精确。

程式语言提供定义片段资料的结构化机制，以及在资料中需自动进行的运算或是转换。程式设计者利用程式语言提供的抽象化来表示计算的相关概念，这些概念则是由许多最简单元素（称为语言基元）的集合所组成。程序设计就是指利用语言基元来撰写新的程式，或是将旧程式改写，配合新的应用或是新的环境。

计算机程序语言可能是以批处理任务的方式执行，中间不需和使用者互动，也有可能是由用户在直译器中指定执行特定的程式。若某一程式语言的是目的是在某一应用软件（如Unix shell）或其他命令列界面执行其他程式，此程式语言会称为脚本语言。

### 衡量各编程语言的使用量

很难去比较哪一种程式语言的使用量最大，而且“使用量”一词也很难定义。某一种程式语言可能需要较多的时间进行开发，另一种程式语言可能产生的程式码较长，第三种程式语言可能在CPU中执行的时间较长。有些语言在特定的领域十分受欢迎，例如COBOL在公司的资料中心仍相当常用，多半是在大型计算机上执行，Fortran常用在科学及工程应用，C语言常用在嵌入式设备应用及操作系统，Perl常用于系统管理和文本处理，JavaScript用于网页等。

有许多不同的测量程式语言使用的程度的方法，不同的测量方式各有误差：

- 计算征才广告中提到各程式语言的次数。
- 计算教授或描述各程式语言书籍卖出的数量。
- 占计各程式语言目前仍在使用程式码的长度，不过可能会低估一些公开搜寻不容易找到的程式语言。
- 利用搜索引擎计算找到不同程式语言的次数。

根据TIOBE指数在2022年3月，十大最受欢迎的语言如下：Python、Visual Basic .NET、C、C++、C#、Java、JavaScript、PHP、汇编语言及SQL.。

## 历史

1940年代当计算机刚刚问世的时候，程序员必须手动控制计算机。当时的计算机十分昂贵，唯一想到利用程序设计语言来解决问题的人是德国工程师康拉德·楚泽。

几十年后，计算机的价格大幅度下跌，而计算机程序也越来越复杂。也就是说，开发时间已经远比运行时间宝贵。

于是，新的集成、可视的开发环境越来越流行。它们减少了所付出的时间、金钱（以及脑细胞）。只要轻敲几个键，一整段代码就可以使用了。这也得益于可以重用的程序代码库。

## 参见

- 程式语言列表
- 编译器、直译器
- Hello World程序
- 脚本语言
- 程序设计
- 计算机科学、基本的电脑科学主题列表
- 教育程式语言
- 文学编程
- 程式语言理论
- 伪代码
- 软件工程、软件工程主题列表

## 外部链接

- Computers/Programming/Languages
- World/Chinese_Traditional/电脑/程式设计/语言
- Syntax Patterns for Various Languages