首页 > 编程语言 >编译型编程语言与解释型编程语言的区别

编译型编程语言与解释型编程语言的区别

时间:2023-10-10 11:02:16浏览次数:52  
标签:解释 翻译 Java 编程语言 区别 程序 编译 文件

我们先看编译型,其实它和汇编语言是一样的:也是有一个负责翻译的程序来对我们的源代码进行转换,生成相对应的可执行代码。这个过程说得专业一点,就称为编译(Compile),而负责编译的程序自然就称为编译器(Compiler)。如果我们写的程序代码都包含在一个源文件中,那么通常编译之后就会直接生成一个可执行文件,我们就可以直接运行了。但对于一个比较复杂的项目,为了方便管理,我们通常把代码分散在各个源文件中,作为不同的模块来组织。这时编译各个文件时就会生成目标文件(Object file)而不是前面说的可执行文件。一般一个源文件的编译都会对应一个目标文件。这些目标文件里的内容基本上已经是可执行代码了,但由于只是整个项目的一部分,所以我们还不能直接运行。待所有的源文件的编译都大功告成,我们就可以最后把这些半成品的目标文件“打包”成一个可执行文件了,这个工作由另一个程序负责完成,由于此过程好像是把包含可执行代码的目标文件连接装配起来,所以又称为链接(Link),而负责链接的程序就叫就叫链接程序(Linker)。链接程序除了链接目标文件外,可能还有各种资源,像图标文件啊、声音文件啊什么的,还要负责去除目标文件之间的冗余重复代码,等等。链接完成之后,一般就可以得到我们想要的可执行文件了。

编译型编程语言与解释型编程语言的区别_可执行文件

一个完整的编译系统与 一个用C编写的程序hello.c的编译过程

 

现在再看看解释型。从字面上看,“编译”和“解释”的确都有“翻译”的意思,它们的区别则在于翻译的时机安排不大一样。打个比方:假如你打算阅读一本外文书,而你不知道这门外语,那么你可以找一名翻译,给他足够的时间让他从头到尾把整本书翻译好,然后把书的母语版交给你阅读;或者,你也立刻让这名翻译辅助你阅读,让他一句一句给你翻译,如果你想往回看某个章节,他也得重新给你翻译。

两种方式,前者就相当于我们刚才所说的编译型:一次把所有的代码转换成机器语言,然后写成可执行文件;而后者就相当于我们要说的解释型:在程序运行的前一刻,还只有源程序而没有可执行程序;而程序每执行到源程序的某一条指令,则会有一个称之为解释程序的外壳程序将源代码转换成二进制代码以供执行,总言之,就是不断地解释、执行、解释、执行。所以,解释型程序是离不开解释程序的。解释型程序中,由于程序总是以源代码的形式出现,因此只要有相应的解释器,移植几乎不成问题。编译型程序虽然源代码也可以移植,但前提是必须针对不同的系统分别进行编译,对于复杂的工程来说,的确是一件不小的时间消耗,况且很可能一些细节的地方还是要修改源代码。而且,解释型程序省却了编译的步骤,修改调试也非常方便,编辑完毕之后即可立即运行,不必像编译型程序一样每次进行小小改动都要耐心等待漫长的 Compiling…Linking… 这样的编译链接过程。不过凡事有利有弊,由于解释型程序是将编译的过程放到执行过程中,这就决定了解释型程序注定要比编译型慢上一大截,像几百倍的速度差距也是不足为奇的。

编译型与解释型,两者各有利弊。前者由于程序执行速度快,同等条件下对系统要求较低,因此像开发操作系统、大型应用程序、数据库系统等时都采用它,像 C/C++、Pascal/Object、Pascal(Delphi)、VB 等基本都可视为编译语言,而一些网页脚本、服务器脚本及辅助开发接口这样的对速度要求不高、对不同系统平台间的兼容性有一定要求的程序则通常使用解释性语言,如 Java、JavaScript、VBScript、Perl、Python 等等。

 

但既然编译型与解释型各有优缺点又相互对立,所以一批新兴的语言都有把两者折衷起来的趋势。说到这里,我们有必要说一下 Java 。

JAVA 语言是一种编译型-解释型语言,同时具备编译特性和解释特性。其实,确切的说 Java 就是解释型语言,其所谓的(预)编译过程只是将 .java 文件编程成平台无关的字节码 .class 文件(生成的代码是介于机器码和Java源代码之间的中介代码),并不是向 C 一样编译成可执行的机器语言。作为编译型语言,JAVA 程序要被统一编译成字节码文件——文件后缀是 .class 。此种文件在 Java 中又称为类文件。Java 类文件不能在计算机上直接执行,它需要被 JVM(Java 的虚拟机平台,可视为解释器)翻译成本地的机器码后才能执行,而 Java 虚拟机的翻译过程则是解释性的。Java 字节码文件首先被加载到计算机内存中,然后读出一条指令,翻译一条指令,执行一条指令,该过程被称为 Java 语言的解释执行。而在现实中,Java 开发工具 JDK 提供了两个很重要的命令来完成上面的编译和解释(翻译)过程。两个命令分别是 java.exe 和 javac.exe,前者加载 Java 类文件,并逐步对字节码文件进行编译,而另一个命令则对应了 Java 语言的解释(javac.exe)过程。在次序上,Java 语言是要先进行编译的过程,接着解释执行。这样既保留了源代码的高抽象、可移植的特点,又已经完成了对源代码的大部分预编译工作,所以执行起来比“纯解释型”程序要快许多。

