.pyc文件_程序的运行环境、编译、python运行基本结构、Python实现的种类、冻结二进制文件...

程序的运行环境

运行环境=操作系统 + 硬件

机器语言的程序称为本地代码(native code)。程序员用python语言等编写的程序,在编写阶段仅仅是文本文件。文本文件(排除文字编码的问题)在任何环境下都能显示和编辑。我们称之为源代码。通过对源代码进行编译,就可以得到本地代码。Windows应用程序的本地代码,通常是EXE文件及DLL文件等形式。

应用程序向操作系统传递指令的途径称为API(ApplicationProgramming Interface)。Windows及Unix系列操作系统的API,提供了任何应用程序都可以利用的函数组合。因为不同操作系统的API是有差异的,因此,将同样的应用程序移植到其他操作系统时,就必须要重写应用中利用到API的部分。像键盘输入、鼠标输入、显示器输出、文件输入输出等同外围设备进行输入输出操作的功能,都是通过API提供的。在同类型操作系统下,不管硬件如何,API基本上没有差别。因而,针对某特定操作系统的API所编写的程序,在任何硬件上都可以运行。当然,由于CPU种类不同,机器语言也不相同,因此本地代码当然也是不同的。这种情况下,就需要利用能够生成各CPU专用的本地代码的编译器,来对源代码进行重新编译了。

程序的运行环境中,存在着名为BIOS(Basic Input/Output System)的系统。BIOS存储在ROM中,是预先内置在计算机主机内部的程序。BIOS除了键盘、磁盘、显卡等基本控制程序外,还有启动“引导程序”的功能。引导程序是存储在启动驱动器起始区域的小程序。操作系统的启动驱动器一般是硬盘,不过有时也可以是CD-ROM或软盘。开机后,BIOS会确认硬件是否正常运行,没有问题的话就会启动引导程序。引导程序的功能是把在硬盘等记录的OS加载到内存中运行。虽然启动应用是OS的功能,但OS并不能自己启动自己,而是通过引导程序来启动。

编译

本地代码:把EXE文件的内容Dump一下,Dump是指把文件的内容,每个字节用2位十六进制数来表示的方式。本地代码的内容就是各种数值的罗列,而这些数值就是本地代码的真面目。每个数值都表示某一个命令或数据。而计算机就是把所有的信息作为数值的集合来处理的。与此相同,计算机指令也是数值的罗列。这就是本地代码。

能够把C语言等高级编程语言编写的源代码转换成本地代码的程序称为编译器。仅靠编译是无法得到可执行文件的,编译器转换源代码后,就会生成本地文件。不过,本地文件是无法直接运行的。为了得到可以运行的EXE文件,编译之后还需要进行“链接”处理。把多个目标文件结合,生成1个EXE文件的处理就是链接,运行连接的程序就称为链接器(linkage editor或连结器)。

库文件指的是把多个目标文件集成保存到一个文件中的形式。链接器指定库文件后,就会从中把需要的目标文件抽取出来,并同其他目标文件结合生成EXE文件。外部符号是指其他目标文件中的变量或函数。

存储着目标文件的实体,并直接和EXE文件结合的库文件形式称为静态链接库。

EXE文件的运行机制:EXE文件是作为单独的文件储存在硬盘中的。通过资源管理器找到并双击EXE文件,就会把EXE文件的内容加载到内存中运行。EXE文件中给变量及函数分配了虚拟的内存地址。在程序运行时,虚拟的内存地址会转换成实际的内存地址。链接器会在EXE文件的开头,追加转换内存地址所需的必要信息。这个信息称为再配置信息。EXE文件的再配置信息,就成为了变量和函数的相对地址。相对地址表示的是相对于基点地址的偏移量,也就是相对距离。

在源代码中,虽然变量及函数是在不同位置分散记述的,但在链接后的EXE文件中,变量及函数就会变成一个连续排列的组。这样一来,各变量的内存地址就可以用相对于变量组起始位置这一基点的偏移量来表示,同样,各函数的内存地址也可以用相对于函数组起始位置这一基点的偏移量来表示。而各组基点的内存地址则是在程序运行时被分配的。

b58c8e70153b016f52393e4fba7e621e.png
img

除此之外,当程序加载到内存后,还会额外生成两个组,那就是栈和堆。栈是用来存储函数内部临时使用的变量(局部变量),以及函数调用时所用的参数的内存区域。堆是用来存储程序运行时的任意数据及对象的内存领域。

24fdcc946e299f75b0bfe7101d4db0f9.png
img

