Python的环境已经搭建好了,现在可以开始学习Python的基础知识了。在开始之前,我们先来了解一下编译器和解释器的相关内容。

如果你觉得这部分内容难以理解或暂时无法完全掌握,可以先跳过,待日后再回过头来重新阅读。

一、数据的表示方式

在现实生活中,我们使用多种方式来表示数字,其中常见的有二进制、八进制、十进制和十六进制。我们都非常熟悉十进制,通过加法口诀表,我们学会了使用0到9这10个阿拉伯数字来构建整个十进制数系。其中最重要的法则是“逢十进一”,并且可以借位,即“借一当十”。那么为什么全世界几乎所有的国家、历史和文化背景都选择十进制作为基本进制呢?这是因为人类有10个手指头,使用十进制最为方便!我们对十进制具有天然的亲近感。

1.png

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

2.png

计算机之所以使用二进制作为机器语言和数据的表示方式,有以下几个原因:

  1. 最小计算单元:计算机的最小计算单元是基于开关状态的高低电平来确定的,只有开和关、高和低的概念。这对应于数学中的0和1两个状态。因此,二进制最适合表示计算机内部的数据和指令。
  2. 物理存储:在物理存储方面,例如硬盘的磁道,只能区分打孔和未打孔的状态,也可以看作是0和1两种状态。二进制能够与物理存储设备的特性相匹配。
  3. 运算和编码:二进制便于进行加法、减法等基本运算,以及进行计数编码。二进制与十进制之间易于进行互相转换。
  4. 逻辑判断:二进制表示的数据便于逻辑判断,通常逻辑判断只有两种状态,与二进制的0和1非常匹配。
  5. 抗干扰能力:二进制表示的数据具有较强的抗干扰能力和高可靠性。当受到一定程度的电磁干扰时,只要能够区分出高电平和低电平,就可以准确区分0和1。这在网络传输中具有天生的抗干扰能力。

3.png

然而,在人机交流方面,二进制表示存在着致命的弱点,即数字的表示非常冗长且缺乏人类可读性。举个例子,将十进制的100000转换为二进制就变成了11000011010100000,长度增加了好几倍。而且,你能够直接从这样一串长长的二进制数中读出它表示的十进制数是多少吗?

计算机并不能独立存在,它无法自我创造,无论是输入还是输出,它都必须与人进行交流。然而,人类只能读取十进制数和使用英语、汉语等自然语言,而计算机只懂得0和1,对于英语、汉语等自然语言更是一无所知。那么,我们应该如何与计算机进行交流?如何将我们的英语或汉语编码成计算机可以理解的0和1呢?

二、编程语言的发展历程

1. 打孔纸带

我们已经了解到计算机只理解机器语言,即二进制的数据表示方式。任何对计算机的操作和编码最终都必须转化为二进制形式。然而,这个过程并不令人愉快。

4.png

最初,为了让计算机按照我们的意图工作,程序员不得不编写直接可执行的机器码,即由0和1组成的二进制序列。这就是打孔纸带的用途。通过打孔与未打孔的区别来表示0和1。计算机可以轻松地读取这些信息,但对于程序员来说,情况就不那么美妙了。我们可以想象到其中的问题:容易出错、效率低下、编写困难且维护也很困难。即使是简单的打印“hello world”,可能也需要好几米长的纸带。这就像是原始社会一样,生产效率低下到令人难以忍受的地步。一场火灾就足以让所有工作付之一炬。唯一的好处是不需要进行转换,可以直接执行机器码,但相对于其缺点来说,这个好处几乎可以忽略不计。

2. 汇编语言

5.png

汇编语言是一种低级语言,也被称为符号语言。它为可编程设备提供了一种接近机器指令的表示方式。在汇编语言中,我们使用助记符来代替机器指令的操作码,并使用地址符号或标签来代表指令或操作数的地址。不同的硬件平台有不同的汇编语言指令集,因此汇编语言程序在不同平台上不能直接移植。汇编语言通常应用于底层开发、硬件操作和高性能程序优化等领域。驱动程序、嵌入式操作系统和实时运行程序经常使用汇编语言。

相比于机器码,汇编语言更接近人类的语言习惯,更易于编写和阅读。它引入了一些抽象符号的概念,大大提高了编程效率。然而,汇编语言仍然是一种低级语言,仍然有改进和提升的空间。

简单来说,汇编语言相对于打孔纸带来说更加人性化一些,至少使用类似ADD、CALL、MOV等英文缩写。但它牺牲了一定的性能,并且仍然不够友好。

3. C语言

在C语言出现之前,还有许多其他低级语言,但我们不需要过多关注它们。为了使编程更简单、更高效,聪明的计算机程序员们逐步发明了FORTRAN、BASIC、B等许多语言。然后,在1972年,诞生了一门无人不知、应用最广、影响最深且至今地位不可动摇的C语言。

6.png

C语言之所以强大,归根结底是因为它可以直接操作硬件。使用C语言编写的算法在执行效率上远超过Java等其他语言。或许有人会问,与汇编和机器码相比,C语言是不是慢了一些?当然,与编写汇编程序相比,编写C程序的效率要高得多。C语言在人类友好性和底层相关性之间达到了一种平衡,而这两者是相互矛盾的,无法同时兼顾。

C语言的出现实际上在人类友好性方面迈出了更大的一步。虽然对人类更方便了,但对机器来说就有些困惑了!你给我这么多字符是什么意思?机器只懂二进制啊!那么C语言的代码是如何被执行的呢?这就要靠编译器了!

编译器将用编程语言编写的代码翻译成机器能够执行或理解的二进制机器码。

实际上,无论是安装Java、C还是Python,主要安装的是该编程语言的编译器。

4. Python语言

几十年前,C语言毫无疑问是无可争议的高级语言代表,至今仍然是排名第二的主流语言。然而,在许多领域,它已经不太适应现代需求。如今,更受欢迎的是那些容易上手、简单易懂、门槛较低的语言,这样更多的人可以进入编程领域,编程变得更容易、更快捷,这也是未来的发展趋势。换句话说,需要使编程语言更贴近人类语言,远离机器语言。

Python正是这样一种语言。它的语法简洁明了,更贴近人类的使用习惯。作为一种动态解释性语言,它使人们在编写代码时可以更多地关注业务逻辑细节,而无需过多关注数据类型定义和程序运行效率等问题。

既然我们都在讨论机器无法理解的“人话”,那必然需要一个Python的“编译器”。对于Python语言而言,广义上的“编译器”就是解释器。

三、编译器与解释器

编译器和解释器都可以看作是高级语言与机器之间的翻译官,将代码翻译成机器可以执行的二进制机器码,只是在运行原理和翻译过程上有所不同。

7.png

那么两者有什么区别呢?

8.png

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

9.png

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

10.png

四、 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的字节码。

五、 Python的运行机制

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

11.png

都说解释器慢,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文件!!

12.png

另外,Python的pyc并不等同于JAVA的字节码!

标签: python, python下载, Python教程, Python技术, Python学习, Python学习教程, Python语言, Python开发, Python入门教程, Python进阶教程, Python高级教程, Python面试题, Python笔试题, Python编程思想