2 Star 0 Fork 0

hzy15610046011 / Melodie-Boost

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

描述

PyMiner-Boost是一种运行前编译的静态类型语言,在语法遵循宿主Python语言规范的基础上,通过强制性的类型提示,从而生成机器码。 在Python语言中的应用领域,主要是基于主体的建模技术(ABM)。这种建模技术大量使用

P.S. 如果不清楚ABM是什么,可以看这里:https://zhuanlan.zhihu.com/p/123360032的例子。 帝国时代、城市天际线、星际争霸、红色警戒等模拟经营类游戏,与ABM的原理是相同的。因此,在ABM中,面向对象使用的频繁程度可想而知。

语法相比Python语言的变更

最主要的语法变更,就是强制使用类型提示。比如如下代码,在Python中是显然有效的:

def func():
    a = 123
    return a

但是在PyMiner-Boost中,是无效的,因为无法推断出变量的类型。特别的,函数的返回值也没有标注出来。 需要强制性地这样书写才行:

def func() -> int:
    a: int = 123
    return a

这样书写的话,本语言就能将这个语言编译成为LLVM IR中间代码,这个中间代码再通过llvmlite包编译、运行。 这样,机器码相比Python中pyc形式的中间代码,速度快很多。

编译流程

graph LR
源代码-->|ast标准库|ast --> |PyMiner Boost翻译|ir[LLVM IR]-->|LLVMLite|c[编译为可执行程序供源码调用]

数据类型

  1. 8字节的整数和浮点数。
  2. 用户定义对象类型,对象支持嵌套。
  3. 定长列表Array以及动态列表List。List相当于Python中的原生list。
  4. 用简单粗暴的方式,直接生成多份代码,用这种方式来生成泛型。

主要优点

  1. 此语言的主要面向的对象为经管专业为主的非计算机用户,因此要求为尽可能同Python一致,并且具有用户友好的报错处理功能。
  2. 相比Numba、太极等语言,支持较为完整的面向对象特性,适配基于主体的建模(ABM)中面向对象密集的软件开发方式,最大程度上在不变更Python 语法的情况下,提升执行效率。同时无需用户手动管理内存,降低开发难度。

需要进一步修改的地方

  1. 内存分配效率太低,反复创建和释放对象太麻烦
  2. 不知道堆栈在哪,因此在内存管理上只会写引用计数
  3. 代码质量不敢恭维,还需要做很多的修改和调整。
  4. 和Python之间的数据共享,目前还没有做完。
  5. 目前还需要手动输入要编译的类名以及泛型类型。
  6. 一些各种各样各样各种的bug,主要是LLVM的字节码生成写得一团乱。

暂不支持的特性

  1. 字典
  2. 在同文件靠前的函数中调用位置靠后的函数
  3. 字符串操作(但是可以打印字符串常量)
  4. 打印对象
  5. .....太多了,根本列不完......

开发所用技术

编程语言

  • Python
  • C/C++
  • Python包
    • LLVMLite
    • Cython

管理工具

  • git(用gitee而不是github)

技术细节(可以先不看这里)

需要完善的地方:

1、整理types的架构,需要更多抽象

2、明确引用类型和实体类型的区别。

  • 现在完全修改成了依靠自动指针+引用计数的方式进行垃圾回收的管理
    • 基本结构:栈->自动指针->数据体
    • 除整数和浮点数外,其余数据类型均为引用类型——包括字符串。
    • 自动指针和数据体都保存在堆上,自动指针主要包含自身的引用类型、指向数据体的指针,以及引用计数。
      • 列表的自动指针目前有问题,第三位不应该是长度。
    • 引用计数只和自动指针相关,同一个数据体可能有多个自动指针,但自动指针指向的位置不一定是头部。
    • 强引用的自动指针,引用计数变为0之后,将在垃圾收集的时刻被移除。
    • 当调用父类的方法时,会生成一个对象,TODO

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 时使用

空文件

简介

基于LLVM的Python编译语言,可提升运行速度 展开 收起
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
1
https://gitee.com/hzy15610046011/melodie-boost.git
git@gitee.com:hzy15610046011/melodie-boost.git
hzy15610046011
melodie-boost
Melodie-Boost
main

搜索帮助