解释性语言和编译性语言:
计算机不能直接理解高级语言,只能直接理解机器语言,所以必须要把高级语言翻译成机器语言,计算机才能执行高级语言编写的程序。 翻译的方式有两种:编译 和 解释。两种知识翻译的时间不同。
解释性的定义: 不需要编译,在运行程序的时候才翻译,每个语句都是执行的时候才翻译。这样解释性语言每执行一次就需要逐行翻译一次,效率低。 现代解释性语言把源程序编译成中间代码,然后用解释器把中间代码一条条翻译成目标机器代码一条条执行。
编译性语言的定义: 编译性语言写的程序在被执行之前,需要一个专门的编译过程,把程序编译成机器语言的文件,比如exe。运行就直接使用编译的结果文件。执行效率高。
java解释器:java很特殊,java是需要编译的,但是没有直接编译成机器语言,而是编译成字节码,然后在java虚拟机上用解释的方式执行字节码。python也是使用了类似的方式。> Python是一门解释语言:** 但是处于效率的考虑,提供了一种编译的方法,编译之后就得到pyc文件,存储了字节码。python这一点与java很类似,但是java与python不同的是, python是一门解释语言,所以编译字节码不是一个强制的操作。 事实上编译是一个自动的过程,一般不会在一它的存在。编译成字节码可以节省加载模块的时间。提高效率
字节码除了提高效率,还增加了反向工程的难度,可以保护源代码。
python的编译过程和执行原理
1. python的执行原理
这里的解释执行是当对于编译执行而言的。
C/C++之类的编译性语言编写的程序,是需要从源文件转换成计算机使用的机器语言,经过链接器链接之后形成了二进制的可执行文件。运行该程序的时候就可以把二进制程序从硬盘载入到内存中并运行
但是对于Python而言,python源码不需要编译成二进制代码,它可以直接从源代码运行程序。当我们运行python文件程序的时候,python解释器将源代码转换为字节码,然后再由python解释器来执行这些字节码。这样,python就不用担心程序的编译,库的链接加载等问题了。
对于python解释语言,有以下3特性:
- 每次运行都要进行转换成字节码,然后再有虚拟机把字节码转换成机器语言,最后才能在硬件上运行。与编译性语言相比,每次多出了编译和链接的过程,性能肯定受到影响;而python并不是每次都需要转换字节码,解释器在转换之前会判断代码文件的修改时间是否与上一次转换后的字节码pyc文件的修改时间一致,若不一致才会重新转换
- 由于不用关心程序的编译和库的链接等问题,开发的工作也就更加轻松啦。
- python代码与机器底层更远了,python程序更加易于移植,基本上无需改动就能在多平台上运行。
2. Python的内部执行过程
1 过程概述
当我们执行Python代码的时候,在Python解释器用四个过程“拆解”我们的代码,最终被CPU执行返回给用户。
- 首先当用户键入代码交给Python处理的时候会先进行词法分析,例如用户键入关键字或者当输入关键字有误时,都会被词法分析所触发,不正确的代码将不会被执行。
- 下一步Python会进行语法分析,例如当”for i in test:”中,test后面的冒号如果被写为其他符号,代码依旧不会被执行。
- 在执行Python代码前,python会生成.pyc文件,这个文件就是字节码。python下次重新编译该程序时会和其上次生成的字节码文件进行比较,如果不匹配则会将修改过的字节码文件进行覆盖,以确保每次编译后字节码的准确性。
字节码
字节码在Python虚拟机程序里对应的是PyCodeObject对象。.pyc文件是字节码在磁盘上的表现形式。简单来说就是在编译代码的过程中,首先会将代码中的函数、类等对象分类处理,然后生成字节码文件。有了字节码文件,CPU可以直接识别字节码进行处理,接着python就可以执行了。
C语言的程序编译与链接
Build过程可以分解为4个步骤:
预处理(pre-processing),编译(Compilation),汇编(Assembly),链接(Linking)
1. 预处理 pre-processing
预编译过程主要处理那些源文件中以“#”开始的预编译指令,主要处理规则有:
- 将所有“#define”删除,并展开所用的宏定义
- 处理所有条件预编译指令,比如“#if”,“#ifdef”,“#elif”,“#endif”
- 处理“#include”预编译指令,将被包含的文件插入到该编译指令的位置,该过程是递归进行的
- 删除所有注释
- 添加行号和文件名标识,以便于编译时编译器产生调试用的信号信息以及用于编译时产生编译错误或者警告时可显示行号
- 保留所有的#pragma编译器指令
2. 编译
编译过程就是把预处理完的文件进行一系列的词法分析、语法分析、语义分析以及优化后生成响应的汇编代码文件。这个过程是整个程序构建的核心部分。
3. 汇编
汇编器就是将汇编代码转换成机器可以执行的指令,每一个汇编语句几乎都是一条机器指令。经过编译、链接、汇编直接输出的文件称为目标文件(Object File)
4. 链接
链接的主要内容就是把各个模块之间相互引用的部分处理好,使得各个模块可以正确的拼接。链接的主要过程包括 地址和空间的分配(Address and Storage Allocation)、符号决议(Symbol Resolution)和重定位(Relocation)等。