EXE文件中并不存在栈及堆的组。栈和堆需要的内存空间是在EXE文件加载到内存后开始运行时得到分配的。因而,内存中的程序,就是由用于变量的内存空间、用于函数的内存空间、用于栈的内存空间、用于堆的内存空间这4部分构成的。当然,在内存中,加载Windows等操作系统的内存空间又是另外一回事了。

在内存的使用方法上,二者存在些许不同。栈中对数据进行存储和舍弃(清理处理)的代码,是由编译器自动生成的,使用栈的数据的内存空间,每当函数被调用时都会得到申请分配,并在函数处理完毕后自动释放。与此相对,堆的内存空间,则要根据程序员编写的程序,来明确进行申请分配或释放。如果没有在程序中明确释放堆的内存空间,那么即使在处理完毕后,该内存空间仍会一直残留。这个现象称为内存泄露(memory leak)。

垃圾回收机制(garbage collection)指的是对处理完毕后不再需要的堆内存空间的数据和对象进行清理,释放它们所使用的内存空间,python程序运行环境会自动进行垃圾回收。这样就可以避免由于程序员的疏忽(忘了记述内存的释放处理)而造成内存泄露了。

python运行基本结构

  1. 编程语言分类

  2.   编译型:将代码一次性全部编译成二进制,然后再执行。优点:执行效率高。缺点:开发效率低,不能跨平台。代表语言:C

  • 解释型:逐行解释成二进制,逐行运行。优点:开发效率高,可以跨平台。缺点:执行效率低。代表语言:python。

python编程运行方式:交互模式或脚本方式

python语言常用文件类型

源代码文件:以文件.py为扩展名,由python程序解释,不需要编译。

字节代码文件:以文件.pyc为扩展名,是由py源文件编译成的二进制字节码文件,由python加载执行。能够隐藏源代码。

1将.py文件转换成.pyc文件

优化代码文件:文件以.pyo为扩展名,是优化编译后的程序,也是二进制文件,适用于嵌入式系统

.py文件转换成

当Python运行脚本时,在代码开始进行处理之前,Python还会执行一些步骤。确切地说,第一步是编译成所谓的“字节码”,之后将其转发到所谓的“虚拟机”中。

字节码编译

当程序执行时,Python内部会先将源代码编译成所谓字节码的形式。编译是一个简单的翻译步骤,而且字节码是源代码底层的、与平台无关的表现形式。Python通过把每一条源语句分解为单一步骤来将这些源语句翻译成一组字节码指令。这些字节码可以提高执行速度:比起文本文件中原始的源代码语句,字节码的运行速度要快得多。Python字节码不是机器的二进制代码,字节码是特定于Python的一种表现形式。因此Python代码无法运行得像C或C++代码一样快。纯Python代码的运行速度介于传统的编译语言和传统的解释语言之间。

如果Python进程在机器上拥有写入权限,那么它将把程序的字节码保存为一个以.pyc为扩展名的文件(“.pyc”就是编译过的“.py”源代码)。如果Python无法在机器上写入字节码,字节码将会在内存中生成并在程序结束时简单地丢。字节码文件同样是分发Python程序的方法之一:如果Python找到的都是.pyc文件,它也很乐意运行这个程序,尽管这里没有原始的.py源代码文件。

Python这样保存字节码是作为一种启动速度的优化。下一次运行程序时,Python它会自动检查源文件和字节码文件的时间戳,如果上次保存字节码之后没有修改过源代码的话,Python将会加载.pyc文件并跳过编译这个步骤。

Python实现的种类

Python语言有三种主要实现方式(CPython、Jython和IronPython)以及一些次要的实现方式,例如,Stackless Python。CPython是标准的实现;其他的都是有特定的目标和角色的。所有的这些都用来实现Python语言,只是通过不同的形式执行程序而已。

CPython

和Python的其他两种实现方式相比,原始的、标准的Python实现方式通常称作CPython。这个名字根据它是由可移植的ANSI C语言代码编写而成的这个事实而来的。也就是从http://www.python.org获取的、从ActivePython分发包中得到的以及从绝大多数Linux和MacOS X机器上自动安装的Python。因为CPython是这门语言的参照实现方式,所以和其他的替代系统相比来说,它运行速度最快、最完整而且也最健全。

Jython

Jython系统(最初称为JPython)是一种Python语言的替代实现方式,其目的是为了与Java编程语言集成。Jython包含了Java类,这些类编译Python源代码、形成Java字节码,并将得到的字节码映射到Java虚拟机(JVM)上。程序员仍然可以像平常一样,在文本文件中编写Python语句;Jython的目标是让Python代码能够脚本化Java应用程序,就好像CPython允许Python脚本化C和C++组件一样。它实现了与Java的无缝集成。因为Python代码被翻译成Java字节码,在运行时看起来就像一个真正的Java程序一样。Jython脚本可以应用于开发Web applet和servlet,建立基于Java的GUI。此外,Jython具有集成支持的功能,允许导入Python代码或使用Java的类(这些类就像是用Python编写的一样)。因为Jython要比CPython慢而且也不够健壮,它往往看做是一个主要面向寻找Java代码前端脚本语言的Java开发者的一个有趣的工具。

