Skip to main content

Python to CLike language transpiler.

Project description

py2many: Python to many CLike languages transpiler

Build License

Why

Python is popular, easy to program in, but has poor runtime performance. We can fix that by transpiling a subset of the language into a more performant, statically typed language.

A second benefit is security. Writing security sensitive code in a low level language like C is error prone and could lead to privilege escalation. Specialized languages such as wuffs exist to address this use case. py2many can be a more general purpose solution to the problem where you can verify the source via unit tests before you transpile.

A third potential use case is to accelerate python code by transpiling it into an extension

Swift and Kotlin dominate the mobile app development workflow. However, there is no one solution that works well for lower level libraries where there is desire to share code between platforms. Kotlin Mobile Multiplatform (KMM) is a player in this place, but it hasn't really caught on. py2many provides an alternative.

Lastly, it's a great educational tool to learn a new language by implementing a backend for your favorite language.

Status

Rust is the language where the focus of development has been.

C++14 is historically the first language to be supported. C++17 is now required for some features.

Preliminary support exists for Julia, Kotlin, Nim, Go, Dart, V, and D.

py2many can also emit Python 3 code that includes inferred type annotations, and revisions to the syntax intended to simplify parsing of the code.

History

Based on Julian Konchunas' pyrs.

Based on Lukas Martinelli Py14 and Py14/python-3 branch by Valentin Lorentz.

Example

Original Python version.

def fib(i: int) -> int:
    if i == 0 or i == 1:
        return 1
    return fib(i - 1) + fib(i - 2)

Transpiled Rust code:

fn fib(i: i32) -> i32 {
    if i == 0 || i == 1 {
        return 1;
    }
    return (fib((i - 1)) + fib((i - 2)));
}

Transpiled code for other languages:

https://github.com/adsharma/py2many/tree/main/tests/expected (fib*)

Trying it out

Requirements:

  • Python 3.8+

Local installation:

pip3 install --user  # installs to $HOME/.local

OR

sudo pip3 install  # installs systemwide

Add the py2many script to your $PATH and run:

Transpiling:

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

Compiling:

clang tests/expected/fib.cpp
rustup run nightly cargo build -Zscript --manifest-path tests/expected/fib.rs
...
dmd -run tests/cases/fib.d

Many of the transpilers rely on a language specific formatter to parse the output and reformat it. Typically this is the most prominent formatter for the language, such as rustfmt for Rust.

Most of the transpilers also rely on external libraries to provide bridges from Python constructs to the target language.

The steps to install these external libraries can be found in .github/workflows/main.yml.

Contributing

See CONTRIBUTING.md for how to test your changes and contribute to this project.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

py2many-0.5.1.tar.gz (179.9 kB view details)

Uploaded Source

Built Distribution

py2many-0.5.1-py3-none-any.whl (135.3 kB view details)

Uploaded Python 3

File details

Details for the file py2many-0.5.1.tar.gz.

File metadata

  • Download URL: py2many-0.5.1.tar.gz
  • Upload date:
  • Size: 179.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.3

File hashes

Hashes for py2many-0.5.1.tar.gz
Algorithm Hash digest
SHA256 715183808172e7e08d6a49411167dfa0a2fdd79a4bfc1b88349f1f778be3cc5e
MD5 1035dafc4a382fcff5674478f0723404
BLAKE2b-256 8bcc40c32a97078f16786573f1451338fa3e516fd27ff4497705d554416404db

See more details on using hashes here.

File details

Details for the file py2many-0.5.1-py3-none-any.whl.

File metadata

  • Download URL: py2many-0.5.1-py3-none-any.whl
  • Upload date:
  • Size: 135.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.3

File hashes

Hashes for py2many-0.5.1-py3-none-any.whl
Algorithm Hash digest
SHA256 4a1f4d7ce6eb8cb1eb2fde74799d457371113bc901e3a9795ccd3eb06352cf8d
MD5 3213cbc079168d039fd9f9ba05224443
BLAKE2b-256 0f5c626cb2bc7b0ce610a4ad7a9bc9761b44d3014f0f918ee3370efe3bc868c9

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page