各种编程语言的分类
总述
编程语言从最开始的机器语言到如今的百花齐放,已经经过了很长时间的发展。我们也在发展的过程中对拥有不同特性的语言进行了分类,但随着语言越来越多,越来越高级,许多语言拥有了不同的特性,甚至是颠覆以前的分类的。所以如今的很多语言需要用多种分类方式共同分类。这片文章仅仅讨论一些主流的语言。
分类方式
查询了网上的资料,如今的分类方式大概有以下几种:
- 抽象等级
- 用途
- 程序设计方式
- 程序执行方式
- 变量是否需要声明类型
- 运行时变量结构能否改变
抽象等级
即对人类而言,编程的难易程度。
- 低级语言:顾名思义,对人类而言是一种低级的、难用的语言。但此处低级也可以理解为基础的、底层的意思,即计算机使用的语言。
- 机器语言:二进制代码
- 优点:直接执行,速度快,资源占用少。
- 缺点:可读性、可移植性差,编程繁杂。
- 汇编语言:面向机器的程序设计语言。汇编语言源程序必须经过汇编,生成目标文件,然后执行。
- 优点:能够保持机器语言的一致性,直接、简捷,并能像机器指令一样访问、控制计算机的各种硬件设备,如磁盘、存储器、CPU、I/O端口等。使用汇编语言,可以访问所有能够被访问的软、硬件资源,目标代码简短,占用内存少,执行速度快。
- 缺点:不同的处理器有不同的汇编语言语法和编译器,编译的程序无法在不同的处理器上执行,缺乏可移植性,难于从汇编语言代码上理解程序设计意图,可维护性差,即使是完成简单的工作也需要大量的汇编语言代码,很容易产生bug,难于调试,使用汇编语言必须对某种处理器非常了解,而且只能针对特定的体系结构和处理器进行优化,开发效率很低,周期长且单调。
- 机器语言:二进制代码
- 高级语言:目前来讲,基本上普通人能接触到的语言均属于高级语言
用途
即编程语言被设计出来的目的,一般来讲大多数语言被设计出来,虽然都有优点和缺点,但基本能被应用于各个场景,但专用语言则为某一个特定场景而开发出来的。
- 通用语言:
- 代表语言:几乎所有非专用语言
- 领域专用语言:
- 代表语言:SQL(数据库专用语言),CAD系统中的绘图语言
程序设计方式
- 面向过程:Procedure-Oriented Language,即以过程和函数为基础的语言,就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
- 代表语言:C,Pascal
- 面向对象:Object-Oriented Language,即对象作为基本程序结构单位的程序设计语言,指用于描述的设计是以对象为核心,而对象是程序运行时刻的基本成分。语言中提供了类、继承等成分。主要思想是把构成问题的各个事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙一个事物在整个解决问题的步骤中的行为。
- 三大特点:封装,继承,多态
- 基于对象:与面向对象不同,基于对象是使用对象,但是无法利用现有的对象模板产生新的对象类型,继而产生新的对象,也就是说“基于对象”没有继承的特点。而“多态”表示为父类类型的子类对象实例,没有了继承的概念也就无从谈论“多态”。
- 代表语言:Java,Python,C#,C++,Visual Basic,.NET,PHP,JavaScript,R
程序执行方式
- 解释型语言:
- 执行方式类似于我们日常生活中的“同声翻译”,应用程序源代码一边由相应语言的解释器“翻译”成目标代码(机器语言),一边执行,因此效率比较低,而且不能生成可独立执行的可执行文件,应用程序不能脱离其解释器,但这种方式比较灵活,可以动态地调整、修改应用程序。
- 代表语言:Python,JavaScript,VBScript,Perl,Ruby,Erlang
- 编译型语言:
- 编译是指在应用源程序执行之前,就将程序源代码“翻译”成目标代码(机器语言),因此其目标程序可以脱离其语言环境独立执行,使用比较方便、效率较高。但应用程序一旦需要修改,必须先修改源代码,再重新编译生成新的目标文件(*.OBJ)才能执行,只有目标文件而没有源代码,修改很不方便。如今大多数的编程语言都是编译型的,例如VisualBasic、VisualC++、VisualFoxpro、Delphi等。
- 代表语言:C,C++,Pascal,Object-C,swift
- 混合性语言:即同时拥有以上两种特性。混合性语言,又称之为半编译型语言,在编译的过程中,不过直接编译成机器码,而是中间码,中间码不可执行,随后在执行过程中,通过解释器/翻译器,再把中间码翻译成机器码进行执行。
- 代表语言:Java,C#,.NET
变量是否需要声明类型
- 强类型:即是程序中表达的任何对象所从属的类型都必须能在编译时刻确定,通俗来讲就是如果最开始定义
a = 'hello'
,那么此时的变量a
就被定义为了String
,即字符串,当变量a
与另一个变量b = 1
相加时,就会报错,因为字符串无法与Integer
,即整数想加- 代表语言:Java,Python,C#,Object-C,Ruby
- 弱类型:与上面相反,即数据类型可以被忽略,同样用之前的例子,在弱类型语言中,当
a
和b
相加时,会把b
自动转换成字符串String
,所以能得到结果hello1
- 代表语言:JavaScript,PHP,C,C++(C和C++有争议,在此不做讨论)
运行时变量结构能否改变
主要区别为运行时是否能够改变代码结构。动态类型语言和静态类型语言主要针对数据类型检查的时间问题。
- 动态结构语言:是一类在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化。通俗点说就是在运行时代码可以根据某些条件改变自身结构。动态语言是在运行时确定数据类型的语言。变量使用之前不需要类型声明,通常变量的类型是被赋值的那个值的类型。
- 代表语言:Python,Ruby,Erlang,JavaScript,swift,PHP,SQL,Perl,Object-C,C#
- 静态结构语言:与动态语言相对应的,运行时结构不可变的语言就是静态语言。静态语言是在编译时变量的数据类型即可确定的语言,多数静态类型语言要求在使用变量之前必须声明数据类型。
- 代表语言:C、C++、C#、Java、Object-C
注:
通常情况下解释型语言是动态类型语言,编译型语言是静态类型语言。但也不全是,swift是编译型语言但是它也是动态类型语言。C#和Java是解释型语言也是静态类型语言。