Python解释执行原理
谈到了Python语句的两种执行方式,实际上,这两种运行方式在本质 上是相同的,它们都是由解释器来解释执行我们提供的Python语句。 这里所说的解释执行是相对于编译执行而言的。我们知道,使用诸如 C或C++之类的编译性语言编写的程序可以从源文件转换成计算机使用 的机器语言, 经连接器连接后形成二进制可执行文件。当我们运行二进制可执行程 序的时候,因为已经编译好了,所以加载器软件把二进制程序从硬盘 载入内存中并运行。
与之不同,Python语言写的程序不需要编译成二进制代码,它可以直 接从源代码运行程序。当我们运行Python文件程序的时候, Python解释器把源代码转换成中间形式:字节码,然后再由Python虚 拟机来执行这些字节码,如图5所示。 这样的话,我们就用不着担心程序的编译,库的连接加载等问题了, 所有这些工作都由Python虚拟机代劳了。 对于Python的解释语言特性,我们要一分为二的看待。一方面,每次 运行时都要进行转换成 字节码,然后再由虚拟机把字节码转换成机器语言,最后才能在硬件 上运行。较之于编译性 编程 语言,每次运行都会多出两道工序,所以它的性能会受到影响。另一 方面,由于不用关心程 序的编译以及库的连接等问题,所以开发工作会变得更轻松;同时虚 拟机距离物理机器更远 了, 所以Python程序更加易于移植,实际上无需改动就能在多种平台上运 行。
1. 在具体计算机上实现一种语言,首先要确定的是表示该语言语义解释 的虚拟计算机,一个关键的问题是程序执行时的基本表示是实际计算 机上的机器语言还是虚拟机 的机器语言。这个问题决定了语言的实现。根据这个问题的回答,可 以将程序设计语言划分为两大类:编译型语言和解释型语言。
2. 由编译型语言编写的源程序需要经过编译、汇编和链接才能输出目标 代码,然后机器执行目标代码,得出运行结果,目标代码由机器指令 组成,一般不能独立运行, 因为源程序中可能使用了某些汇编程序不能解释引用的库函数,而库 函数代码又不在源程序中,此时还需要链接程序完成外部引用和目标 模块调用的链接任务,最后 输出可执行代码。C、C++、Fortran、Pascal、Ada都是编译实现的。
3. 解释型语言的实现中,翻译器并不产生目标机器代码,而是产生易于 执行的中间代码,这种中间代码与机器代码是不同的,中间代码的解 释是由软件支持的,不能直接 使用硬件,软件解释器通常会导致执行效率较低。用解释型语言编写 的程序是由另一个可以理解中间代码的解释程序执行的
相关文档:
开发环境:Ubuntu9.10,python2.6,gcc4.4.11,ubuntu下的python运行包和开发包是分开的,因此需要在新利得里面安装python-all-dev,从而可以在代码中引用python的头文件和库。2.下面是一个最简单的可以供python调用的c扩展模块,假设c程序文件名为foo.c:代码#include <Python.h>
static PyObject* foo_b ......
myDict = { 'item1' : [ 7, 1, 9], 'item2' : [8, 2, 3], 'item3' : [ 9, 3, 11 ] }
def sortDic(Dict,valuePostion):
return sorted(Dict.items(),key=lambda e:e[1][valuePostion])
//按value的第3个值排序
sortDic(myDict,2)
[('item2', [8, 2, 3]), ('item1', [7, 1, 9]), ('item3', [9, 3, 11])]
//按value的第 ......
在C语言中,三目运算经常用到(cond?a:b),非常的简洁,而在Python中不支持这种语法。
但是,可以用Python中and or来实现(这里是有陷阱的,下面会讲到)
我们来看下面几个表达式
>>> False
or 1
1
>>> False
or 0
0
>>> True or
0
True
>>> True
and 1
1
>> ......
上一篇里的LAME项目已经展示了python如何与C语言交互,但程序仍不够理想,在python这一端仅仅是传递源文件和目标文件的路径,再调用C模块的encode方法来进行编码,但问题在于你无法控制encode函数,比如你想编码的源文件如果不是原始数据,而是wav文件或者其他格式呢?对于这个问题,有两种方法可以选择,一种模仿前面的C模 ......