Python解释执行原理分析


Posted in Python onAugust 22, 2014

本文较为详细的分析了Python解释执行的原理,对于深入理解Python可以起到一定的帮助作用。具体分析如下:

首先,这里的解释执行是相对于编译执行而言的。我们都知道,使用C/C++之类的编译性语言编写的程序,是需要从源文件转换成计算机使用的机器语言,经过链接器链接之后形成了二进制的可执行文件。运行该程序的时候,就可以把二进制程序从硬盘载入到内存中并运行。

但是对于Python而言,python源码不需要编译成二进制代码,它可以直接从源代码运行程序。当我们运行python文件程序的时候,python解释器将源代码转换为字节码,然后再由python解释器来执行这些字节码。这样,python就不用担心程序的编译,库的链接加载等问题了。

对于python解释语言,有以下3方面的特性:

1.每次运行都要进行转换成字节码,然后再有虚拟机把字节码转换成机器语言,最后才能在硬件上运行。与编译性语言相比,每次多出了编译和链接的过程,性能肯定会受到影响。

2.由于不用关心程序的编译和库的链接等问题,开发的工作也就更加轻松啦。

3.python代码与机器底层更远了,python程序更加易于移植,基本上无需改动就能在多平台上运行。

在具体计算机上实现一种语言,首先要确定的是表示该语言语义解释的虚拟计算机,一个关键的问题是程序执行时的基本表示是实际计算机上的机器语言还是虚拟机的机器语言。这个问题决定了语言的实现。根据这个问题的回答,可以将程序设计语言划分为两大类:编译型语言和解释型语言。

1.编译实现的语言,如:C、C++、Fortran、Pascal、Ada。由编译型语言编写的源程序需要经过编译,汇编和链接才能输出目标代码,然后由机器执行目标代码。目标代码是有机器指令组成,不能独立运行,因为源程序中可能使用了一些汇编程序不能解释引用的库函数,而库函数又不在源程序中,此时还需要链接程序完成外部引用和目标模板调用的链接任务,最后才能输出可执行代码。

2.解释型语言,解释器不产生目标机器代码,而是产生中间代码,这种中间代码与机器代码不同,中间代码的解释是由软件支持的,不能直接使用在硬件上。该软件解释器通常会导致执行效率较低,用解释型语言编写的程序是由另一个可以理解中间代码的解释程序执行的。和编译的程序不同的是, 解释程序的任务是逐一将源代码的语句解释成可执行的机器指令,不需要将源程序翻译成目标代码再执行。对于解释型语言,需要一个专门的解释器来执行该程序,每条语句只有在执行是才能被翻译,这种解释型语言每执行一次就翻译一次,因而效率低下。

3.Java解释器,java很特殊,java是需要编译的,但是没有直接编译成机器语言,而是编译成字节码,然后在Java虚拟机上用解释的方式执行字节码。Python也使用了类似的方式,先将python编译成python字节码,然后由一个专门的python字节码解释器负责解释执行字节码。

4.python是一门解释语言,但是出于效率的考虑,提供了一种编译的方法。编译之后就得到pyc文件,存储了字节码。python这点和java很类似,但是java与python不同的是,python是一个解释型的语言,所以编译字节码不是一个强制的操作,事实上,编译是一个自动的过程,一般不会在意它的存在。编译成字节码可以节省加载模块的时间,提高效率。

5.除了效率之外,字节码的形式也增加了反向工程的难度,可以保护源代码。这个只是一定程度上的保护,反编译还是可以的。

相信本文所述对于大家深入理解Python可以起到一定的促进作用。

Python 相关文章推荐
Python入门篇之面向对象
Oct 20 Python
Python实现字典的key和values的交换
Aug 04 Python
Python3使用requests包抓取并保存网页源码的方法
Mar 15 Python
Python实现字符串格式化输出的方法详解
Sep 20 Python
python TCP Socket的粘包和分包的处理详解
Feb 09 Python
对python多线程SSH登录并发脚本详解
Feb 14 Python
python反编译学习之字节码详解
May 19 Python
django之导入并执行自定义的函数模块图解
Apr 01 Python
python中not、and和or的优先级与详细用法介绍
Nov 03 Python
python制作一个简单的gui 数据库查询界面
Nov 19 Python
python3 googletrans超时报错问题及翻译工具优化方案 附源码
Dec 23 Python
Python借助with语句实现代码段只执行有限次
Mar 23 Python
Python实现的石头剪子布代码分享
Aug 22 #Python
Python使用MD5加密字符串示例
Aug 22 #Python
Python中让MySQL查询结果返回字典类型的方法
Aug 22 #Python
Python安装Imaging报错:The _imaging C module is not installed问题解决方法
Aug 22 #Python
Python with的用法
Aug 22 #Python
Tornado服务器中绑定域名、虚拟主机的方法
Aug 22 #Python
python with statement 进行文件操作指南
Aug 22 #Python
You might like
PHP网页游戏学习之Xnova(ogame)源码解读(十五)
2014/06/30 PHP
jQuery 点击图片跳转上一张或下一张功能的实现代码
2010/03/12 Javascript
js location.replace与location.reload的区别
2010/09/08 Javascript
原生js操作checkbox用document.getElementById实现
2013/10/12 Javascript
Jquery 在页面加载后执行的几种方式
2014/03/14 Javascript
js点击列表文字对应该行显示背景颜色的实现代码
2015/08/05 Javascript
jquery实现滑动特效代码
2015/08/10 Javascript
详解Matlab中 sort 函数用法
2016/03/20 Javascript
jQuery中的each()详细介绍(推荐)
2016/05/25 Javascript
js检查是否关闭浏览器的方法
2016/08/02 Javascript
Bootstrap Table使用方法解析
2016/10/19 Javascript
React创建组件的三种方式及其区别
2017/01/12 Javascript
Angularjs 实现移动端在线测评效果(推荐)
2017/04/05 Javascript
React性能优化系列之减少props改变的实现方法
2019/01/17 Javascript
js比较两个单独的数组或对象是否相等的实例代码
2019/04/28 Javascript
express启用https使用小记
2019/05/21 Javascript
JS实现的雪花飘落特效示例
2019/12/03 Javascript
vue中的过滤器及其时间格式化问题
2020/04/09 Javascript
Bootstrap table 服务器端分页功能实现方法示例
2020/06/01 Javascript
[52:22]EG vs VG Supermajor小组赛B组 BO3 第一场 6.2
2018/06/03 DOTA
python3访问sina首页中文的处理方法
2014/02/24 Python
MySQLdb ImportError: libmysqlclient.so.18解决方法
2014/08/21 Python
详解python之简单主机批量管理工具
2017/01/27 Python
Python模拟登陆实现代码
2017/06/14 Python
Python实现树的先序、中序、后序排序算法示例
2017/06/23 Python
从头学Python之编写可执行的.py文件
2017/11/28 Python
使用Django开发简单接口实现文章增删改查
2019/05/09 Python
python实现列表的排序方法分享
2019/07/01 Python
如何使用PyCharm引入需要使用的包的方法
2020/09/22 Python
美国汽配连锁巨头Pep Boys官网:轮胎更换、汽车维修服务和汽车零部件
2017/01/14 全球购物
会计与审计专业自荐信范文
2014/03/15 职场文书
实习生评语
2014/04/26 职场文书
动画设计系毕业生求职信
2014/07/15 职场文书
幼儿园推普周活动总结
2015/05/07 职场文书
2016大学生毕业实习心得体会
2016/01/23 职场文书
小学语文教师竞聘演讲稿范文
2019/08/09 职场文书