从程序的运行周期到计算机编程语言的分类来分析解释型语言与编译型语言的区别及各自优缺点

概览

本篇文章从程序的运行周期、计算机语言的分类来分析解释型语言与编译型语言的区别及各自的优缺点。那么本篇文章主要涉及的内容有:

程序生命周期

计算机语言的分类与区别

程序的生命周期

首先当然是程序的诞生即编程,而编程需要计算机程序设计语言作为基础。对于绝大多数程序之父(程序员)来说,使用的语言称为“高级程序设计语言”,如:PHP、Python、Java、C、C++等等等等。但计算机并不认识你高级程序设计语言,这无异于对牛弹琴,那么怎么让牛能够执行我们的命令呢?我们想着是否有一种机器能够识别人类的命令进而转达给牛让牛去执行。那么编译器和汇编器诞生了,他们的作用就是把高级语言编写的程序翻译成机器语言能让计算机去识别。

其次,操作系统把程序加载到内存,形成一个运动中的程序,也就是我们平时说的“进程”。当然,进程不会再内存上执行,操作系统进而将进程调度到CPU,由CPU完成剩下的工作。

再次,在CPU上执行的机器语言指令需要编程一个个时钟脉冲里的基本操作,这需要指令集结构和计算机硬件的支持,而整个程序的执行过程还需要操作系统提供的服务和程序语言提供的执行环境(runtime environment),这样一个程序到微指令执行的整个过程就完成了。

图一 程序执行流程图

从图一可以看出:程序的运行至少需要4个因素:

程序设计语言

编译系统

操作系统

指令集结构(计算机硬件系统)

需要注意的是以上给出的程序执行过程是从高级程序设计语言编写的程序开始,程序可以直接用机器语言或者汇编语言编写,这种成为低级语言(底层语言)编写的程序,无需经过编译器的翻译就可以直接在计算机指令集上执行,例如:如果是汇编程序只需要经过汇编器就可以直接加载执行。

计算机语言的分类与区别

计算机语言的分类

计算机语言的种类非常的多,总的来说可以分成机器语言,汇编语言,高级语言三大类。

机器语言

机器语言(machine language)是一种指令集的体系。这种指令集,称机器码(machine code),是电脑的CPU可直接解读的数据。

机器码有时也被称为原生码(Native Code),这个名词比较强调某种编程语言或库,它与运行平台相关的部份。

机器语言是用二进制代码表示的计算机能直接识别和执行的一种机器指令的集合。它是计算机的设计者通过计算机的硬件结构赋予计算机的操作功能。机器语言具有灵活、直接执行和速度快等特点。

不同型号的计算机其机器语言是不相通的,按着一种计算机的机器指令编制的程序,不能在另一种计算机上执行。

一条指令就是机器语言的一个语句,它是一组有意义的二进制代码,指令的基本格式如,操作码字段和地址码字段,其中操作码指明了指令的操作性质及功能,地址码则给出了操作数或操作数的地址。

用机器语言编写程序,编程人员要首先熟记所用计算机的全部指令代码和代码的涵义。手编程序时,程序员得自己处理每条指令和每一数据的存储分配和输入输出,还得记住编程过程中每步所使用的工作单元处在何种状态。这是一件十分繁琐的工作。编写程序花费的时间往往是实际运行时间的几十倍或几百倍。而且,编出的程序全是些0和1的指令代码,直观性差,还容易出错。除了计算机生产厂家的专业人员外,绝大多数的程序员已经不再去学习机器语言了。

汇编语言

为了减轻使用机器语言编程的痛苦,人们进行了一种有益的改进:用一些简洁的英文字母、符号串来替代一个特定的指令的二进制串。汇编语言和机器语言实质是相同的,都是直接对硬件操作,只不过指令采用了英文缩写的标识符,容易识别和记忆。源程序经汇编生成的可执行文件不仅比较小,而且执行速度很快。

高级语言

