手机版
当前位置: 首页 常识

什么是编译型语言?什么是解释型语言?

时间:2024-08-06 08:01:55

很多初学者学了几门编程语言,但是并不清楚这些编程语言到底是编译型语言还是解释型语言。

什么是解释?什么是编译?

如你学过C语言你就会知道,C语言在执行前一定要先编译一下,如果发现语法错误,一定编译不通过。

C语言编译器首先要将你编写的代码编译成可执行文件,比如在Windows系统上首先要编译生成一个.exe的文件,然后才可以执行。

而解释型语言就是,解释一条执行一条,比如Java语言就是这样,如果有一句代码发生错误的话,程序就执行到那一句才会停下来报错,边解释边执行的语言,解释就是一句一句的翻译。

如下图所示,编译型语言就是先从源程序转换成机器指令,然后再由机器运行,而解释型语言就是逐条读取,逐条执行。

为什么会有这两种类型的编程语言?

我认为主要是为了解决跨平台性的问题,一般编译型语言跨平台性都不好,比如C语言在不同的操作系统下需要使用不同的编译工具进行编译,编译出来的机器代码是不同的。

所以C语言程序进行移植后,需要重新编译。

而解释型语言就不一样,比如JAVA,JAVA程序首先通过编译器编译成class字节码文件,也就是二进制文件。

使用过命令行操作的朋友知道这部通过Javac进行编译。这个字节码文件与平台无关。

如果在Windows平台上运行,则通过Windows平台上的java虚拟机(VM)进行解释。

如果运行在Linux平台上,则通过Linux平台上的Java虚拟机进行解释执行。

所以说能跨平台,前提是平台上必须要有相匹配的Java虚拟机,如果没有java虚拟机,则不能进行跨平台。

简单来说,就是Java程序的跨平台是因为Java虚拟机跨平台,所以它可以跨平台。

你会发现如果你要运行Java程序首先要安装Java虚拟机,其实就是JDK,JDK里面包含了jvm,没有JVM你是无法执行Java语言编写的软件的。

把字节码文件通过类加载器加载进JVM中,然后进行字节码的校验,没有问题就通过解析器把字节码翻译成当前机器能识别的机器码,然后交给操作系统去进行调度执行。

虽然字节码文件与平台无关,但是特定平台的机器只能执行其对应的机器码。那么就需要有一个中间件来把字节码翻译成对应的平台机器码,这个就是解析器,而解析器其实就是JVM里面的一个组件。

JVM的执行流程:

1、JVM使用类加载器(Class Loader)装载 class (二进制)文件

2、字节码效验(主要做以下五步)

(1)检查当前class文件的版本和JVM的版本是否兼容

(2)检查当前代码是会破坏系统的完整性

(3)检查当前代码是否有栈溢出的情况

(4)检查当前代码中的参数类型是否正确

(5)检查当前代码中的类型转换操作是否正确

3、把通过校验的字节码解析成机器码,解析器是一句一句进行代码进行解析的。

同样Pyhton也是一种解释型语言,它的原理和Java类似,只不过Pyhton代码是先编译成pyc文件也就是二进制文件同样也是跨平台的,然后再由Pyhton虚拟机解释执行。

其实解释型语言的编译(compile)不是一个强制的操作。事实上,编译是一个自动的过程。多数情况下,你甚至感觉不到它的存在。

这就是为什么解释型语言性能没有编译型语言的好,原因就是因为虚拟机的存在,中间隔了一层,自然就慢了。

本来像C语言那样可以直接由操作系统运行,而Java和Pyhton语言要先由操作系统运行虚拟机,然后再由虚拟机运行对于的Java和Pyhton程序,自然而然运行速度就慢,需要的内存也比较高。

总结来说就是,编译型语言有它的优点,也有它的缺点,优点就是运行快,内存小,缺点就是跨平台性差。

解释型语言刚好和编译型语言相反,优点是跨平台性好,缺点是相对于编译型语言来说运行慢,内存大。