总结

C/C++、Pascal、Go、汇编等,必须在程序运行之前将所有代码都翻译成二进制形式,也就是生成可执行文件,用户拿到的是最终生成的可执行文件,看不到源码。

这个过程叫做编译(Compile),这样的编程语言叫做编译型语言,完成编译过程的软件叫做编译器(Compiler)。

而有的编程语言,如 Shell、JavaScript、Python、PHP 等,需要一边翻译一边执行,不会生成任何可执行文件,用户必须拿到源码才能运行程序。程序运行后会即时翻译,翻译完一部分执行一部分,不用等到所有代码都翻译完。

这个过程叫做解释,这样的编程语言叫做解释型语言或者脚本语言(Script),完成解释过程的软件叫做解释器。

编译型语言的优点是执行速度快、对硬件要求低、保密性好,适合开发操作系统、大型应用程序、数据库等。

脚本语言的优点是使用灵活、部署容易、跨平台性好,非常适合 Web 开发以及小工具的制作。

参考:

https://www.jianshu.com/p/d21010003bb7

http://c.biancheng.net/view/4136.html

 



标签:解释,翻译,Java,编程语言,区别,程序,编译,文件
From: https://blog.51cto.com/emanlee/7789366

相关文章

  • TIOBE 发布 2023年10 月编程语言排行榜:Java 占比下跌 3.92%成第四
    转载TIOBE发布10月编程语言排行榜:Java占比下跌3.92%成第四(msn.cn)本月Python、C、Java均有所下跌,而Java的跌幅最大,为-3.92%,掉到第四,而C#的涨幅最大,增长了3.29%。对此,TIOBE的CEOPaulJansen认为,C#和Java之间的差距从未如此之小,Java受欢迎程度下降的主要......
  • 单步指令区别step next stepi nexti
    https://blog.csdn.net/weixin_43092232/article/details/106243657https://blog.csdn.net/www_dong/article/details/117374370 代码验证:龙芯3A5000验证$cattest.c#include<stdio.h>intadd(intd1,intd2){intd;d=d1+1;d=d+d2+2;retu......
  • VM:桥接、NAT、仅主机的区别
    学习自:桥接模式、NAT模式、仅主机(HostOnly)模式的区别_程序员爱德华的博客-CSDN博客VM虚拟机的三种网络连接模式,桥接,NAT,仅主机区别。VMware的三种网络模式-知乎1、网络类型虚拟机建立时的常见网络类型有3种:桥接、NAT(NetworkAddressTranslation,网络地址转换)、仅主机(Host......
  • @GetMapping、@PostMapping、@PutMapping、@DeleteMapping 的区别?
    对于@GetMapping、@PostMapping、@PutMapping、@DeleteMapping,首先我们得谈到RESTFUL风格接口,常用的URL请求方式就包括了GET、POST、PUT、DELETE等:谈到@GetMapping、@PostMapping、@PutMapping、@DeleteMapping等注解,首先得讲到@RequestMaping:@RequestMaping主要是将HTTP请求映......
  • HTTP和HTTPS区别
    HTTP(HyperTextTransferProtocol)和HTTPS(HTTPSecure)都是用于在计算机之间传输数据的协议.但是,HTTPS在传输数据时使用了安全套接层(SSL)或者传输层安全(TLS)协议来加密数据,以防止第三方拦截或窃取数据。主要区别如下:1.安全性:HTTPS在传输过程中使用了加密技术,而HTTP......
  • 左值、右值及其引用的区别
    左值、右值及其引用的区别概念左值左值既可以出现在等号左边,也能出现在等号右边左值可以修改左值是可寻址的变量,具有持久性纯右值右值只能出现在等号右边右值不可修改右值一般是不可寻址的常量,具有临时性将亡值C++11新增的与右值引用相关的表达式......
  • stm32与dsp有什么区别
    dsp比stm32高级,处理速度也快,两个不是一个级别的。dsp要难学的多,要自己分内存,写cmd文件等等。stm32容易入门。功能上STM32F103能实现的dsp2812也能实现吗?简单的可以,毕竟不是同一级别的东西,dsp跑个100多m,stm32就不行了,高速的东西做不了。2812运算性能比STM32F103强。dsp2812即T......
  • TypeScript与JavaScript比较(区别)
     TypeScript和JavaScript是目前项目开发中较为流行的两种脚本语言,TypeScript是JavaScript的一个超集,但是TypeScript与JavaScript之间又有什么样的区别呢?在选择开发语言时,又该如何抉择呢?本文将会深入对比这两种语言,讨论两种语言之间的关联和差异,并概述两种语言各自的优势......
  • 抽象类(abstract)和接口(interface)的区别
    抽象类(abstract)和接口(interface)的区别抽象类(abstract)只有方法名和参数,没有方法体抽象方法一般存在于抽象类中有抽象方法的一定是抽象类抽象类里不一定有抽象方法抽象类被别的类继承(继承只能单继承),子类一定要重写抽象类中的抽象方法,如果子类也是抽象类则不用重写抽......
  • CString和LPCTSTR之间的关系和区别
    在Windows操作系统中,我们常用2种编码格式,ANSI编码和Unicode编码ANSI=>窄字节编码,一个字符(char)占用一个字节(一个字节占8位)的存储空间,也就是说一个字符占据8位(有效数据是除掉最高位的其他7位)=>C++中用char来表示这种窄字节编码的字符Unicode=>宽字节编码,一个字......