6-programming_language

第六章 编程语言分类 (Programming Language Categories)

1 简介

编程语言的设计与使用是计算机领域的一个非常重要的分支;在计算机理论方面,编程语言的表达能力直接代表着计算机的计算和处理能力;在应用方面,各种项目的开发离不开编程语言。随着计算机技术的革新与发展,人们已经开发出了上千种不同的编程语言,用于不同的应用场景。有的语言专门用于项目开发;有的语言专门用于科学研究;有的语言专门用于教学;甚至,有的语言仅用于个人兴趣爱好。

从编程语言的内部看,每一门编程语言都是由不同的编程技术“组装”而成的。我们将会在本章中总结一下目前较为流行的编程语言的概念,并按照技术特点或者特性的不同,将编程语言分类,希望能帮助读者更加深刻的理解什么是编程语言。

2 高级编程语言与低级编程语言

高级编程语言(High-Level Programming Language)是一种现在最常见的编程语言。高级编程语言为开发人员提供了一个与运行平台独立的编程环境。在编程过程中,开发人员无需关心运行平台、或者只需少量关心运行平台的细节。例如:使用高级编程语言时,开发人员无需关心运行平台使用的CPU类型、内存型号、硬盘使用的接口种类等信息。使用高级编程语言能极大的简化编程的难度,加快项目的开发速度。人们称这种编程语言为高级编程语言,因为它们更加接近于开发人员。高级编程语言包括我们熟悉的C++,Java,Python,各类脚本语言等。高级编程语言可以使用编译器(Compiler)将其转换为机器代码(Machine Code),运行于机器之上;或者使用解释器(Interpreter)解释运行。

低级编程语言(Low Level Programming Language)是一种依赖于硬件平台的软件开发语言。在开发过程中,开发人员需要牢记编程语言的指令与处理器指令之间的映射关系。并且,开发人员还需要熟悉硬件平台与处理器的指令功能等硬件平台知识。在使用低级语言时,因为开发人员对程序有着完全的掌控,因此,使用低级编程语言开发出来的程序往往运行速度更快、内存占用更小等特点。低级编程语言由汇编器(Assembler)将其转换为机器代码,运行于机器之上。目前,常见的低级编程语言为机器代码(Machine Code)或者汇编语言(Assembly Language)。

高级编程语言(High Level Programming Language)低级编程语言(Low Level Programming Language)
C/C++Assembly Language
Java 
Python 
Go 
C# 
JavaScript, TypeScript 
SQL 
Rust 
Groovy 
Kotlin, Scala 
Lua 

3 通用型编程语言与非通用型编程语言

编程语言可按照使用用途划分为通用型编程语言(General Purpose Programming Language)非通用型编程语言。通用型编程语言的用途比较广泛,可用于开发多种应用程序。我们常见的大部分编程语言都是通用型编程语言。非通用型编程语言也被称为领域特定的编程语言(Domain Specific Programming Language)。这些编程语言仅用于特定的领域。常见的非通用型编程语言有:SQL(Structured Query Language),因为SQL仅用于数据库领域;Matlab、GNU Octave、和R语言,因为她们专门用于科学计算和统计学相关领域;TeX,因为她仅用于文档编辑系统。

通用型编程语言(General Purpose Programming Language)领域特定的编程语言(Domain Specific Programming Language)
C/C++SQL
JavaMatlab
PythonGNU Octave
GoR
C#TeX
JavaScript, TypeScript 
Rust 
Groovy 
Kotlin, Scala 
Lua 

3 编译型编程语言与解释型编程语言

编译型编程语言(Compiled Programming Language)是指由这类编程语言编写的程序需由编译器(Compiler)翻译转换之后才能运行的编程语言;而解释型编程语言(Interpreted Programming language)是指该语言的源代码可直接由解释器(Interpreter)解释运行。还有一些语言,需要先经过编译器翻译,然后由解释器解释运行。这种语言常被称为混合型语言(Hybrid Programming Language)

