编程语言简述
翻译自:http://www.cplusplus.com/info/description/
翻译日期:2020年11月12日
译者:嵇志国
前言
计算机是我们所能使用的最多才多艺的工具。它们能够执行惊人的计算功能,能够不管信息的物理位置就轻易完成信息交换,能够简化许多日常工作,能够让我们自动化许多琐碎而繁杂的流程。但是,计算机并不是像我们人一样“聪明”。必须明确无误地告诉计算机应该做什么,而且计算机的母语和我们人类所说的任何语言大不一样。因而,在人类和计算机之间存在巨大的语言鸿沟。当人们希望计算机做什么事情时讲的是自己的语言,而计算机只根据自己的母语表示的指令——机器码来做事。至今为止,计算机还不能自己想出来应该做什么,它们遵照我们所创建的“程序”行事,这些程序就是计算机能够理解和执行的一套指令。
程序和编程语言概述
为了更好地与计算机沟通,确切地告诉计算机我们想做什么,我们开发出了许多编程语言,让这一沟通过程变得更容易。
根据项目类型不同,选择语言时有多种因素需要考虑,值得注意的因素如下:
- 编译型语言、解释型语言、还是即时编译型语言
编译型语言是通过编译器翻译成目标机器的母语——机器码,编译器本身也是一个程序。这会产生非常快的代码,特别是经过编译器有效优化后,代码更快。但是,这样产生的代码不能跨操作系统移植,并且编译过程也会花费一定时间。
解释型语言是通过解释器读取并执行,解释器本身也是一个程序。虽然像解释器一样容易移植并且没有漫长的编译时间,但是解释程序通常比编译程序慢很多。
最后,即时编译型语言(或称JIT-compiled)是在程序需要运行时进行快速编译(通常稍微优化一下),在性能与可移植性之间取得平衡。
- 高级语言、还是低级语言
在这里,语言的级别是指语言在多大程度上反应底层系统。换句话说,编程语言的级别是指其与计算机的母语——机器码有多相近。级别越高,越不相近。
低级语言通常很接近机器码,因而更适合编写驱动程序或高性能程序,这些程序直接访问硬件。虽然许多语言提供低级别元素,但一般来说,这一术语特指机器码本身和汇编语言。因为低级语言遵守其访问硬件的细枝末节,所以低级语言编写的程序通常难以移植到其他平台。实际使用中,低级语言从不解释执行,因为这与其目标相悖。
高级语言更关注人类容易理解的概念,比如对象或数学函数。高级语言通常比低级语言容易理解,比低级语言花费更少的时间来编程。作为取舍,人们通常需要牺牲对结果程序所做操作的某种程度的控制。然而,我们可以将高级语言和低级语言混合使用。
- 类型系统
类型系统是指语言中不同类型的变量应该遵循的规则。某些语言(包括大部分汇编语言)没有类型概念,因此本节对它们不适用。然而,大部分语言(包括C++)有类型概念,这里的信息很重要。
○类型的强度:强类型或弱类型
强类型系统对不同类型变量的转换加以严格限制,没有类型转换语句的话不允许类型转换。理想的强类型系统会禁止无意义的隐式“转换”,例如整型转换成“Fruit”对象。弱类型系统会自动寻找让转换成功的方法。
○类型的表达:清单或推断
类型的表达是指编译器/解释器如何判断变量的类型。许多语言要求明确定义变量类型,因而依赖于一份类型清单(例如语言保留的类型关键字或自定义类型清单)。而另一些语言根据其使用的上下文推断变量的类型,属于推断类型。
○类型的检查:静态或动态
如果编程语言是静态类型检查,那么编译器/解释器在程序运行或编译前执行类型检查。如果编程语言是动态类型检查,则类型检查发生在程序运行时。
○类型安全:安全或不安全
类型安全是指编程语言在多大程度上禁止类型化变量的操作,这些操作可能导致未定义的行为或错误。类型安全语言会多做一些工作确保这类操作或转换不会发生,而类型不安全语言将安全责任推给了用户。
这些类型特性并不互相排斥,一些语言混合支持安全类型和不安全类型。
- 支持的范式
编程范式是指编程语言支持的方法学或者编程方式。这里总结常见范式:
○声明式
声明式语言更多聚焦于语言要完成的目标,而不是语言为达成目标所采用的方法。这种范式可避免必须自己编写代码所带来的不希望的副作用。
○函数式
函数式编程是声明式编程的子集,倾向于采用数学函数或方程来表达问题。它特意避免了在命令式语言中常见的状态和可变变量的概念。
○泛型式
泛型编程关注于编写类型参数化算法骨架,在算法实际使用时再指定具体类型。因而,给程序员一些自由,以避免强类型约束规则。如果实现得好,这会是一种强大的范式。
○命令式
命令式语言让程序员给计算机一串指令清单,无需明确表示任务。这种范式可以看作与声明式编程正好相反。
○结构式
结构化编程语言旨在提供一些值得注意的结构形式,例如,直观地控制语句执行的顺序(if X then do Y otherwise do Z, do X while Y is Z)。这些语言通常废除了“jumps”,比如C和C++中提供的goto语句它们不提供。
○过程式
过程式有时候作为命令式编程的同义词,但过程式编程语言也可以是命令式结构化编程语言,支持过程和例程概念(等同于C和C++中的函数)。
○面向对象
面向对象编程(有时缩写OOP)是结构化编程的子集,它采用“对象”来表达程序,这意味着采用对象来建模现实世界。这种范式以可观的方式重用代码,并且容易让人理解。
- 标准化
编程语言有正式标准吗?这对于确保在一种编译器/解释器下工作的程序,在其他编译器/解释器下同样也能工作非常重要。某些编程语言由ANSI(美国国家标准协会)标准化,另一些语言由ISO(国际标准化组织)标准化,还有一些语言是非正式但是事实上的标准,没有任何标准化组织来维护。