IronPython

Python的第三种实现方式IronPython,其设计目的是让Python程序可以与Windows平台上的.NET框架以及与之对应的Linux的上开源的Mono编写成的应用相集成。本着像微软早期的COM模型一样的精神,将.NET和C#程序语言的运行系统设计成与语言无关性的对象通信层。IronPython允许Python程序既可以用作客户端也可以用作服务器端的组件,还可以与其他.NET的语言进行通信。

IronPython有特定的目标:它主要为了满足在.NET组件中集成Python的开发者。因为它是由微软公司开发的,IronPython也许能够为了性能实现完成一些重要的优化工具。

执行优化工具

CPython、Jython和IronPython都是通过同样的方式实现Python语言的,即通过把源代码编译为字节码,然后在适合的虚拟机上执行这些字节码。然而,其他的系统,包括Psyco即时编译器以及ShedskinC++转换器,则试着优化了基本执行模块

Psyco实时编译器

Psyco系统并不是Python的另一种实现方式,而是一个扩展字节码执行模块的组件,可以让程序运行得更快。Psyco是一个PVM的增强工具,这个工具收集并使用信息,在程序运行时,可以将部分程序的字节码转换成底层的真正的二进制机器代码,从而实现更快的执行速度。在开发的过程中,Psyco无需代码的修改或独立的编译步骤即可完成这一转换。

当程序运行时,Psyco收集了正在传递过程中的对象的类别信息,这些信息可以用来裁剪对象的类型,从而生成高效的机器代码。机器代码一旦生成后,就替代了对应的原始字节码,从而加快程序的整体执行速度。在理想的情况下,一些通过Psyco优化的Python代码的执行速度可以像编译好的C代码一样快。

Psyco最终被一个更新的项目“PyPy”融合。

Shedskin C++转换器

Shedskin是一个引擎系统,它采用了一种不同的Python程序执行方法:它尝试将Python代码变为C++代码,然后使用机器中的C++编译器将得到的C++代码编译为机器代码。

冻结二进制文件

通过从网络上获得的一些第三方工具,将Python程序转为可执行程序(在Python世界中称作冻结二进制文件,Frozen Binary)

冻结二进制文件能够将程序的字节码、PVM(解释器)以及任何程序所需要的Python支持文件捆绑在一起形成一个单独的文件包。过程会有一些不同,但是实际的结果将会是一个单独的可执行二进制程序(例如,Windows系统中的.exe文件)。这就好像将字节码和PVM混合在一起形成一个独立的组件——冻结二进制文件。

三种系统能够生成冻结二进制文件:py2exe(Wi n dows下使用)、PyInstaller(和py2exe类似,它能够在Linux及UNIX上使用,并且能够生成自安装的二进制文件)以及freeze(最初始的版本)

冻结二进制文件与真实的编译输出结果有所不同:它们通过虚拟机运行字节码。因此,如果离开了必要的初始改进,冻结二进制文件和最初的源代码程序运行速度完全相同。冻结二进制文件包括PVM,冻结二进制文件中嵌入了Python,接收端并不需要安装Python来运行这些冻结二进制文件。此外,由于代码嵌入在冻结二进制代码之中,对于接收者来说,代码都是隐藏起来的。

Powershell

PowerShell 命令 集合

操作【含义】命令
打印工作目录【检查当前 所在位置】pwd【print working directory】
创建目录【只能是文件夹】mkdir 新建文件夹名称【DOS 指令】
列出 目录内容ls 【list】
列出 目录内容dir【DOS 指令】
更改目录cd 目录 /盘符 【change document】
返回 上一目录cd …【是两个 英文句号】【返回home :cd ~】
推送 目录pushd
弹出 目录popd
删除 目录【这里 是 文件夹或者文件】rmdir 文件夹名称【remove document】
复制 文件 或 文件夹cp
更可靠的 复制命令robocopy
移动文件 或者 目录mv
逐页查看 文件more
打印 整个 文件type
清屏操作clear/cls
寻找文件dir-r 【命令管道位置?】
在一大堆文件上面运行一条命令forfiles
阅读手册help
打印一些参数echo
导出/设定 一个新的 环境变量set
成为超级用户root 【危险命令!】runas
退出 shellexit
创建任意空文件New-Item 新建空文件名.扩展名 -type file【挺好用的】

继承脚本环境:iseshell适合移动文件或者修改文本数据。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值