python解释器和python代码的运行过程

很多人会写python代码,但少有人能说清楚python代码是怎么运行起来的,这里做个分享。

Python解释器

python代码由解释器运行,Python解释器由多个组件构成,包括以下几个主要部分:
解析器(Parser):解析器负责将Python程序源代码转换成一棵抽象语法树(AST),这是程序在内部表示的形式。
编译器(Compiler):编译器将AST编译成Python字节码,这是一种与平台无关的中间代码,可以被Python虚拟机执行。
虚拟机(Virtual Machine):Python虚拟机是一个执行Python字节码的虚拟机,它模拟了一个计算机的运行环境,并实现了Python语言的语义和功能。
标准库(Standard Library):Python标准库是一组常用的模块和函数,它们提供了很多有用的功能,如文件操作、网络编程、多线程处理、加密解密等。
内存管理器(Memory Manager):Python解释器的内存管理器负责管理Python程序使用的内存,包括分配和释放内存,以及垃圾回收等。
扩展机制(Extension Mechanism):Python解释器还提供了丰富的扩展机制,可以通过编写C语言扩展模块、使用JIT技术等方式来扩展Python的功能和性能。
这些组件共同构成了Python解释器的核心部分,它们协同工作,完成Python程序的编译和执行,提供了Python编程语言的核心功能和优雅的编程体验。

python代码的运行过程

python代码是在python解释器中运行的,运行过程包括1、词法分析  2、语法分析  3、编译  4、执行。
一:词法分析
Python解释器的词法分析(Lexical Analysis)是指将源代码的字符流转换为标记(Token)序列的过程。在这个过程中,解释器会扫描源代码中的每个字符,并将它们组合成具有意义的标记,例如变量名、关键字、运算符、括号等。
具体来说,Python解释器的词法分析过程主要包括以下几个步骤:
1、去除无用字符:解释器会先去除源代码中的注释、空格、制表符等无用字符,以便更好地处理源代码。
2、将字符流划分为单词(Token):解释器会按照一定的规则,将源代码中的字符流划分为一个个单词,每个单词表示一个具有特定含义的标记。例如,if、else、for等是Python的关键字,+、-、*、/等是Python的运算符。
3、将单词转换为标记:解释器会将划分好的单词转换为相应的标记,并为每个标记添加类型信息和值信息,以便后续的语法分析和执行。例如,if标记的类型是关键字,值是字符串if;+标记的类型是运算符,值是字符串+。

二:语法分析
Python解释器的语法分析(Syntactic Analysis)是指将词法分析得到的标记序列转换成语法树的过程。在这个过程中,解释器会检查标记序列是否符合Python语法的规则,将符合规则的标记组合成一棵语法树,表示源代码的语法结构。
具体来说,Python解释器的语法分析过程主要包括以下几个步骤:
确定语法规则:解释器会根据Python语言的语法规则,确定语法分析的规则和算法。
解析标记序列:解释器会从词法分析得到的标记序列中,逐个读取标记,并按照语法规则进行解析。
生成语法树:解释器会根据语法规则,将标记序列解析成一棵语法树。在语法树中,每个节点表示一个语法结构,例如表达式、语句、函数等。
检查语法错误:如果标记序列不符合Python语法规则,解释器会报告语法错误,并给出错误的位置和原因。
语法树(Syntax Tree),也称为抽象语法树(Abstract Syntax Tree,AST),可以类比理解成xml或html、json,是编译器、解释器等程序在解析源代码时生成的一种数据结构。它通过分析源代码的语法结构,将代码转化成一种树状结构,
从而便于程序对代码的理解和处理。
在语法树中,每个节点代表源代码中的一个语法结构,如表达式、语句、函数定义等。节点之间的关系表示了语法结构之间的嵌套关系和依赖关系。根据语法树的构建方法不同,它的形态也会有所不同。通常,语法树的节点包含以下信息:
类型信息:节点代表的语法结构类型,如表达式、语句、函数定义等。
值信息:节点代表的具体值或变量名等信息。
子节点:当前节点的下一级节点,表示当前节点嵌套的语法结构。
通过构建语法树,程序可以更好地理解源代码的语法结构,并进行语义分析、优化等操作。
三:编译
将上面两步执行的结果,按照规则编译成字节码并输出字节码文件(.pyc)中。Python的编译过程是一种增量编译方式,即只有在源代码或依赖发生变化时才会重新编译。
这是通过比较源代码的修改时间和.pyc文件的修改时间来实现的。如果源代码没有被修改,而.pyc文件已经存在,则Python解释器会直接加载.pyc文件并执行,从而加速程序的启动和执行。
四:执行
Python解释器执行字节码的过程通常分为以下几个步骤:

加载字节码:Python解释器从.pyc文件中加载字节码,并将其存储在内存中。

解释执行:Python解释器对字节码进行解释执行,从字节码中读取指令并执行相应的操作。例如,如果遇到LOAD_CONST指令,则将常量推入堆栈;如果遇到CALL_FUNCTION指令,则执行函数调用操作。

内存管理:Python解释器在执行过程中需要进行内存管理,例如为对象分配内存、释放不再使用的内存等。Python解释器使用垃圾回收机制来自动管理内存,从而避免了手动释放内存的繁琐操作。

异常处理:如果在执行字节码的过程中发生了异常,Python解释器将根据异常处理机制执行相应的异常处理操作。通常情况下,Python解释器会将异常信息打印到标准错误流中,并终止程序的执行。

需要注意的是,Python解释器是一种动态解释器,它在执行字节码的过程中会动态地对对象进行类型检查和转换。这种动态特性使得Python解释器具有很高的灵活性和表达能力,但同时也会降低程序的执行效率。为了提高程序的执行效率,Python解释器通常会将一些高频使用的函数和模块实现为C语言扩展,从而实现更快的执行速度。

总结:
运行python代码,解释器申请内存空间,Python解释器的解析器完成词法、语法解析将源代码解析成语法树,编译器将语法树编译成一连串字节码写入字节码文件,然后Python解释器会创建一个虚拟机实例,python虚拟机加载字节码文件和标准库(第三方库在代码执行时由语法在内存空间中加载或删除),解释器通过JIT(即时编译器)按照字节码顺序将字节码编译成可以被计算机系统执行的机器码,并下发机器码执行。

值得注意的是,解释器在加载标准库和第三方库时会在自己
同级目录往下查找,因为这样的设计,当我们在不同目录中安装python即可获得完全隔离的两个运行环境。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值