转载地址:http://blog.csdn.net/zv3e189os5c0tsknrbcl/article/details/78661641java
有人在讨论 Python 代码是编译执行仍是解释执行?这个问题还能够换一种说法: Python 是编译型语言仍是解释型语言?回答这个问题前,咱们先弄清楚什么是编译型语言,什么是解释型语言。编程
所谓编译执行就是源代码通过编译器编译处理,生成目标机器码,就是机器能直接运行的二进制代码,下次运行时无需从新编译。不过它是针对特定CPU体系的,这些目标代码只能在特定平台执行,若是这个程序须要在另一种 CPU 上面运行,这个代码就必须从新编译。它不具有可移植性,可是执行速度快,C、C++这类语言属于编译型语言。jvm
而解释型语言是在代码运行期间逐行翻译成目标机器码,下次执行时,仍是须要逐行解释,咱们能够简单认为 Java、Python 都是解释型语言。spa
注:操作系统
有人说Java是编译型的。由于全部的Java代码都是要编译的,.java不通过编译就没法执行。.net
也有人说Java是解释型的。由于java代码编译后不能直接运行,它是解释运行在JVM上的,因此它是解释型的。翻译
因此不少地方都说“java是一种半编译、半解释执行”的语言;3d
对于C和C++,它们通过一次编译以后,能够由操做系统直接执行,因此它们是编译型语言。而Java不同,它首先由编译器编译成.class(字节码)文件,而后在经过JVM从.class文件中读一行解释执行一行,因此它是解释型的语言。也正是因为java对于多种不一样的操做系统有不一样的JVM,因此实现了真正意义上的跨平台。blog
编译型至关于厨师直接作好一桌子菜,顾客来了直接开吃,而解释型就像吃火锅,厨师把菜洗好,顾客须要本身动手边煮边吃,效率上来讲解释型语言天然比不过编译型语言,固然也不是绝对了,像 JIT 的效率就很高资源
以上是对编译型语言和解释型语言的一个简单粗暴的区分,可是 Python(这里主要是指CPython)并非严格的解释型语言,由于 Python 代码在运行前,会先编译(翻译)成中间代码,每一个 .py 文件将被换转成 .pyc 文件,.pyc 就是一种字节码文件,它是与平台无关的中间代码,无论你放在 Windows 仍是 Linux 平台均可以执行,运行时将由虚拟机逐行把字节码翻译成目标代码。
咱们安装Python 时候,会有一个 Python.exe 文件,它就是 Python 解释器,你写的每一行 Python 代码都是由它负责执行,解释器由一个编译器和一个虚拟机构成,编译器负责将源代码转换成字节码文件,而虚拟机负责执行字节码,因此,解释型语言其实也有编译过程,只不过这个编译过程并非直接生成目标代码,而是中间代码(字节码),而后再经过虚拟机来逐行解释执行字节码。
总结
Python代码首先会编程一个字节码文件,再由虚拟机逐行解释,把每一行字节码代码翻译成目标指令给CPU执行。
编译型语言和解释型语言的优缺点:
编译型语言在程序执行以前,有一个单独的编译过程,将程序翻译成机器语言就不用再进行翻译了。
解释型语言,是在运行的时候将程序翻译成机器语言,因此运行速度相对于编C/C++ 等都是编译型语言,而Java,C#等都是解释型语言。
虽然Java程序在运行以前也有一个编译过程,可是并非将程序编译成机器语言,而是将它编译成字节码(能够理解为一个中间语言)。在运行的时候,由JVM将字节码再翻译成机器语言。
注:脚本语言通常都有相应的脚本引擎来解释执行。 他们通常须要解释器才能运行。JAVASCRIPT,ASP,PHP,PERL,Nuva都是脚本语言。C/C++编译、连接后,可造成独立执行的exe文件。
①编译型:优势:运行速度快,代码效率高,编译后的程序不可修改,保密性较好。
缺点:代码须要通过编译方可运行,可移植性差(java可移植性好,java利用jvm实现跨平台),只能在兼容的操做系统上运行。
②解释型:优势:可移植性较好,只要有解释环境,可在不一样的操做系统上运行。 缺点:运行须要解释环境,运行起来比编译的要慢,占用资源也要多一些,代码效率低,代码修改后就可运行,不须要编译过程。