Python到CLike语言编译器。
项目描述
py2many: Python到许多CLike语言的编译器
原因
Python很受欢迎,易于编程,但运行时性能较差。我们可以通过将语言的子集编译到一个性能更好、静态类型化的语言中,来解决这个问题。
第二个好处是安全性。在C这样的低级语言中编写安全敏感的代码容易出错,可能会导致权限提升。存在专门的语言,如wuffs,来解决这个问题。py2many可以作为验证源通过单元测试再进行编译的更通用解决方案。
第三个潜在用例是将Python代码编译为扩展来加速Python代码。
Swift和Kotlin主导着移动应用开发流程。然而,对于希望在不同平台之间共享代码的低级库来说,还没有一个解决方案能够很好地工作。Kotlin Mobile Multiplatform (KMM)是这方面的参与者,但它并没有真正流行起来。py2many提供了一个替代方案。
最后,它是一个很好的教育工具,可以通过为你的最爱语言实现后端来学习一门新语言。
状态
Rust是开发重点所在的编程语言。
C++14是历史上第一个被支持的语言。现在,C++17是某些特性的要求。
初步支持Julia、Kotlin、Nim、Go、Dart、V和D。
py2many还可以生成包含推断类型注解的Python 3代码,以及旨在简化代码解析语法的修订。
历史
基于Julian Konchunas的pyrs。
基于Lukas Martinelli的Py14和Valentin Lorentz的Py14/python-3分支。
示例
原始Python版本。
def fib(i: int) -> int:
if i == 0 or i == 1:
return 1
return fib(i - 1) + fib(i - 2)
转换后的Rust代码
fn fib(i: i32) -> i32 {
if i == 0 || i == 1 {
return 1;
}
return (fib((i - 1)) + fib((i - 2)));
}
转换后的其他语言代码
https://github.com/adsharma/py2many/tree/main/tests/expected (fib*)
尝试使用
需求
- Python 3.8+
本地安装
pip3 install --user # installs to $HOME/.local
或者
sudo pip3 install # installs systemwide
将py2many脚本添加到您的$PATH中并运行
转换
py2many --cpp=1 tests/cases/fib.py
py2many --rust=1 tests/cases/fib.py
py2many --julia=1 tests/cases/fib.py
py2many --kotlin=1 tests/cases/fib.py
py2many --nim=1 tests/cases/fib.py
py2many --dart=1 tests/cases/fib.py
py2many --go=1 tests/cases/fib.py
py2many --dlang=1 tests/cases/fib.py
编译
clang tests/expected/fib.cpp
rustup run nightly cargo build -Zscript --manifest-path tests/expected/fib.rs
...
dmd -run tests/cases/fib.d
大多数转换器都依赖于语言特定的格式化器来解析输出并重新格式化。通常这是该语言最突出的格式化器,例如Rust的rustfmt
。
大多数转换器还依赖于外部库来提供从Python构造到目标语言的桥梁。
安装这些外部库的步骤可以在.github/workflows/main.yml
中找到。
贡献
有关如何测试您的更改并向此项目贡献的说明,请参阅CONTRIBUTING.md。
项目详情
下载文件
下载适合您平台的自定义文件。如果您不确定选择哪个,请了解有关安装包的更多信息。