你是否厌倦了Python的运行速度?你是否渴望拥有一个既能保持Python语言优雅,又能拥有原生代码般速度的解决方案?Pylir是一个正在积极开发中的Python AOT(Ahead-of-Time)编译器,目标是将Python代码编译成速度极快的原生可执行文件。
什么是Pylir?
Pylir是一个用C++17编写的高性能Python AOT编译器。它利用MLIR(Multi-Level Intermediate Representation)作为中间表示,并以LLVM作为后端,最终生成高效的机器码。不同于传统的解释器,Pylir在运行前将代码编译成机器码,从而显著提升运行速度。同时,它致力于最大限度地兼容Python语言规范,力求在速度和兼容性之间取得最佳平衡。
Pylir 如何使用?
Pylir拥有类似GCC的命令行界面,所有选项都可以通过pylir --help查看。编译Python程序非常简单,只需要将主模块文件路径传递给编译器即可:pylir test.py。这将生成名为test的可执行文件(Windows系统下为test.exe)。使用-o标志可以更改输出文件名。
目前默认情况下不启用优化。要启用优化,请传递-O3命令行标志。
Pylir 的当前状态
Pylir 目前仍在积极开发中。前端部分已基本完成,支持解析Python 3.9代码。编译器已经能够编译许多内置类型,并且一些内置命名空间的函数(例如print)也已可用。一些运算符已实现,但其他运算符仍在开发中。异常处理已完成,并且已经实现了非常基础的垃圾回收机制。
你可以通过查看Pylir的测试套件来了解其当前的语言兼容性。目前大部分精力都集中在优化器方面。
Pylir 使用的技术
Pylir 从头开始使用C++17编写,并使用了以下显著的技术:
- • MLIR: Pylir 的核心部分使用了MLIR,它用于创建高层次的中间表示 (IR),精确地模拟 Python 代码的语义。大部分优化都在 MLIR 中进行,然后逐渐将其降低到 LLVM IR。
- • LLVM: LLVM 作为编译器的后端。一旦 MLIR 优化器将代码降低到 C/C++ 抽象级别,LLVM 就会运行其优化器来应用低级别优化,最终为请求的目标发出本地机器码。项目还利用了 LLVM 出色的垃圾收集支持(通过状态点),以支持 100% 精确的垃圾收集,并能在未来迁移到更优的垃圾收集器。
从源码构建 Pylir
从源码构建 Pylir 需要 C++17 编译器、cmake 以及正确版本的 MLIR、LLVM 和 LLD。 MLIR 是一个发展迅速的项目,Pylir 的源代码会紧跟其最新版本。构建特定 Pylir 版本所需测试的修订版本总是记录在项目文档中。Pylir 需要在该版本下构建 LLVM、MLIR 和 LLD,然后才能通过 cmake 找到它们。可以通过 CMAKE_PREFIX_PATH 变量将 cmake 指向 LLVM 和 MLIR 的安装位置。
Pylir 源码结构简介
- • src: 包含构成编译器的所有 C++ 代码。
- • CodeGen: 包含前端 AST 到 MLIR 的生成。
- • Diagnostics: 词法分析器和解析器使用的诊断基础设施。
- • Interfaces: 编译器中使用的公共信息。
- • LLVM: 主要用于垃圾收集的自定义 LLVM 传递和插件。
- • Optimizer: 使用 MLIR 的优化器,包括方言、转换传递、分析传递和方言降低。
- • Runtime: 链接到最终可执行文件的运行时代码,包含与 Python 对象交互的 C++ API,以及实现异常处理和垃圾收集的支持代码。
- • Support: 编译器和运行时使用的各种实用程序代码和数据结构。
总结
Pylir 作为一个极具潜力的Python AOT编译器,正在逐步完善中。它结合了MLIR和LLVM的优势,目标是实现兼顾速度和语言兼容性的Python原生执行。尽管仍在开发中,但其已展现出令人兴奋的性能提升潜力,值得关注和期待。Pylir 有可能改变Python程序的运行方式,使其在性能方面与其他编译型语言相媲美。
项目地址:https://github.com/Pylir/Pylir