Python 编译器与解释器

Python 编译器与解释器python

Python的环境咱们已经搭建好了,能够开始学习基础知识了。可是,在此以前,还要先说说编译器与解释器相关的内容。程序员

若是这部份内容,让你以为难以理解或不能彻底明白,能够暂时跳过,等之后再回过头来从新读一遍。算法

1、数据的表示方式

咱们都知道,现实生活中,数字的表示方式有不少种,常见的有二进制、八进制、十进制和十六进制。十进制咱们都很熟悉,加法口诀表咱们都背过,主要是使用0~9,这10个阿拉伯数字来构建整个十进制的体系,其中最核心的法则是“逢十进一”,借位则是“借一当十”。那么为何全世界无论什么国家,什么历史,什么文化水平基本都是用十进制做为基本进制呢?是由于咱们人有10个手指头,掰起来最方便!咱们对十进制有着自然的友好度。编程

image.png-139.9kB

那么对于计算机呢?计算机不是人,没有10个手指头能够掰,因此它用不了十进制。那么它用几进制?二进制!二进制是用0和1两个数码来表示的数,也就是形如010101010的样子。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”。网络

image.png-246.4kB

为何计算机要使用二进制做为本身的机器语言也就是数据的表示方式呢?由于计算机最小的计算单元是根据开关状态高低电平来肯定的,它只有开和关,高和低的概念,换成数学就是0和1的两种。一样的,在物理存储方面,硬盘的磁道只能区分打孔和未打孔的状态,也是0和1两种。同时二进制便于进行加、减运算和计数编码。二进制与十进制数易于互相转换。二进制便于逻辑判断(是或非),逻辑判断一般也是两种状态,这和二进制很搭配。二进制表示数据还具备抗干扰能力强,可靠性高的特色,由于当受到必定程度的电磁干扰时,只要能够分辨出它是高电平仍是低电平,至于高多少或低多少并不重要,就能区分0和1,这在网络信号中,就是天生自带抗干扰能力。编程语言

image.png-46.4kB

可是,在人机交流上,二进位制有致命的弱点,数字的书写特别冗长,而且没有人类可读性!例如,十进位制的100000写成二进制就是11000011010100000,长了好几倍,并且你能从一个这么长的二进制数里读出它的十进制数是多少吗?性能

计算机不能独立存在,目前也没法自我创造,不论是输入仍是输出,它的一切都必须和人交流。那么问题来了,人类只能读10进制和英语、汉语等,可计算机只会010101,至于英语、汉语对它而言更是天书。那么咱们是怎么和计算机交流的呢?怎么将咱们的英语或者汉语编码成计算机可以识别的1010101呢?学习

2、 编程语言发展历程

1. 打孔纸条

咱们已经知道了计算机只懂机器语言,也就是二进制的数据表示方式,任何对它的操做和编码,最终都要统一到这上面来,然而这是一个悲伤的故事。优化

image.png-146.2kB

起初,为了让计算机按咱们的想法工做,程序员不得不编写计算机能够读懂看明白直接执行的机器码,也就是01010101的样子,打孔字条就是这么干的。用打没打孔来表明0和1。OK,计算机没问题,它能无障碍阅读,可程序员就难受了。拍脑壳也能想获得这里面的问题。容易出错,效率低,编写困难,维护困难。可能就是个简单的打印“hello world”,也许就须要好几米长的字条。这简直就是原始社会,生产效率低下的使人发指。发生个火灾什么的,直接Over。惟一的好处就是无需转换,可直接执行,但相对缺点来说,这点好处彻底能够被忽略。编码

2. 汇编语言

image.png-357.6kB

汇编语言是一种可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符代替机器指令的操做码,用地址符号或标号代替指令或操做数的地址。在不一样的设备中,汇编语言对应着不一样的机器语言指令集,经过汇编过程转换成机器指令。也就是说不一样平台之间不可直接移植,它是平台相关的,你在这个硬件平台写的汇编程序,换到另一套硬件上去是运行不了的。 所以,汇编语言一般被应用在底层,硬件操做和高要求的程序优化的场合。驱动程序、嵌入式操做系统和实时运行程序较多使用汇编语言。相比于机器码,它更偏向人类的语言习惯,更易于编写和阅读,也就是有一点抽象符号概念化了,这大大提升了编程效率。可是,这依然是一种低级语言,还有改善和提升的空间。

上面一段看得晕不要紧,简单地说就是汇编语言相比打孔纸条,对人类更友好一点了,至少能用几个相似ADD\CALL\MOV的英文缩写了。可是,它牺牲了必定的性能,而且依然不够友好。

3. C语言

在C语言以前其实还有不少低级语言,咱们不关心它们。为了让编程更简单,更高效,聪明的计算机程序员,一步步发明了FORTRAN、BASIC、B等许多语言,而后在1972年诞生了无人不知,应用最广,影响最深,至今仍然地位不可动摇的C语言。

image.png-125.5kB

C语言为何这么厉害?归根结底是一句话:直接操做硬件!一样的算法,用C语言,其执行效率超过JAVA等语言不少。那可能有人会问,C和汇编和机器码比呢?确定是C慢,可是写个汇编程序和写个C程序的效率差异那就更大了。C语言在人类友好性和底层相关性上达到了一个高度的平衡。这二者是互相矛盾的,不可同时兼得。

C干了些什么?其实它就是在人类友好性方面相比之前跨出了更大一步。人类是方便了,可机器就迷糊了!你给我这么多字符都是啥意思?机器它只懂二进制啊!那么C的代码是如何被执行的呢?这就得请出编译器了!

编译器将编程语言写的代码翻译成机器可以执行或者说“看懂”的二进制机器码。

其实咱们安装JAVA也好,C也好,Python也罢,主要就是安装的这个编程语言的“编译器”。

4. Python语言

在几十年前,C语言是当之无愧的高级语言表明,如今也依然是语言排行榜第二的霸主。然而,在不少领域,它已经不太适用了,现今更主流的语言是那些上手快、简单易懂,说白了就是门槛低的语言,让更多的人能进入程序员行业,让编程能更容易、更快是将来的发展趋势。也就是说,须要进一步让编程语言更贴近人类语言,更远离机器语言。

Python就是这么一种语言。它的语法简单明了,更贴近人类的使用习惯。做为一种动态解释性语言,让人们在写代码的时候能够更多的关注业务逻辑细节,而不须要花太多精力去关注数据类型定义、程序运行效率等!

既然都说的是机器不懂的“人话”,那必然也须要一个Python“编译器”。对于Python语言,广义上的“编译器”,叫作解释器。

3、 编译器与解释器

编译器/解释器:高级语言与机器之间的翻译官

都是将代码翻译成机器能够执行的二进制机器码,只不过在运行原理和翻译过程有不一样而已。

image.png-515.5kB

那么二者有什么区别呢?

image.png-182.8kB

用一个通俗的例子进行比喻:咱们去饭馆吃饭,点了八菜一汤。编译器的方式就是厨师把全部的菜给你全作好了,一块儿给你端上来,至于你在哪吃,怎么吃,随便。解释器的方式就是厨师作好一个菜给你上一个菜,你就吃这个菜,并且必须在饭店里吃。

image.png-125.7kB

至于更深刻的编译器和解释器是如何工做的,请参考史诗巨著《编译原理》,这本书有个外号,叫作“龙书”。

image.png-305.4kB

4、 Python解释器种类

Python有好几种版本的解释器:

CPython:官方版本的解释器。这个解释器是用C语言开发的,因此叫CPython。CPython是使用最广的Python解释器。咱们一般说的、下载的、讨论的、使用的都是这个解释器。

Ipython:基于CPython之上的一个交互式解释器,在交互方式上有所加强,执行Python代码的功能和CPython是彻底同样的。CPython用>>>做为提示符,而IPython用In [序号]:做为提示符。

PyPy:一个追求执行速度的Python解释器。采用JIT技术,对Python代码进行动态编译(注意,不是解释),能够显著提升Python代码的执行速度。绝大部分CPython代码均可以在PyPy下运行,但仍是有一些不一样的,这就致使相同的Python代码在两种解释器下执行可能会有不一样的结果。

Jython:运行在Java平台上的Python解释器,能够直接把Python代码编译成Java字节码执行。

IronPython:和Jython相似,只不过IronPython是运行在微软.Net平台上的Python解释器,能够直接把Python代码编译成.Net的字节码。

5、 Python的运行机制

Python做为动态解释性语言,其运行机制可参考下图(图片来自网络,其中的“编译器”是对解释器的广义称呼):

image.png-157.1kB

都说解释器慢,Python也有想办法提升一下运行速度的,那就是使用pyc文件。这点参考了JAVA的字节码作法,但并不彻底类同。

咱们编写的代码通常都会保存在以.py为后缀的文件中。在执行程序时,解释器逐行读取源代码并逐行解释运行。每执行一次,就重复一次这个过程,这其中耗费了大量的重复性的解释工做。为了减小这一重复性的解释工做,Python引入了pyc文件,pyc文件是将py文件的解释结果保存下来的文件,这样,下次再运行的时候就不用再解释了,直接使用pyc文件就能够了,这无疑大大提升了程序运行速度。

对于pyc文件,你必须知道如下几点:

  • 对于当前调用的主程序不会生成pyc文件
  • 以import xxx或from xxx import xxx等方式导入主程序的模块才会生成pyc文件
  • 每次使用pyc文件时,都会根据pyc文件的建立时间和源模块进行对比,若是源模块有修改,则从新建立pyc文件,并覆盖先前的pyc文件,若是没有修改,直接使用pyc文件代替模块;
  • pyc文件统一保存在模块所在目录的__pycache__文件夹内。

以下图所示,modula_a被module_main导入后会生成对应的pyc文件,可是module_main不会生成pyc文件!!

image.png-68.9kB

相关文章
相关标签/搜索