浅谈编程语言分类
--SEMS_17003
摘 要:
谈起程序,就不得不提编程。而谈到编程,就要说到编程语言,对于初学程序者或编程爱好者来说,语言的分类可能就是面向过程和面向对象两种。但事实上有着更详细的划分。各编程语言之间也有一定的联系。
一、按照抽象等级
抽象是针对问题的特征对现实事物的紧密相关的属性的提炼过程及结果。抽象编程是通过抽象的方法来减少编程工作量或有效地减轻编程难度称为抽象编程。在抽象的等级上编程语言可作如下分类:
1. 机器语言
机器语言是最接近计算机硬件的语言,也是可以直接和硬件进行沟通的语言。早期的程序设计均使用机器语言。程序员们将用0, 1数字编成的程序代码打在纸带或卡片上,1打孔,0不打孔,再将程序通过纸带机或卡片机输入计算机,进行运算。作为指令集体系的机器语言,又因为机器语言使用0和1进行编程,所以机器语言也被称为“机器码”,且其开发效率极低且二进制代码难以编写和阅读。
2. 汇编语言
汇编语言,是除了机器语言外的最底层的编程语言了,也可称为符号语言。汇编语言的主体是汇编指令,汇编指令和机器指令的差别在于指令的表示方法上,汇编指令是机器指令的助记符,汇编指令是更便于记忆的一种书写格式。在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。普遍地说,特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植。自汇编语言始逐渐出现使用字母、符号等代替了二进制的0和一进行编程,所以汇编语言的效率相对于机器语言效率高且便于编写,但也因此相对于机器语言来说执行效率低、和硬件交互还需要转换。
3. 高级语言
高级语言是大多数编程者的选择。和汇编语言相比,它不但将许多相关的机器指令合成为单条指令,并且去掉了与具体操作有关但与完成工作无关的细节,例如使用堆栈、寄存器等,这样就大大简化了程序中的指令。高级语言的产生,程序员无需再去考虑复杂的硬件操作。而对于高级语言此一分支,仍有两子分支进行分类——编译型、解释型和混用型。(详细在3、程序执行方式说明)
二、按照程序设计方法
对于程序的设计方法,则分为两类——面向过程和面向对象。从名字不难看出两者的区别。
面向过程(Procedure Oriented),将编程的重心放在过程上。这里用一个例子来说明面向过程。假设有A和B两个人见面握手,用面向过程的思想来表达两人握手的系列动作那么我们首先需要定义A和B两个人,之后在详细的一一列举出握手这个动作:抬起胳膊、伸出手、哪只手握手、摇手……在这个例子足以说明握手的一套过程以及面向过程的重心。此类语言较有代表性的如C语言。
面向对象(Object Oriented),面向对象是相对于面向过程来讲的,面向对象方法,把相关的数据和方法组织为一个整体来看待,更加贴近自然。同样用上述的例子握手来说,那么就非常简单:我们首先将握手的几个参数写好,做一个握手对象,接下来对于程序我们只需要这么写就好了“握手(A,B);”。此类语言较有代表性的如C++,JAVA。
这看起来面向对象语言比面向过程语言使用简单不少,但这也只是相对的。如果我们写一个基于tcp协议的服务器那么免不了和连接三次握手断开四次握手打交道。那么这时使用面向过程语言书写就更加严谨了。
三、按照程序执行方式
编译型语言
编译型语言顾名思义由代码经过编译器编译之后才能执行。编译器对源文件进行编译,就是把源文件中的文本形式存在的源代码翻译成机器语言形式的目标文件的过程,在这个过程中,编译器会进行一系列的语法检查。这里拿最典型的编程语言C++为例,从代码编译成最后的可执行文件分为三个步骤:预编译、编译、链接。预编译操作将书写的预编译指令比如写的头文件或者宏定义放入代码文件内,这一步可以粗略的认为只做了一件事情,那就是“宏展开”。对于编译过程又可以详细分成编译优化和汇编编译两个过程,在编译优化时编译器将优化被编译的代码文件并作出适当处理;而在汇编编译中,将会生成目标文件。目标文件并不是想要的程序,这只是一个中间文件。编译器将代码逐条翻译成汇编语句,生成的文件便是中间文件。最后一步是链接,它会把所有编译好的单元全部链接为一个整体文件,这一步相当于做一个配对,将源文件需要的头文件拼接组合一起,又将一个个组合的小文件拼接成一个最终可执行文件。(链接又可分静态和动态链接,这里不再赘述其原理和过程)
典型的编译型语言有C、C++语言。
解释型语言
解释性语言编写的程序不进行预先编译,以文本方式存储程序代码。在发布程序时,看起来省了道编译工序。但是,在运行程序的时候,解释性语言必须先解释再运行。比如解释性Basic语言,其专用的解释器在执行Basic程序时,会逐条读取解释每个语句,这个其实就是一个编译过程,然后再执行。一般来说,现有的解释性语言都是采用的逐行解释一句,执行一句这样的方式来构建的。这样解释性语言每执行一次就要翻译一次,效率比较低。执行方式类似于我们日常生活中的“同声翻译”,应用程序源代码一边由相应语言的解释器“翻译”成目标代码(机器语言),一边执行,因此效率比较低,而且不能生成可独立执行的可执行文件,应用程序不能脱离其解释器(想运行,必须先装上解释器,就像跟老外说话,必须有翻译在场),但这种方式比较灵活,可以动态地调整、修改应用程序。如Python、PHP、Ruby等语言。
混用型语言
混用型语言同时具备了两种类型的特点,其中最典型的例子。java很特殊,java程序也需要编译,但是没有直接编译称为机器语言,而是编译称为字节码,然后用解释方式执行字节码。Java既可以被编译,也可以被解释。通过编译器,可以把Java程序翻译成一种中间代码 - 称为字节码 - 可以被Java解释器解释的独立于平台的代码。java语言有一个称为JVM的虚拟平台,当任意一点计算机安装jre(java runtime kit)之后,即可全平台使用。
四、按照运行时结构能否改变
一个程序在执行时可以产生诸多变化譬如界面的跳转、按钮敲击后的链接,这些都是开发者设计好的。程序又无数的代码编写而成,配上算法加数据结构的公理。而程序在执行时代码是否可以改变也可以作为类型的划分。
动态语言
动态语言是在运行时确定数据类型的语言。变量使用之前不需要类型声明,通常变量的类型是被赋值的那个值的类型。动态思维不受束缚,可以任意发挥,把更多的精力放在产品本身上。集中思考业务逻辑实现,思考过程即实现过程
静态语言
静态语言是在编译时变量的数据类型即可确定的语言,多数静态类型语言要求在使用变量之前必须声明数据类型。由于类型的强制声明,使得IDE有很强的代码感知能力,故,在实现复杂的业务逻辑、开发大型商业系统、以及那些生命周期很长的应用中,依托IDE对系统的开发很有保障。
由于静态语言相对比较封闭,使得第三方开发包对代码的侵害性可以降到最低。
五、 按照变量是否需要指明类型
1.强类型语言:使之强制数据类型定义的语言。没有强制类型转化前,不允许两种不同类型的变量相互操作。强类型定义语言是类型安全的语言。强类型语言对于变量的申明是非常严苛的。一个整形变量是无法和一个浮点型变量进行操作的,同样一个变量和一个常量也是无法直接交互的。再举一个例子来说明:”在java中int a = 3.14”是无法通过编译的;
2.弱类型语言:数据类型可以被忽略的语言。与强类型语言相反, 一个变量可以赋不同数据类型的值,允许将一块内存看做多种类型,比如直接将整型变量与字符变量相加。弱类型并不是无类型,也不是只有一种类型。或者C/C++、PHP都是弱类型语言,比如C++中“int i = 0.0;”是可以编译运行的。虽然c++可以这么写但C++也是对于变量类型操作十分严苛。此处只是一个系统强转换。
---
参考文献:
百度百科 抽象编程(2018-07-04)[2020-02-20]
https://baike.baidu.com/item/%E6%8A%BD%E8%B1%A1%E7%BC%96%E7%A8%8B/2757903?fr=aladdin
琴水玉 编程漫谈(三):抽象编程大观园 (2014-10-20)[2020-02-20]
https://www.cnblogs.com/lovesqcc/p/4038408.html
万云飞 机器语言(2018-06-25) [2020-02-20]
https://blog.csdn.net/wanwu_fusu/article/details/80808523
夏海峰 汇编语言 | 01 - 基础知识 (2018.10.09)[2020-02-20]
https://www.jianshu.com/p/90cae6902c00
顺其自然~ 什么是汇编语言 (2018-11-19)[2020-02-20]
https://blog.csdn.net/fuhanghang/article/details/84260199
祥SHAO 05-编程语言的分类 (2019-08-19)[2020-02-20]
https://www.cnblogs.com/LWX-YEER/p/11232581.html#%E7%BC%96%E8%AF%91%E5%9E%8B%E8%AF%AD%E8%A8%80
kint_zhao 浅谈C++编译原——C++编译器与链接器工作原理(2015-06-09)[2020-02-20]
https://blog.csdn.net/zyh821351004/article/details/46425823
解释型语言
百度百科 (2018-08-12)[2020-02-20]
https://baike.baidu.com/item/%E8%A7%A3%E9%87%8A%E5%9E%8B%E8%AF%AD%E8%A8%80/8888952?fr=aladdin
善良的小邱子
编程语言分类 (2019-07-07)[2020-02-20]
https://www.cnblogs.com/xqzi/p/11148854.html
raindi 静态语言和动态语言的区别 (2019-09-17)[2020-02-20]
https://www.cnblogs.com/raind/p/8551791.html