我们将常见的编程语言分类展示如下。值得注意的是,我们是按照编程语言的常见用法分类的。但是,从技术上讲,这些并不是唯一的使用方法。例如:C语言是一种编译型编程语言,但是,人们还开发了C语言的解释器,因此,C语言也可以解释执行。但是,这不是C语言的主要用法。所以,我们还是将C语言归类于编译型编程语言。同理,Java语言的主要用法是经编译器编译成Java二进制代码(Java ByteCode),然后在Java虚拟机上解释执行(值得注意的是,Java也可以直接编译成机器代码)。所以,我们将Java归类于混合型编程语言。

编译型编程语言(Compiled Programming Language)解释型编程语言(Interpreted Programming language)混合型语言(Hybrid Programming Language)
C/C++SQLJava
GoMatlabPython
RustRC#
 JavaScriptTypeScript
 LuaGroovy
 BashKotlin
  Scala

4 面向过程编程语言(Procedural Programming Language)、面向对象编程语言(Object-Oriented Programming Language)与函数式编程语言(Functional Programming Language)

编程范式(Programming Paradigm)描述的是一种编程风格,或者一种解决问题的方法和态度。按照编程范式,编程语言可大致分为两类:指令式编程语言(Imperative Programming Language)声明式编程语言(Declarative Programming Language)

指令式编程语言的程序有着明确的内部结构和执行过程。在开发应用程序时,开发人员需要明确的定义和使用数据结构(Data Structure),并且使用指令(Instructions)或者语句(Statements)来明确的完成目标逻辑。常见的指令式编程语言有面向过程的编程语言(Procedural-Oriented Programming Language)面向对象的编程语言(Object-Oriented Programming Language)

声明式编程语言的程序描述的是程序需要完成的目标,而不是描述如何去实现这个目标。例如:SQL是一个声明式编程语言。例如,开发人员能够使用SELECT语句来查询数据库中的某一项数据,但是,SQL语句并不描述如何才能从数据库中找到目标数据。其中实现的细节依赖于语言实现的具体版本,与语言本身无关。声明式编程语言还有许多例子,最为常见的有函数式编程语言(Functional Programming Language)正则表达式(Regular Expression),和逻辑编程(Logic Programming)等。

面向过程编程语言(Procedural Programming Language)是基于过程调用(Procedure Call)/函数调用(Function Call)来实现程序逻辑的。每一个函数由一系列的运算步骤组成。在程序的任意一个地方都可以调用函数。常见的面向过程的编程语言有C语言和Pascal语言。

面向对象编程语言(Object-Oriented Programming Language)建立在对象的基础之上。一个对象可以包含数据和方法。对象的数据又被称为属性(Fields, Attributes或者Properties);与对象相关联的方法用于处理程序的逻辑。面向对象编程的最大特点是封装(Encapsulation)继承(Inheritance)。封装特性将相互关联的数据和方法放在一个独立的空间内,不受外界的干扰。继承能提高代码的复用性,提高项目的开发效率。常见的、支持面向对象程序设计的语言有C++、Java、Python等。

函数式编程语言(Functional Programming Language)的核心概念是通过创建和使用函数来完成程序的逻辑。函数式编程是一种声明式编程,因为,函数式编程语言并不包含或者使用具体的指令;所有的数据和逻辑都是使用抽象数据结构和相关的操作来表达的(链表或者集合)。函数式编程语言不描述如何构建链表或者集合,也不描述如何从链表中增加或者删除数据,它只描述结果。常见的函数式编程语言有Lisp、Haskell等。

 

编程语言支持面向过程编程(Procedural Programming)支持面向对象编程(Object-Oriented Programming)支持函数式编程(Functional Programming)
C  
C++
Java
C#
Python
Go 
JavaScript/TypeScript
Rust  
Scala
Kotlin
Groovy

