Skip to content

lux-QAQ/llvmpy

Repository files navigation

llvmpy v3.0

中文 | English

简介

这是一个Python的前端编译器,主要用于把Python代码编译成LLVMIR代码,最后生成可执行文件的过程由Clang来完成。

目前来说这仅仅只是一个玩具的地步,因为要实现真正的编译器不应该一上来就开始搓代码。而是应该先了解Python的各种语法和特性之后,先确定下来整体架构在开始编写代码。但是我却逆其道而行之,只是按照自己的印象来实现一个简易的Python编译器,估计连Python的子集都算不上,因为有很多功能确实和原版Python有出入。我不知道我的兴趣还能够支撑这个项目多久。


功能介绍

目前该项目完全是按照example.py中所需要的功能来实现的,其他的功能暂时没有实现。所以其实暂时没有什么介绍的必要性

数据类型

  • 高精度计算(GMP默认256精度):
    • 支持float浮点数
    • 支持int整数
    • 支持bool布尔值
    • 支持complex复数(暂无计划)

特殊类型

  • 支持None空值
  • 支持Any任意类型
  • 支持函数对象
  • 自定义类对象
  • 支持Ellipsis省略号 (暂无计划)

容器

  • 支持string字符串
    • 支持转义字符
    • 支持字符串拼接
    • f-string (暂无计划)
  • 支持list列表
    • 支持多维列表 ,支持混合类型
  • 支持dict字典
    • 支持混合类型的 key-value(RunTime中支持hash的都可以key-value)
  • 支持set集合(暂无计划)
  • 支持tuple元组(暂无计划)

语法

  • 支持复杂的加减乘除乘法运算符

    • 支撑string字符串拼接
    • 支持list的拼接([1,2] + [3,4]*2)
  • 支持大多数运算符:

    • 支持== != > < >= <=
    • 支持逻辑短路
    • 支持is in not in is not
    • 支持& | ^ << >> (Lexer和RunTime支持了但是,Parser和CodeGen没有)
    • 支持容器对象的表比较
  • 支持if-elif-else语句

  • 支持def函数定义 :

    • 支持泛型
    • 支持函数对象
    • 支撑函数内定义函数
  • 支持lambda表达式

  • 支持列表推导式

  • 支持while-else语句

  • 支持for-else语句

  • 支持try-except语句

  • 支持with语句

  • 支持class

  • 支持async await语句(暂无计划)

多文件

  • 目前只支持单文件main()作为入口点,全局执行也可以
  • 支持多文件编译
  • 支持import from-import import as from-import as语句
  • 支持__name__ __main__语句 (暂无计划)
  • 支持__all__ (暂无计划)
  • 支持__init__.py

测试案例

详细的功能测试请参考tests_auto/中的测试用例.
alltest.sh是一个自动化测试脚本,可以自动化运行所有的测试用例:

  • tests_auto/checkneeds : 检查return 0\return 1\if-else之类最基础功能的是否正常因为他们是接下来其他测试的依赖.他们是特殊的,所以这下面的测试用例需要同名的*.sh脚本特判
  • tests_auto/ : 测试复杂功能,通过自我的if-else-if语句来实现,所以需要tests_auto/checkneeds的支持

简单使用

compile.sh是一个简单的编译脚本,可以直接编译./test.py文件,并且运行

关于性能

  • 调用GMPmpz来实现高精度计算,但是性能上来说还是有点差的,因为mpz的性能比int要差很多
  • LLVMIR代码生成器是一个简单的实现,所以性能上来说还是有点差的,因为没有做很多的优化
  • 使用了libffi来实现未知签名调用,比原生的C函数调用要慢1.5倍左右
  • 静态分析做的特别差

License

License: CC BY-NC-SA 4.0

本项目采用
Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License
进行许可。

About

Simple python code implemented via llvm is converted into a compiler for IR

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors