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使用Flask框架同时上传多个文件的方法
Mar 21 Python
Python中的列表生成式与生成器学习教程
Mar 13 Python
Python的网络编程库Gevent的安装及使用技巧
Jun 24 Python
Python如何实现文本转语音
Aug 08 Python
PYTHON 中使用 GLOBAL引发的一系列问题
Oct 12 Python
python网络爬虫学习笔记(1)
Apr 09 Python
对python-3-print重定向输出的几种方法总结
May 11 Python
Python实现的多项式拟合功能示例【基于matplotlib】
May 15 Python
python把数组中的数字每行打印3个并保存在文档中的方法
Jul 17 Python
Django urls.py重构及参数传递详解
Jul 23 Python
python操作cfg配置文件方式
Dec 22 Python
基于keras中的回调函数用法说明
Jun 17 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
CodeIgniter上传图片成功的全部过程分享
2013/08/12 PHP
php安装xdebug/php安装pear/phpunit详解步骤(图)
2013/12/22 PHP
ThinkPHP使用smarty模板引擎的方法
2014/07/01 PHP
使用PHP实现阻止用户上传成人照片或者裸照
2014/12/25 PHP
php单例模式示例分享
2015/02/12 PHP
php类的定义与继承用法实例
2015/07/07 PHP
PHP中Trait及其应用详解
2017/02/14 PHP
yii2中dropDownList实现二级和三级联动写法
2017/04/26 PHP
PHP实现字母数字混合验证码功能
2019/07/11 PHP
PHP实现简易用户登录系统
2020/07/10 PHP
php中给js数组赋值方法
2014/03/10 Javascript
JavaScript实现的内存数据库LokiJS介绍和入门实例
2014/11/17 Javascript
分享9点个人认为比较重要的javascript 编程技巧
2015/04/27 Javascript
基于javascript实现图片懒加载
2016/01/05 Javascript
Node.js的Web模板引擎ejs的入门使用教程
2016/06/06 Javascript
JS实现用户注册时获取短信验证码和倒计时功能
2016/10/27 Javascript
vue移动端实现下拉刷新
2018/04/22 Javascript
详解几十行代码实现一个vue的状态管理
2019/01/28 Javascript
小程序实现按下录音松开识别语音
2019/11/22 Javascript
[04:02]2014DOTA2国际邀请赛 BBC每日综述中国战队将再度登顶
2014/07/21 DOTA
[10:05]DOTA2-DPC中国联赛 正赛 iG vs PSG.LGD 选手采访
2021/03/11 DOTA
python根据出生日期获得年龄的方法
2015/03/31 Python
Python实现分割文件及合并文件的方法
2015/07/10 Python
学习python类方法与对象方法
2016/03/15 Python
Python cookbook(字符串与文本)在字符串的开头或结尾处进行文本匹配操作
2018/04/20 Python
python接口自动化测试之接口数据依赖的实现方法
2019/04/26 Python
Python Flask上下文管理机制实例解析
2020/03/16 Python
Python的Django框架实现数据库查询(不返回QuerySet的方法)
2020/05/19 Python
Sentry错误日志监控使用方法解析
2020/11/12 Python
如何处理简单的PHP错误
2015/10/14 面试题
食品采购员岗位职责
2014/04/14 职场文书
禁毒宣传标语
2014/06/19 职场文书
幼儿园大班毕业评语
2014/12/31 职场文书
党课主持词大全
2015/06/30 职场文书
爱心捐款倡议书:点燃希望,传递温暖
2019/11/04 职场文书
python基础学习之生成器与文件系统知识总结
2021/05/25 Python