Python运行过程

一、什么是Python?


  Python是一种计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的,大型项目的开发。
在这里插入图片描述

1.1、程序设计语言是什么?


  要让计算机按照人的意思去运行,那就必须使计算机懂得人的意图,接受人类输入的命令。人要和计算机交换信息,就必须要解决一个语言的问题,这个时候人们给计算机设计了一种特殊的语言,那么这就是程序设计语言。程序设计语言是一种形式语言。程序设计语言是人们根据实际问题的需要而设计的。目前可以分为三大类:一是机器语言。它是用计算机的机器指令表达的语言;二是汇编语言。它是用一些能反映指令功能的助记符表达的语言;三是高级语言。它是独立于机器、接近于人们使用习惯的语言。

电子计算机语言分为三类:

  • 机器语言:它是用二进制数0、1的不同排列来传递信息,是目前的电子计算机惟一能直接接受的语言。这种语言程序难编、难读、难记、难改,但却能充分发挥机器的作用。
  • 符号语言:它是以符号化的码子代替二进制码。符号语言比机器语言容易记忆,但仍难编、难读。对于初学者和一般使用计算机的人,可以不必学习机器语言和符号语言。
  • 高级语言:这种语言比较接近人们的自然语言和数学语言,比较直观、易编、易读,而且通用性强。
    PS:来自:https://zhidao.baidu.com/question/758425352002075084.html

1.2、什么是解释型语言?


  相对于编译型语言存在的,源代码不是直接翻译成机器语言,而是先翻译成中间代码,再由解释器对中间代码进行解释运行。

机器语言:它是用二进制数0、1的不同排列来传递信息,是目前的电子计算机惟一能直接接受的语言。这种语言程序难编、难读、难记、难改,但却能充分发挥机器的作用。

C语言(编译型语言)

C语言是可以直接编译成为操作系统可识别执行的机器语言,不经过第二次编译,所以C语言是编译型语言;

  计算机不能直接理解高级语言,只能直接理解机器语言,所以必须要把高级语言翻译成机器语言,计算机才能执行高级语言编写的程序。

  一个是编译,一个是解释。两种方式只是翻译的时间不同。编译型语言写的程序执行之前,需要一个专门的编译过程,把程序编译成为机器语言的文件,比如exe文件,以后要运行的话就不用重新翻译了,直接使用编译的结果就行了(exe文件),因为翻译只做了一次,运行时不需要翻译,所以编译型语言的程序执行效率高,但也不能一概而论,部分解释型语言的解释器通过在运行时动态优化代码,甚至能够使解释型语言的性能超过编译型语言。

  解释则不同,解释性语言的程序不需要编译,省了道工序,解释性语言在运行程序的时候才翻译,比如解释性basic语言,专门有一个解释器能够直接执行basic程序,每个语句都是执行的时候才翻译。这样解释性语言每执行一次就要翻译一次,效率比较低。解释是一句一句的翻译。

编译型与解释型,两者各有利弊

  前者由于程序执行速度快,同等条件下对系统要求较低,因此像开发操作系统、大型应用程序、数据库系统等时都采用它,像C/C++、Pascal/Object Pascal(Delphi)等都是编译语言,而一些网页脚本、服务器脚本及辅助开发接口这样的对速度要求不高、对不同系统平台间的兼容性有一定要求的程序则通常使用解释性语言,如Java、JavaScript、VBScript、Perl、Python、Ruby、MATLAB 等等

1.3、Python与其他语言对比

  • Python 是一种解释型语言,它排除了在执行程序之前编译代码的需要,因为 Python 在后台进行编译。因为 Python 是一种高级编程语言,所以它从编程代码中抽象出许多复杂的细节。Python 非常关注这种抽象,大多数新手程序员都可以理解它的代码。
  • Python 代码往往比可比代码短。尽管 Python 提供了快速的开发时间,但它在执行时间方面略有滞后。与完全编译 C 和 C ++等语言相比,Python 程序执行速度较慢。当然,由于目前计算机的处理速度,速度差异通常只在基准测试中观察到,而不是在实际操作中观察到。在大多数情况下,Python 已经包含在 Linux 发行版和 Mac OS X 计算机中。

1.4、Python应用领域


  • Web 和 Internet开发
  • 科学计算和统计
  • 人工智能
  • 教育
  • 桌面界面开发
  • 软件开发
  • 后端开发

二、Python程序执行过程


PyCodeObject & pyc

PyCodeObject:PyCodeObject则是Python编译器真正编译成的结果。

当python程序运行时,将编译的过程结果存放至内存中的PyCodeObject中,当程序运行结束后,python解释器将PyCodeObject回写到.pyc文件中。 当python程序第二次运行时首先会去硬盘中寻找.pyc文件,如果找到则直接载入,否则就再次重复以上过程。

PS:每次加载模块时,如果同时存在.py和.pyc,Python会尝试使用.pyc,如果.pyc的编译时间早于.py的修改时间,则重新编译.py并更新.pyc。

也就是.pyc文件是PyCodeObject的一种持久化保存方式。

start:

#!/usr/bin/env python

def print_hello(test):
    print(f"this is a {test}")

if __name__ == "__main__":
    print_hello("hello world")

stop:

#!/usr/bin/env python

from start import print_hello
if __name__ == "__main__":
    print_hello("hello world")

stop_running…
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

start.cpython-36.pyc文件中存放着在程序运行时内存中PyCodeObject回写的数据。当下一次运行程序时,优先寻找硬盘中的start.cpython-36.pyc此文件。

回写写入过程(不确定。mark)

#!/usr/bin/env python

import py_compile
import imp
import os

def pycodeobject2pyc(pyobj, pycfile):
    with open(pycfile, 'wb') as fc: 
        fc.write("\0\0\0\0")
        timestamp = long(os.fstat(fc.fileno()).st_mtime)
        py_compile.wr_long(fc, timestamp)
        marshal.dump(pyobj, fc)
        fc.flush()
        fc.seek(0, 0)
        MAGIC = imp.get_magic()
        fc.write(MAGIC)

pycodeobject2pyc(b"x00x0x0x0x00x0x0", "a.pyc")
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章