解释器与编译器、解释型语言与编译型语言
-
解释器(interpret):把高级编程语言逐行翻译并直接执行
解释器运行程序的方法有三种: 1.直接运行高级编程语言 (如 Shell 自带的解释器) 2.转换高级编程语言码到一些有效率的字节码 (Bytecode),并运行这些字节码(Java/Python/ruby/perl) 3.以解释器包含的编译器对高级语言编译,并指示处理器运行编译后的程序 (例如:JIT)
-
编译器(complier):把源语言翻译为目标语言(编译过程通常为:从源代码(通常为高级语言)到能直接被计算机或虚拟机执行的目标代码(通常为低级语言或机器语言)的翻译过程)
-
虚拟机:通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统
-
linux虚拟机一种安装在Windows上的虚拟linux操作环境,就被称为linux虚拟机。它实际上只是个文件而已,是虚拟的linux环境,而非真正意义上的操作系统。但是它们的实际效果是一样的。
-
Java虚拟机(JVM)是Java Virtual Machine的缩写,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能模拟来实现的。Java虚拟机有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。
一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。
-
-
解释型语言和编译型语言
编译型语言:程序在执行之前需要一个专门的编译过程,把程序编译成为机器语言的文件,运行时不需要重新翻译,直接使用编译的结果就行了。程序执行效率高,依赖编译器,跨平台性差些。如C、C++、Delphi等。
解释型语言:在程序运行中,通过解释器对程序逐行作出解释(运行中逐行翻译),然后直接运行。如Ruby,但python也提供
-
C++编译过程:
预处理 编译器把源文件包含的头文件、预编译语句(宏定义)进行分析替换,生成预编译文件(.i). 编译 编译器进行语法分析、语义分析,语法检查无误后把代码翻译为汇编语言,将预编译文件(.i)转换为汇编代码,生成汇编文件(.s). 汇编 把编译阶段生成的汇编文件转化成机器代码,生成目标文件(.o). 链接 链接器将多个目标文件以期运行所需的库进行连接,生成可执行文件(.exe). -
Java程序也需要编译,但是没有直接编译称为机器语言,而是编译称为字节码,然后在Java虚拟机上用解释方式执行字节码,Java是一种先编译后解释的语言
-
Python是一个解释型的语言,但是为了效率上的考虑,Python也提供了编译的方法。编译之后是bytecode的形式。Python也提供了和Java类似的VM来执行这样的bytecode。
-
-
解释性语言比编译型语言执行慢的原因
解释器每次都必须去分析并转译它所运行到的程序行,而编译过的程序就只是直接运行
在解释器中,变量的访问也是比较慢的,因为每次要访问变量的时候它都必须找出该变量实际存储的位置,而不像编译过的程序在编译的时候就决定好了变量的位置