Python3.7源码剖析 ------- 编译Python

Python总体架构

Python是一门解释型语言,但是它其实和Java一样,也有自己的虚拟机,只不过大家更乐于称呼它为解释器

那么何为解释器?

故名思意:解释器就好比有道词典,你输入了一些汉字,它回馈给你一些英文

好吧,其实我骗了你,它跟词典还是有一点区别的。

对于词典:我们关注的是它的输出 hello

对于解释器:我们关注的是它的运行结果符不符合我们的预期,而对于他的解释输出,我们通常是不在意的

怎么多了那么多东西,这都是什么啊?

不急,让我们慢慢道来

扫描器分析Python程序语法的正确性

你经常看到的 SyntaxError: invalid syntax 错误,便是扫描器产生的,一旦它发现了你的语法不规范,便不帮你做事了

解析器分析Python的词法和语法,生成一颗抽象语法树

编译器根据解析器生产的抽象语法树,来生成Python字节码

这两个又是什么东西,有什么作用

简单来说就是Python帮我们的程序转化成方便计算机识别的语言,毕竟计算机的逻辑和人类的逻辑是不一样的

有了Python字节码,Python内部通信的官方语言,那么就可以用虚拟机去运行我们的程序啦

执行器(虚拟机)根据官方语言,Python字节码去帮助我们提早下班

构建windows Python编译环境下载visual studio2017(最新版2019应该也可以),并按照网上教程安装即可

下载Python 3.7.3源码,并解压

打开visual studio

选择文件 -> 打开 -> 项目/解决方案

找到Python-3.7.3/PCbuild目录,找到pcbuild.sln,选择并打开

右键 解决方案 -> 选择属性

选择配置 拖动右边的滚动条,将python和pythoncore的生成勾上,点击确定即可

点击本地windows调试器,运行即可,第一次可能会有点漫长,耐心等待即可

出现交互式页面,代表成功

修改源代码

打开pythoncore中Objects目录,找到longobject.c文件

修改1763行左右的long_to_decimal_string函数,这是整数的print方法

static PyObject *
long_to_decimal_string(PyObject *aa)
{
PyObject *v;
if (long_to_decimal_string_internal(aa, &v, NULL, NULL, NULL) == -1)
return NULL;
printf("hello python\n"); // 加上此句 return v;
}

重新点击运行

可以看到在我们输入1和2的时候,会自动输出hello python

前面两个hello python是交互式信息Python 3.7.3这一块生成的,因为它们也用到了这里的函数,可以暂时不管。