5 强类型编程语言(Strong Typed Programming Language)与弱类型编程语言(Weak Typed Programming Language)

每个编程语言都有一套自定义的数据类型使用规则。这个规则规定了在什么场景下可以使用什么类型的数据。在编译过程中,为了检查程序潜在的错误,编译器会使用这套自定义的数据类型规则来检查程序源代码,这个检查过程被称为类型检查(Type Checking),有时又被称为类型安全性检查(Type Safety Checking)强类型编程语言(Strong Typed Programming Language)有着较为严格的类型检查规则;而弱类型编程语言(Weak Typed Programming Language)有着较为宽松的类型检查规则。目前,并没有一个统一的、明确的界限来区分强类型检查或者弱类型检查。每一名开发人员心中都有一把尺来衡量类型的强与弱。

令这个问题变得更为复杂的另外一个原因是一门编程语言可能既支持强类型特性,也支持弱类型特性。为了把这一点解释清楚,我们以C语言为例,来分析一些C语言的类型强弱(以下分析同样适用于C++语言,因为C++语言支持所有C语言的特性)。

与大多数编程语言相比,C语言是一门类型相对较强的语言。在C语言中,每个变量都有类型,而且在声明变量时必须指定一个类型。所有变量必须先声明后使用。换句话说,在使用变量时,变量的类型是确定的。在函数调用时,函数参数的类型必须是确定且匹配的。因此,在C语言的编译过程中,编译器需要做非常严格的类型检查。所以,C语言是一门类型较强的编程语言。

然而,C语言同样支持一些弱类型特性。其一,C语言支持强制类型转换(Type Casting)。强制类型转换特性可以“绕开”编译器的类型检查,使得类型规则校验失效。其二,C语言支持无类型指针(void *)。无类型指针可以指向任意类型的指针,使得编译器无法实施类型检查。

从上述的分析来看,C语言的类型强弱实在难以量化。不仅C语言,其他语言同样也存在着类似的问题。不过,类型强与弱仅仅只是编程语言的一个特征,对于读者而言,更重要的是理解类型检查背后的意义,以及各个编程语言如何运用类型检查来帮助开发人员提高程序的正确性。

6 静态类型编程语言(Static Typed Programming Language)与动态类型编程语言(Dynamic Typed Programming Language)

静态类型编程语言(Static Typed Programming Language)中,所有变量的类型在编译过程中都是确定的。换句话说,编译器能够检查或者推导出每一个变量的类型。而动态类型编程语言(Dynamic Typed Programming Language)允许变量类型在运行期才被确定下来。

对象类型的检查通常分为两种。在编译期进行的类型检查被称为静态类型检查;而在运行期进行的类型检查为动态类型检查。静态类型检查是为了帮助开发人员尽早发现问题,在程序尚未运行时,将问题暴露出来并解决之。而动态类型检查主要的目的是在程序运行时,如果发现变量类型问题(例如:类型不匹配),通过合理的方法抛出错误,以便于程序能够正确处理错误,减少因错误而造成的损失。目前流行的编程语言会同时使用静态类型检查和动态类型检查两种方法。

静态类型编程语言(Static Typed Programming Language)动态类型编程语言(Dynamic Typed Programming Language)
C/C++Python
JavaJavaScript
C#Groovy
GoRuby
Scala 
Rust 
TypeScript 
Scala 
Kotlin 

7 结语

本章介绍了计算机领域中与编程语言分类相关的内容。编程语言是计算机科学的一个重要分支,涉及面非常广。然而,各门编程语言的书籍侧重于介绍语言特性,而忽略了语言之间的横向比较。因此,本文从多个角度,分析了当前流行编程语言的特性以及分类,希望能帮助读者进一步全方位的了解计算机编程语言,巩固对编程语言的理解。

上一章
下一章

注册用户登陆后可留言

Copyright  2019 Little Waterdrop, LLC. All Rights Reserved.