上一篇 《在 Windows 10 上配置 python 开发环境》 很惭愧,只做了一点微小的工作,大概三件事:

  • 一个,安装了 python 的解释器;
  • 第二个,把 vscode 安装进了电脑;
  • 第三个,就是我们知道的 virtualenv 虚拟环境。

如果说还有一点什么要讲的,就是在 how 之外,讲一点 what。为了让文章更通顺一点,我打算调整一下顺序,先讲编辑器,再讲解释器,最后再说虚拟环境。虽然文章是立足于 python 来谈,但是这些知识适用于几乎所有通用编程语言。因为我也不是计算机专业出身,这篇文章只是我的学习笔记,如果有不对的地方欢迎大家指出。

编辑器

首先我们来做一个实验,把上次教程里创建的 python 文件 hello.py 重命名,把拓展名 .py 改成 .txt, 然后双击鼠标打开文件,会发生什么?在 Windows 系统里,会弹出最最普通的记事本窗口,窗口里是白底黑字的 python 语句,不像 vscode 里面不同语句有不同颜色,但是内容完全一样。

甚至更进一步,你可以在命令行里直接让 python 编译器执行 .txt 文件的内容,(py -m hello.txt)效果和 .py 也是一样的。

.py 这个拓展名什么也没有做,和 .txt 文件一样,内容就是一串我们人类能够读懂的字符,这样的文件叫做文本文件。处理文本文件的程序,就叫做编辑器。记事本就是一种编辑器,vscode 也是。

既然记事本就可以编写 python 代码,那我还费劲安装 vscode 干嘛?确实有人真的只用记事本或其他操作系统自带的编辑器写 python 代码,(油管上还有一个视频是用 Microsoft Word 写代码;)然后用命令行调试程序,但是 vscode 毕竟是专为程序员而开发,提供了很多默认编辑器不具备的功能,比如前面提到将函数、变量、保留词显示成不同的颜色的语法高亮功能。

编译器 / 解释器

除了文本文件,这篇文章里涉及的第二种文件是二进制文件

电脑并不能直接看懂人类认识的字符,在一切的最底层,经典计算机认识的是以不同方式表示的 0 和 1。虽然说所有文件在底层都是二进制的文件,但是“二进制文件”这个名词一般专门用来表示除了文本文件之外的文件,又因为图片文件、视频文件啥的都有自己的名字,所以这个词用来指代的文件,基本上都和软件程序,可以让计算机执行的文件有关。

人类只认识字符,计算机只认识 0 和 1,那么最直觉的思路就是把文本文件翻译成二进制文件。这个翻译过程叫做编译,能够完成这一过程的软件就叫做编译器。编译器编译完成之后就退出了,要想执行程序,电脑直接执行编译之后的可执行文件就可以了。

但是编译存在一个问题,就是整个软件需要在所有的源代码文本文件都写好的情况下才能被编译成软件,编译耗费的资源和时间随着软件规模的增长而扩大;一旦修改某处,整个项目又要重新编译。很多时候我们只想快速地知道某个大型项目中的某一句命令的效果是什么,编译这种方法就不适合这种场景了。

于是就出现了解释器,这种程序比编译器复杂的多,在我们执行这种编程语言命令的时候始终运行,允许我们一句一句地输入命令,记得代码的上下文,还记得我们之前命令的结果,代价就是对于大型项目也需要一句一句地分析解释,计算资源的开销和速度都不如编译。

python 就是一种(官方实现)使用解释器的编程语言,我们在官网下载的那个 python-***.exe 文件就是 python 的解释器。这也导致了 python 程序的性能往往不如同水平的 C/C++ 程序员写出来的程序,但是由于单句执行适合试错,所以在 经常犯错的 科研领域还挺流行的。

当然了,python 的特点远不仅仅是解释型语言这么简单,它还是一种:

虚拟环境

有一次我问我女朋友,她写 python 用什么 IDE,她很自豪地回答,她的 Macbook 自带 python,直接在命令行就可以运行……答非所问还不是最大的问题(仔细想想好像也不是答非所问,不过只回答了问题的一部分),而是直接在命令行运行系统自带的 python,或者其他编程语言的解释器或者编译器,本身就是编程初学者常干的一种危险行为。

Windows 还好,毕竟这是一个面向广大家用消费者的操作系统,防呆设计还是挺多的,没有原装的 python。更加极客向的操作系统,比如 Linux 和 BSD 家族可就不一样了,这些操作系统(的发行版)往往预装了 python。这个 python 可不是给用户拿来开发自己的程序用的,而是用来让很多 python 语言写成的操作系统工具调用的。既然如此,这个 python 的版本一般由发行版的安装包管理者来控制,往往落后最新的 python 版本一段时间,为了避免新版本 python 有什么 bug,也为了让操作系统工具的开发者有时间更新自己的代码。所以如果直接用这个版本的 python 做开发,而且不小心自己升级了 python 的版本,很有可能导致系统的某些功能失常。

虚拟环境就是 python 对这个问题的解决方案。我们可以安装不同于原装 python 的版本,但是并不将这个解释器加入系统路径,操作系统也就不知道这个版本 python 的存在。创建虚拟环境的时候,我们指定使用这一特定版本的 python,这样在虚拟环境激活之后就是我们开发需要的 python,退出虚拟环境就是系统工具使用的 python。

另外,即便两个项目适用于同一个 python 版本,而且都是系统自带的这个版本,虚拟环境也有用武之地。绝大多数程序都需要依赖别人写好的工具代码,这些代码叫做库 (library),不同的项目可能依赖不同的库代码,或者同一个库的不同版本。这个时候,可以创建不同的虚拟环境,并在其中安装各个项目对应的库,项目之间可以互不影响。

编辑器 + 解释器 / 编译器 + 虚拟环境管理 + …… = IDE

为了开发 python 程序要安装这么多不同的程序,太麻烦了,就不能一键安装全搞定吗?当然可以了,这种集成了开发过程中用到的各种工具的程序,就叫做集成开发环境 (IDE)。对于 python,最有名的 IDE 当属 Anaconda 了。

那我为什么不用呢?当然用过,但是听说了 vscode 的大名,而且尝鲜之后,就再也回不去了。写 python 需要编辑 .py 文件,写博客需要编辑 .md 文件,博客的一些功能需要 JavaScript 实现,这些事情本质上都是编辑文本文件这一件事,在 vscode 这样的编辑器里全搞定就再自然不过了,那么 Anaconda 里的 Spyder 和 Jupyter Lab 就显得多余了。

“把一件事做好”,这也是 Unix 哲学的一部分。但是问题在于,不同的人对于“一件事”的定义是不同的,有些人觉得做早饭是一件事,有些人觉得是热牛奶煎鸡蛋烤面包等等好几件事,谁是对的?

也许都对,但是 编辑器 + 解释器 + …… 比起 IDE 就是处在鄙视链的上游。这一点可以不同意,但是应该要知道,不然别人抖包袱的时候你没捧上哏,挺尴尬的。