python编译过程,简述python编程语言的编译过程
Python进程和执行原理(1)python执行原理这里的解释是,执行是相对于编译执行而言的。众所周知,用C/C等编译语言编写的程序,需要从源文件转换成计算机使用的机器语言,再用链接器链接起来,形成二进制可执行文件。运行这个程序时,可以把二进制程序从硬盘加载到内存中运行。
但是对于python来说,Python源代码不需要编译成二进制代码,它可以直接从源代码运行程序。当我们运行python文件程序时,python解释器将源代码转换成字节码,然后python解释器执行这些字节码。这样python就不用担心编译程序,链接加载库等问题了。
对于python解释语言,有以下三个特性:
每次运行都需要转换成字节码,然后虚拟机把字节码转换成机器语言,最后才能在硬件上运行。与编译语言相比,每多一个编译链接的过程,性能肯定会受到影响;Python不需要每次都转换字节码。转换前,解释器会判断代码文件的修改时间是否与上次转换后的字节码pyc文件的修改时间一致,如果不一致,则再次转换。因为不用担心编译程序和链接库的问题,开发工作会更轻松。Python代码离机器底层更远,python程序更容易移植,基本上不需要改动就可以在多个平台上运行。在特定的计算机上实现一种语言,首先要确定的是代表该语言语义解释的虚拟计算机。一个关键问题是程序在执行过程中的基本表示是实际计算机的机器语言还是虚拟机的机器语言。这个问题决定了语言的实现。根据这个问题的答案,编程语言可以分为两类:编译语言和解释语言。
编译语言,如:C,C,Fortran,Pascal,Ada。编译语言编写的源程序需要编译、汇编、链接输出目标代码,然后机器执行目标代码。目标代码是由机器指令组成的,所以不能独立运行,因为源程序中使用了一些汇编程序无法解释的库函数,而这些库函数并不在源程序中。此时链接器需要完成外部引用和目标模板调用的链接任务,最终可以输出可执行代码。解释语言,解释器生成的不是目标机器码,而是中间代码,与机器码不同。中间代码的解释由软件支持,不能直接在硬件上使用。这种软件解释器通常会导致执行效率低下,用解释语言编写的程序由另一个能理解中间代码的解释器来执行。与编译后的程序不同,解释器的任务是把源代码的语句一条一条地解释成可执行的机器指令,而不是把源代码翻译成目标代码来执行。对于解释性语言,需要专门的解释器来执行程序,每一句话只有在执行的时候才能翻译出来。这种解释性语言每执行一次就翻译一次,所以效率很低。java解释器,Java比较特殊。Java需要编译,但不是直接编译成机器语言。而是编译成字节码,然后字节码在Java虚拟机上以解释的方式执行。python也采用类似的方式,先把python编译成Python字节码,然后由专门的Python字节码解释器负责解释和执行字节码。Python是一种解释性语言,但为了提高效率,它提供了一种编译方法。编译后,获得pyc文件,并存储字节码。Python类似于java,但java与python的不同之处在于python是一种解释性语言,所以编译字节码并不是强制操作。其实编译是一个自动化的过程,一般你不会关心它的存在。编译字节码可以节省加载模块的时间,提高效率。除了效率,字节码的形式也增加了逆向工程的难度,可以保护源代码。这只是一定程度的保护,反编译还是可以的。(二)Python内部执行过程一、编译过程概述我们在执行Python代码时,使用Python解释器中的四个过程来“反汇编”我们的代码,最后由CPU执行,返回给用户。
首先,当用户向Python键入一段代码进行处理时,会先进行词法分析。比如,当用户键入一个关键字或者输入的关键字出错时,就会被词法分析触发,不正确的代码不会被执行。
下一步,Python会做语法分析。例如,在“for i in test:”中,如果test后的冒号被写成其他符号,代码仍然不会被执行。
让我们进入最关键的过程。在执行Python之前,Python会生成一个. pyc文件,也就是字节码。如果我们不小心修改了字节码,Python下次重新编译程序的时候会和上次生成的字节码文件进行比较。如果不匹配,就会覆盖修改后的字节码文件,以保证每次编译后字节码的准确性。
那么什么是字节码呢?字节对应于Python虚拟机程序中的PyCodeObject对象。pyc文件是字节码在磁盘上的表示。简单来说,在编译代码的过程中,会先对代码中的函数、类等对象进行分类,然后生成字节码文件。有了字节码文件,CPU可以直接识别字节码文件进行处理,然后就可以执行Python了。
二。流程图python编译过程和执行原理(1)python执行原理这里的解释是,执行是相对于编译执行而言的。众所周知,用C/C等编译语言编写的程序,需要从源文件转换成计算机使用的机器语言,再用链接器链接起来,形成二进制可执行文件。运行这个程序时,可以把二进制程序从硬盘加载到内存中运行。
但是对于python来说,Python源代码不需要编译成二进制代码,它可以直接从源代码运行程序。当我们运行python文件程序时,python解释器将源代码转换成字节码,然后python解释器执行这些字节码。这样python就不用担心编译程序,链接加载库等问题了。
对于python解释语言,有以下三个特性:
每次运行都需要转换成字节码,然后虚拟机把字节码转换成机器语言,最后才能在硬件上运行。与编译语言相比,每多一个编译链接的过程,性能肯定会受到影响;Python不需要每次都转换字节码。转换前,解释器会判断代码文件的修改时间是否与上次转换后的字节码pyc文件的修改时间一致,如果不一致,则再次转换。因为不用担心编译程序和链接库的问题,开发工作会更轻松。Python代码离机器底层更远,python程序更容易移植,基本上不需要改动就可以在多个平台上运行。在特定的计算机上实现一种语言,首先要确定的是代表该语言语义解释的虚拟计算机。一个关键问题是程序在执行过程中的基本表示是实际计算机的机器语言还是虚拟机的机器语言。这个问题决定了语言的实现。根据这个问题的答案,编程语言可以分为两类:编译语言和解释语言。
编译语言,如:C,C,Fortran,Pascal,Ada。编译语言编写的源程序需要编译、汇编、链接输出目标代码,然后机器执行目标代码。目标代码是由机器指令组成的,所以不能独立运行,因为源程序中使用了一些汇编程序无法解释的库函数,而这些库函数并不在源程序中。此时链接器需要完成外部引用和目标模板调用的链接任务,最终可以输出可执行代码。解释语言,解释器生成的不是目标机器码,而是中间代码,与机器码不同。中间代码的解释由软件支持,不能直接在硬件上使用。这种软件解释器通常会导致执行效率低下,用解释语言编写的程序由另一个能理解中间代码的解释器来执行。与编译后的程序不同,解释器的任务是把源代码的语句一条一条地解释成可执行的机器指令,而不是把源代码翻译成目标代码来执行。对于解释性语言,需要专门的解释器来执行程序,每一句话只有在执行的时候才能翻译出来。这种解释性语言每执行一次就翻译一次,所以效率很低。java解释器,Java比较特殊。Java需要编译,但不是直接编译成机器语言。而是编译成字节码,然后字节码在Java虚拟机上以解释的方式执行。python也采用类似的方式,先把python编译成Python字节码,然后由专门的Python字节码解释器负责解释和执行字节码。Python是一种解释性语言,但为了提高效率,它提供了一种编译方法。编译后,获得pyc文件,并存储字节码。Python类似于java,但java与python的不同之处在于python是一种解释性语言,所以编译字节码并不是强制操作。其实编译是一个自动化的过程,一般你不会关心它的存在。编译字节码可以节省加载模块的时间,提高效率。除了效率,字节码的形式也增加了逆向工程的难度,可以保护源代码。这只是一定程度的保护,反编译还是可以的。(二)Python内部执行过程一、编译过程概述我们在执行Python代码时,使用Python解释器中的四个过程来“反汇编”我们的代码,最后由CPU执行,返回给用户。
首先,当用户向Python键入一段代码进行处理时,会先进行词法分析。比如,当用户键入一个关键字或者输入的关键字出错时,就会被词法分析触发,不正确的代码不会被执行。
下一步,Python会做语法分析。例如,在“for i in test:”中,如果test后的冒号被写成其他符号,代码仍然不会被执行。
让我们进入最关键的过程。在执行Python之前,Python会生成一个. pyc文件,也就是字节码。如果我们不小心修改了字节码,Python下次重新编译程序的时候会和上次生成的字节码文件进行比较。如果不匹配,就会覆盖修改后的字节码文件,以保证每次编译后字节码的准确性。
那么什么是字节码呢?字节对应于Python虚拟机程序中的PyCodeObject对象。pyc文件是字节码在磁盘上的表示。简单来说,在编译代码的过程中,会先对代码中的函数、类等对象进行分类,然后生成字节码文件。有了字节码文件,CPU可以直接识别字节码文件进行处理,然后就可以执行Python了。
二、流程图
三。编译字节码Python中有一个内置函数compile(),可以将源文件编译成codeobject。首先,看一下这个函数的描述:
编译(.)compile(source,filename,mode[,flags[,dont_inherit]]) -代码对象
1:源文件的内容字符串。
2:源文件的名称
参数:exec-compile模块,单编译一条语句,eval(232,232,232);颜色:rgb(38,38,38);边距:0px填充:0px背景:rgb(249,249,249);#src_file.py
#一些功能
定义f(d=0):
c=1
打印“你好”
a=9
b=8
f()
A=打开( src _ file.py , r )。read () #在命令行模式下打开源文件进行编译。
co=编译(a, src_file , exec )
类型(co)
Type code #编译了codeobject。四。codeobject的属性是什么变量?我们来分析一下上一节的内容:
打印公司名称#所有符号名称
( f , a , b )
打印co.co_name #模块名、函数名、类名
组件
打印co.co_consts #常量集,函数f和两个int常量a,b,d。
(0,0xb7273b18处的代码对象f,文件“src_file”,第2,9,8行,无)
打印co.co常数[1]。co _ varnames #可以看到F函数也是codeobject,打印F中的局部变量。
( c ,)
打印co.co_code #字节码指令
dZdZdZedS
打印co.co _常数[1]的起始行号。文件中的co _ firstlineNo #代码块
2
打印co.co_stacksize #代码堆栈大小
2
打印公司.公司_文件名#文件名
src_file #模块名、函数名、类名codeobject的Co_code表示字节码。这个字节码是什么意思?我们可以使用dis模块反编译python:
进口dis
dis.dis(co)
输出
2 0 LOAD_CONST 0 (0)
3 LOAD _ CONST 1(0xb 7273 b 18处的代码对象f,文件‘src _ file’,第2行)
6 MAKE _功能1
9商店名称0 (f)
5 12载荷常数2 (9)
15商店名称1 (a)
6 18载荷常数3 (8)
21商店名称2 (b)
7 24加载名称0 (f)
27调用函数0
30流行顶
31 LOAD_CONST 4(无)
3RETURN _ VALUE从反编译的结果来看,python字节码实际上是一个仿x86汇编,将代码编译成一条指令,交给虚拟cpu执行。
第1列:行号第2列:指令在代码块中的偏移量第3列:指令第4列:操作数第5列:操作数描述期待陌生,拥抱惊喜。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。