PythonVm
项目结构
-build 工程构建目录
-DLLs 用C/C++编写的库
-Lib 用Python编写的标准库
-src Python虚拟机源码
-test 测试文件目录
-build.sh 构建脚本
-CMakeLists.txt 编译的文件
编译项目
1.请确保先安装cmake,如果没有安装cmake,请执行一下命令安装
$ sudo apt-get install build-essential
$ sudo apt-get install cmake
2.本项目需要依赖Boost库 请提前下载编译
3.编译
chmod 755 build.sh
./build.sh
运行项目
官方的CPython包含编译器+虚拟机,本项目暂时不包含编译器,
因此需要利用官方的编译器执行下面命令,先将.py文件编译成.pyc文件,再由本虚拟机解释执行.
python -m compileall test.py
./mypython test.pyc
虚拟机实现过程中发现的坑这里做几下记录
1.python2和python3在切片的操作上发生了巨大变化
Python2关于切片的字节码
#define SLICE30
/* Also uses 31-33 */
#define SLICE_131
#define SLICE_232
#define SLICE_333
#define STORE_SLICE40
/* Also uses 41-43 */
#define STORE_SLICE_141
#define STORE_SLICE_242
#define STORE_SLICE_343
#define DELETE_SLICE50
/* Also uses 51-53 */
#define DELETE_SLICE_151
#define DELETE_SLICE_252
#define DELETE_SLICE_353
#define BUILD_SLICE 133/* Number of items */
Python3中关于切片的字节码就缩减为一个BUILD_SLICE,但是会额外用到BINARY_SUBSCR:
#define BUILD_SLICE 133/* Number of items */
在eval BUILD_SLICE时,原本的序列是TOP而不是POP出栈,紧接着执行BINARY_SUBSCR
此时解释器栈如下
| sliceObj|
| list |
| ... |
|_________|
python2中也有BUILD_SLICE + BINARY_SUBSCR的组合 但是经过测试 发现python2编译器
只有在切片seq[ilow:ihigh:step]都存在的时候才会编译成这个组合,其余情况都会使用上面的字节码