首页 > 编程知识 正文

python一步一步运行,python显示编译过程

时间:2023-05-06 21:16:56 阅读:23578 作者:785

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是解释器类型的语言,因此编译字节码不是强制操作。 事实上,编译是一个自动化的过程,一般不在乎它的存在。 编译成字节码可以节省加载模块的时间和提高效率。 除了效率,字节码的形式也增加了逆向工程的难度,可以保护源代码。 这是一定程度的保护,可以反向编译。 )2) Python内部运行进程1,编译进程概述运行Python代码时,用Python解释器在四个进程中“分解”我们的代码,最终在CPU上运行并返回给用户。

首先,当用户输入代码并交给Python处理时,词法分析将首先进行。 例如,如果用户输入关键字或输入关键字有误,则会触发词法分析,而不会执行不正确的代码。

然后Python进行语法分析。 例如,如果在“for i in test:”中将测试后的冒号写为另一个符号,则不会执行代码。

接下来进入最重要的过程。 在运行Python之前,Python将生成. pyc文件。 此文件是字节码。 如果错误地修改了字节码,Python将在下次重新编译程序时与上次生成的字节码文件进行比较,如果不匹配,则复盖修改的字节码文件,以确保编译后字节码的正确性。

那么字节码是什么? 字节码在Python管理程序中与PyCodeObject对象相对应。 pyc文件是磁盘上字节码的表示形式。 简单来说,在编译代码的过程中,首先对代码中的函数、类等对象进行分类处理,生成字节码文件。 有了字节码文件,CPU就可以直接识别和处理字节码文件,然后Python就可以运行了。

二.流程图解

三.编译字节码p

ython中有一个内置函数compile(),可以将源文件编译成codeobject,首先看这个函数的说明:

  compile(...) compile(source, filename, mode[, flags[, dont_inherit]]) -> code object

  参数1:源文件的内容字符串

  参数2:源文件名称

  参数3:exec-编译module,single-编译一个声明,eval-编译一个表达式 一般使用前三个参数就够了

  使用示例:

1

2

3

4

5

6

7

8

9

10

11

12

13

#src_file.py

#some function

def f(d=0):

    c=1

    print "hello"

a=9

b=8

f()

 

>>> a=open('src_file.py','r').read()    #命令行模式中打开源文件进行编译

>>> co=compile(a,'src_file','exec')

>>> type(co)

<type 'code'>    #编译出了codeobject对象

四、codeobject对象的属性

  codeobject有哪些变量,接上节的内容分析一下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

>>> print co.co_names    #所有的符号名称

('f', 'a', 'b')

 

>>> print co.co_name    #模块名、函数名、类名

<module>

 

>>> print co.co_consts    #常量集合、函数f和两个int常量a,b,d

(0, <code object f at 0xb7273b18, file "src_file", line 2>, 9, 8, None)

 

>>> print co.co_consts[1].co_varnames    #可以看到f函数也是一个codeobject,打印f中的局部变量

('c',)

 

>>> print co.co_code    #字节码指令

dZdZdZedS

 

>>> print co.co_consts[1].co_firstlineno    #代码块在文件中的起始行号

2

 

>>> print co.co_stacksize    #代码栈大小

2

 

>>> print co.co_filename    #文件名

src_file    #模块名、函数名、类名

  codeobject的co_code代表了字节码,这个字节码有什么含义?我们可以使用dis模块进行python的反编译:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

import dis

dis.dis(co)

>>> output

 2        0 LOAD_CONST               0 (0)

          3 LOAD_CONST               1 (<code object f at 0xb7273b18, file "src_file", line 2>)

          6 MAKE_FUNCTION            1

          9 STORE_NAME               0 (f)

 5        12 LOAD_CONST              2 (9)

          15 STORE_NAME              1 (a)

 

 6        18 LOAD_CONST              3 (8)

          21 STORE_NAME              2 (b)

 

 7        24 LOAD_NAME               0 (f)

          27 CALL_FUNCTION           0

          30 POP_TOP            

          31 LOAD_CONST              4 (None)

          34 RETURN_VALUE

  从反编译的结果来看,python字节码其实是模仿的x86的汇编,将代码编译成一条一条的指令交给一个虚拟的cpu去执行。

第一列:行号第二列:指令在代码块中的偏移量第三列:指令第四列:操作数第五列:操作数说明

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。