PyMiner-Boost是一种运行前编译的静态类型语言,在语法遵循宿主Python语言规范的基础上,通过强制性的类型提示,从而生成机器码。 在Python语言中的应用领域,主要是基于主体的建模技术(ABM)。这种建模技术大量使用
P.S. 如果不清楚ABM是什么,可以看这里:https://zhuanlan.zhihu.com/p/123360032的例子。 帝国时代、城市天际线、星际争霸、红色警戒等模拟经营类游戏,与ABM的原理是相同的。因此,在ABM中,面向对象使用的频繁程度可想而知。
最主要的语法变更,就是强制使用类型提示。比如如下代码,在Python中是显然有效的:
def func():
a = 123
return a
但是在PyMiner-Boost中,是无效的,因为无法推断出变量的类型。特别的,函数的返回值也没有标注出来。 需要强制性地这样书写才行:
def func() -> int:
a: int = 123
return a
这样书写的话,本语言就能将这个语言编译成为LLVM IR中间代码,这个中间代码再通过llvmlite包编译、运行。 这样,机器码相比Python中pyc形式的中间代码,速度快很多。
需要完善的地方:
1、整理types的架构,需要更多抽象
2、明确引用类型和实体类型的区别。
3、整理编译流水线部分。一些已经推导出的类型可能需要注意引用传递和值传递的问题,
4、整理递归求值或者赋值的逻辑。尤其是递归赋值,是否需要用单独的东西来推导?
obj.a.b = 123
表达式为:
Expr(
value=Attribute(
value=Attribute(
value=Name(
id='obj',
ctx=Load()
),
attr='b',
ctx=Load()
),
attr='c',
ctx=Load()
)
),
当处于外层时,可以直接用代码生成的逻辑来遍历obj.b,得到属性的指针。这样应该是可以的!
5、GC 现在用的是引用计数的方式,当引用计数为0的时候,就回收对象。
6、函数的返回可能在多个位置,但将被整理成从同一个位置返回。(已完成)
def func():
a: int = 0
if a > 0:
return 0
else:
return 1
会生成一个phi函数,函数值为所有的返回值,统一在return这个基础块返回。 其余的return
语句,处理为指向return基础块的分支。
python -m pip install -r requirements.txt
python setup.py build_ext -i # 构建Cython和C/C++写的模块依赖。内存分配等算法依赖运行时!
pytest -s # 测试tests文件夹下面的测试用例。
conda install libpython m2w64-toolchain -c msys2 #如果安装时显示缺少visual c++ 2014 时使用
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。