高级语言是绝大多数编程者的选择。和汇编语言相比,它不但将许多相关的机器指令合成为单条指令,并且去掉了与具体操作有关但与完成工作无关的细节,例如使用堆栈、寄存器等,这样就大大简化了程序中的指令。同时,由于省略了很多细节,编程者也就不需要有太多的专业知识。高级语言所编制的程序不能直接被计算机识别,必须经过转换才能被执行,按转换方式可将它们分为三类:解释类和编译类以及Java。

(1)解释类:执行方式类似于我们日常生活中的“同声翻译”,应用程序源代码一边由相应语言的解释器“翻译”成目标代码(机器语言),一边执行,因此效率比较低,而且不能生成可独立执行的可执行文件,应用程序不能脱离其解释器,但这种方式比较灵活,可以动态地调整、修改应用程序。

(2)编译类:编译是指在应用源程序执行之前,就将程序源代码“翻译”成目标代码(机器语言),因此其目标程序可以脱离其语言环境独立执行,使用比较方便、效率较高。但应用程序一旦需要修改,必须先修改源代码,再重新编译生成新的目标文件(*.OBJ)才能执行,只有目标文件而没有源代码,修改很不方便。

(3)特殊的解释类语言:Java

java语言是解释性语言。Java很特殊,Java程序也需要编译,但是没有直接编译称为机器语言,而是编译称为字节码,然后用解释方式执行字节码。Java既可以被编译,也可以被解释。通过编译器,可以把Java程序翻译成一种中间代码(字节码),可以被Java解释器解释的独立于平台的代码。通过解释器,每条Java字节指令被分析,然后在计算机上运行。只需编译一次,程序运行时解释执行。

Java字节码使“写一次,到处运行”成为可能。可以在任何有Java编译器的平台上把Java程序编译成字节码。这个字节码可以运行在任何Java VM上。例如,同一个Java程序可以运行在WindowsNT、Solaris和Macintosh上。

编译与解释型语言的区别

性能对比

编译型与解释型,两者各有利弊。前者由于程序执行速度快,同等条件下对系统要求较低,因此像开发操作系统、大型应用程序、数据库系统等时都采用它,像C/C++、Pascal/Object Pascal(Delphi)等都是编译语言,而一些网

跨平台型对比

编译性语言例如c语言:用c语言开发了程序后,需要通过编译器把程序编译成机器语言(即计算机识别的二进制文件,因为不同的操作系统计算机识别的二进制文件是不同的),所以c语言程序进行移植后,要重新编译。(如windows编译成ext文件,linux编译成erp文件)。

解释性语言,例如java语言,java程序首先通过编译器编译成class文件,如果在windows平台上运行,则通过windows平台上的java虚拟机(VM)进行解释。如果运行在linux平台上,则通过linux平台上的java虚拟机进行解释执行。所以说能跨平台,前提是平台上必须要有相匹配的java虚拟机。如果没有java虚拟机,则不能进行跨平台。

消耗内存对比

编译型程序比解释型程序消耗的内存更少。解释型语言存在一些严重的缺点。解释型应用占用更多的内存和CPU资源。这是由于,为了运行解释型语言编写的程序,相关的解释器必须首先运行。解释器是复杂的,智能的,大量消耗资源的程序并且它们会占用很多CPU周期和内存。

占用磁盘对比

可执行的编译型代码要比相同的解释型代码大许多。例如,C/C++的.exe文件要比同样功能的Java的.class文件大很多。

实现安全性

编译型程序不支持代码中实现安全性。例如,一个编译型的程序可以访问内存的任何区域,并且可以对你的PC做它想做的任何事情(大部分病毒是使用编译型语言编写的)

页脚本、服务器脚本及辅助开发接口这样的对速度要求不高、对不同系统平台间的兼容性有一定要求的程序则通常使用解释型语言,如Java、JavaScript、VBScript、Perl、Python、Ruby、MATLAB 等等。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180302G167FP00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券