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这一块生成的,因为它们也用到了这里的函数,可以暂时不管。