Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/t3tra-dev/lython

Python compiler toolchain that can be AOT compiled using LLVM as a foundation
https://github.com/t3tra-dev/lython

compiler llvm python

Last synced: 3 days ago
JSON representation

Python compiler toolchain that can be AOT compiled using LLVM as a foundation

Awesome Lists containing this project

README

        

> Please do not send pull requests to this repository.

# Lython - Python compiler toolchain based on LLVM

> [!TIP]
> Searching for **pyc**? You are in the right repo. **pyc** has been renamed to **Lython**.

```
๐Ÿš€ Benchmark Results
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”“
โ”ƒ runtime โ”ƒ time โ”ƒ result โ”ƒ
โ”กโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ฉ
โ”‚ LLVM(O1) โ”‚ 15.71ms (x0.69) โ”‚ 9227465 โ”‚
โ”‚ C(O1) โ”‚ 16.37ms (x0.72) โ”‚ 9227465 โ”‚
โ”‚ LLVM(O3) โ”‚ 17.17ms (x0.76) โ”‚ 9227465 โ”‚
โ”‚ C(O3) โ”‚ 17.30ms (x0.76) โ”‚ 9227465 โ”‚
โ”‚ C(O2) โ”‚ 17.88ms (x0.79) โ”‚ 9227465 โ”‚
โ”‚ LLVM(O2) โ”‚ 20.32ms (x0.90) โ”‚ 9227465 โ”‚
โ”‚ Lython โ”‚ 22.68ms (x1.00) โ”‚ 9227465 โ”‚
โ”‚ LLVM(O0) โ”‚ 23.15ms (x1.02) โ”‚ 9227465 โ”‚
โ”‚ C(O0) โ”‚ 33.34ms (x1.47) โ”‚ 9227465 โ”‚
โ”‚ Bun โ”‚ 54.52ms (x2.40) โ”‚ 9227465 โ”‚
โ”‚ Deno โ”‚ 80.33ms (x3.54) โ”‚ 9227465 โ”‚
โ”‚ Node.js โ”‚ 94.68ms (x4.17) โ”‚ 9227465 โ”‚
โ”‚ Python โ”‚ 611.73ms (x26.97) โ”‚ 9227465 โ”‚
โ”‚ Python(no GIL) โ”‚ 884.05ms (x38.97) โ”‚ 9227465 โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
```

**Lython** ใฏใ€Python ใ‚ณใƒผใƒ‰ใ‚’ LLVM IR ใซๅค‰ๆ› (ใƒˆใƒฉใƒณใ‚นใƒ‘ใ‚คใƒซ) ใ—ใ€ๆฉŸๆขฐ่ชžใธใ‚ณใƒณใƒ‘ใ‚คใƒซใ™ใ‚‹ใ“ใจใ‚’็›ฎๆŒ‡ใ—ใŸๅฎŸ้จ“็š„ใƒ—ใƒญใ‚ธใ‚งใ‚ฏใƒˆใงใ™ใ€‚
LLVM ใ‚’ๅŸบ็›คใซใ—ใคใคใ€CPython ใจใฏ็•ฐใชใ‚‹ๅฝขใง้™็š„ๅž‹ไป˜ใ‘ใฎใ‚ˆใ†ใซๆ‰ฑใ„ใชใŒใ‚‰ Python ใ‚ฝใƒผใ‚นใ‚’่งฃๆžใ—ใ€`clang` ใชใฉใฎใƒ„ใƒผใƒซใƒใ‚งใƒผใƒณใงใƒใ‚คใƒ†ใ‚ฃใƒ–ใƒใ‚คใƒŠใƒชใ‚’็”Ÿๆˆใ™ใ‚‹ใ“ใจใ‚’ใ‚ดใƒผใƒซใจใ—ใฆใ„ใพใ™ใ€‚

## Features
- **Python AST ใฎใƒˆใƒฉใƒใƒผใ‚น**: Python ใฎๆŠฝ่ฑกๆง‹ๆ–‡ๆœจใ‚’่งฃๆžใ—ใฆ LLVM IR ใ‚’็”Ÿๆˆ
- **ใƒ„ใƒผใƒซใƒใ‚งใƒผใƒณๆดป็”จ**: ็”Ÿๆˆใ—ใŸ IR ใ‚’ใ•ใ‚‰ใซ `clang` ใ‚„ `llc` ใชใฉใงใ‚ณใƒณใƒ‘ใ‚คใƒซใ—ใ€ๅฎŸ่กŒใƒ•ใ‚กใ‚คใƒซๅŒ–ใ‚’็‹™ใ†
- **ๅฎŸ้จ“็š„ใช้™็š„ๅž‹่งฃๆž**: Python ใซใ‚ˆใ‚‹ใ‚ฝใƒผใ‚นใ‚ณใƒผใƒ‰่งฃๆž้ƒจๅˆ†ใ‚’็ฐกๆ˜“็š„ใซ้™็š„ๅž‹ใƒใ‚งใƒƒใ‚ฏ้ขจใซๅ‡ฆ็†
- **ใƒฉใƒณใ‚ฟใ‚คใƒ  (`runtime/`) ใฎ่‡ชๅ‰ๅฎŸ่ฃ…**: ใƒกใƒขใƒช็ฎก็† (Boehm GC) ใ‚„ `print` ้–ขๆ•ฐใชใฉใ‚’ๆœ€ไฝŽ้™ C ่จ€่ชžใงๆไพ›

---

## Directory Structures

```text
โ”œโ”€โ”€ .gitignore
โ”œโ”€โ”€ .python-version # Python ใฎใƒใƒผใ‚ธใƒงใƒณๆŒ‡ๅฎš (3.12)
โ”œโ”€โ”€ .vscode/ # VSCode ็”จ่จญๅฎšใƒ•ใ‚กใ‚คใƒซ
โ”‚ โ”œโ”€โ”€ settings.json
โ”‚ โ””โ”€โ”€ c_cpp_properties.json
โ”œโ”€โ”€ bench.py # ใƒ™ใƒณใƒใƒžใƒผใ‚ฏ็”จใ‚นใ‚ฏใƒชใƒ—ใƒˆ
โ”œโ”€โ”€ benchmark/ # ใƒ™ใƒณใƒใƒžใƒผใ‚ฏใงไฝฟ็”จใ™ใ‚‹ใ‚ณใƒผใƒ‰็พค (C/JS/LLVM IR/Pythonใชใฉ)
โ”‚ โ”œโ”€โ”€ cfib.c
โ”‚ โ”œโ”€โ”€ jsfib.js
โ”‚ โ”œโ”€โ”€ llfib.ll
โ”‚ โ””โ”€โ”€ pyfib.py
โ”œโ”€โ”€ helloworld.ll # ใ‚ตใƒณใƒ—ใƒซใฎ "Hello, world!" LLVM IR
โ”œโ”€โ”€ src # ใƒกใ‚คใƒณใ‚ฝใƒผใ‚น
โ”‚ โ”œโ”€โ”€ lython
โ”‚ โ”‚ โ”œโ”€โ”€ __init__.py
โ”‚ โ”‚ โ”œโ”€โ”€ codegen
โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ir/ # LLVM IR ใ‚’ๆง‹็ฏ‰ใ™ใ‚‹ใŸใ‚ใฎใƒ“ใƒซใƒ€ใƒผ็ญ‰
โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ visitors/ # ๅ„็จฎ AST ใƒŽใƒผใƒ‰ใธใฎ Visitor ๅฎŸ่ฃ…
โ”‚ โ”‚ โ””โ”€โ”€ compiler/ # ็”Ÿๆˆใ•ใ‚ŒใŸ LLVM IR ใ‚’ใƒใ‚คใƒŠใƒชใซๅค‰ๆ›ใ™ใ‚‹ใƒญใ‚ธใƒƒใ‚ฏ (ll2bin ใชใฉ)
โ”‚ โ””โ”€โ”€ lythonc
โ”‚ โ””โ”€โ”€ __main__.py # CLIใฎใ‚จใƒณใƒˆใƒชใƒใ‚คใƒณใƒˆ
โ”œโ”€โ”€ pyproject.toml # Python ใƒ—ใƒญใ‚ธใ‚งใ‚ฏใƒˆ็ฎก็†็”จ (PEP 621)
โ”œโ”€โ”€ runtime/ # C ใงๅฎŸ่ฃ…ใ—ใŸใƒฉใƒณใ‚ฟใ‚คใƒ  (Boehm GC)
โ”‚ โ””โ”€โ”€ builtin/
โ”‚ โ”œโ”€โ”€ functions.c
โ”‚ โ”œโ”€โ”€ functions.h
โ”‚ โ”œโ”€โ”€ types.c
โ”‚ โ””โ”€โ”€ types.h
โ”œโ”€โ”€ samples/ # ไป–่จ€่ชžใ‹ใ‚‰็”Ÿๆˆใ—ใŸIRใฎใ‚ตใƒณใƒ—ใƒซ
โ”œโ”€โ”€ Makefile # ใƒฉใƒณใ‚ฟใ‚คใƒ ใฎใƒ“ใƒซใƒ‰็”จ
โ”œโ”€โ”€ source.py # Python ใฎใ‚ตใƒณใƒ—ใƒซใ‚ณใƒผใƒ‰
โ”œโ”€โ”€ source.py.ll # source.py ใ‚’ LLVM IR ๅŒ–ใ—ใŸไพ‹
โ”œโ”€โ”€ source.py.s # ใ•ใ‚‰ใซใ‚ขใ‚ปใƒณใƒ–ใƒชใพใง็”Ÿๆˆใ—ใŸไพ‹
โ””โ”€โ”€ uv.lock # uv ใซใ‚ˆใ‚‹ไพๅญ˜้–ขไฟ‚ใฎใƒญใƒƒใ‚ฏใƒ•ใ‚กใ‚คใƒซ
```

---

## ใ‚คใƒณใ‚นใƒˆใƒผใƒซ

### ็’ฐๅขƒๆง‹็ฏ‰

ใ“ใฎใƒชใƒใ‚ธใƒˆใƒชใงใฏ [uv](https://docs.astral.sh/uv) ใจใ„ใ†ใƒ‘ใƒƒใ‚ฑใƒผใ‚ธ็ฎก็†ใƒ„ใƒผใƒซใ‚’ไฝฟ็”จใ—ใฆใ„ใพใ™ใ€‚
Python 3.12 ไปฅไธŠใŒๅฟ…่ฆใงใ™ (`.python-version` ใง 3.12 ใ‚’ๆŒ‡ๅฎšใ—ใฆใ„ใพใ™)ใ€‚

1. **uv ใฎใ‚คใƒณใ‚นใƒˆใƒผใƒซ**
- **Unix (Linux/macOS)**:
```bash
curl -LsSf https://astral.sh/uv/install.sh | sh
```
- **Windows**:
```powershell
powershell -c "irm https://astral.sh/uv/install.ps1 | iex"
```
2. **ไพๅญ˜้–ขไฟ‚ใฎๅŒๆœŸ**
```bash
uv sync
```
ใ“ใ‚Œใซใ‚ˆใ‚Š `uv.lock` ใฎๅ†…ๅฎนใซๅพ“ใ„ใ€black, isort, rich ใชใฉใ‚’ใพใจใ‚ใฆใ‚คใƒณใ‚นใƒˆใƒผใƒซใ—ใพใ™ใ€‚
3. **ใ‚ณใƒณใƒ‘ใ‚คใƒฉใƒ„ใƒผใƒซใƒใ‚งใƒผใƒณ**
- LLVM/Clang ใŒๅฟ…่ฆใงใ™ใ€‚`clang --version` ใ‚„ `llc --version` ใŒไฝฟ็”จใงใใ‚‹็Šถๆ…‹ใซใ—ใฆใŠใใพใ—ใ‚‡ใ†ใ€‚
4. **ใƒฉใƒณใ‚ฟใ‚คใƒ ใฎใƒ“ใƒซใƒ‰**
- ใƒซใƒผใƒˆใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชใซใ‚ใ‚‹ `Makefile` ใ‚’ไฝฟใ„ใ€`runtime.o` ใ‚’็”Ÿๆˆใ—ใพใ™:
```bash
make
```
- `make clean` ใงใ‚ญใƒฃใƒƒใ‚ทใƒฅใ‚„ใƒใ‚คใƒŠใƒชใ‚’ๅ‰Š้™คๅฏ่ƒฝใงใ™ใ€‚

---

## ไฝฟ็”จๆ–นๆณ•

### 1. LLVM IR ใฎ็”Ÿๆˆ

```bash
python -m lythonc -emit-llvm
```
- ไพ‹:
```bash
python -m lythonc -emit-llvm source.py
```
ๅฎŸ่กŒๅพŒใ€`source.py.ll` ใŒๅŒไธ€ใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชใซ็”Ÿๆˆใ•ใ‚Œใพใ™ใ€‚

### 2. ใƒใ‚คใƒŠใƒชใธใฎใ‚ณใƒณใƒ‘ใ‚คใƒซ

```bash
python -m lythonc -o
```
- ไพ‹:
```bash
python -m lythonc source.py -o main
```
ๅฎŸ่กŒๅพŒใ€ `main` ใƒใ‚คใƒŠใƒชใŒ็”Ÿๆˆใ•ใ‚Œใพใ™ใ€‚

---

## ใƒ™ใƒณใƒใƒžใƒผใ‚ฏ

`bench.py` ใ‚’ไฝฟใ†ใจใ€ไปฅไธ‹ใฎใ‚ˆใ†ใช่จ€่ชž/ใƒฉใƒณใ‚ฟใ‚คใƒ /ใ‚ณใƒณใƒ‘ใ‚คใƒซใƒ‘ใ‚ฟใƒผใƒณใงใƒ•ใ‚ฃใƒœใƒŠใƒƒใƒ (n=35) ใฎๅฎŸ่กŒๆ™‚้–“ใ‚’ๆฏ”่ผƒใงใใพใ™:

- Node.js / Bun / Deno (JavaScript)
- C (clang) with -O0, -O1, -O2, -O3
- LLVM IR (clang) with -O0, -O1, -O2, -O3
- **Lython**
- Python (CPython), Python(no GIL)

#### ไฝฟใ„ๆ–น

```bash
python bench.py
```

- ใ‚นใ‚ฏใƒชใƒ—ใƒˆๅ†…ใฎ `setup()` ้–ขๆ•ฐใงไบ‹ๅ‰ใซ C ใ‚„ LLVM IR ใฎใ‚ณใƒณใƒ‘ใ‚คใƒซใ‚’่กŒใ„ใ€ใใฎๅพŒใใ‚Œใžใ‚ŒๅฎŸ่กŒใ—ใฆๅนณๅ‡ๅฎŸ่กŒๆ™‚้–“ใ‚’ๆธฌๅฎšใ—ใพใ™ใ€‚
- ็ตๆžœใฏใ‚ฟใƒผใƒŸใƒŠใƒซไธŠใซ่กจๅฝขๅผ๏ผˆ`rich`๏ผ‰ใงๅ‡บๅŠ›ใ•ใ‚Œใพใ™ใ€‚

---

## ใƒฉใƒณใ‚ฟใ‚คใƒ 

`runtime/` ใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒช้…ไธ‹ใซ C่จ€่ชžใงๅฎŸ่ฃ…ใ—ใŸๆœ€ๅฐ้™ใฎใƒฉใƒณใ‚ฟใ‚คใƒ ๏ผˆBoehm GC ไฝฟ็”จ๏ผ‰ใŒ็ฝฎใ‹ใ‚Œใฆใ„ใพใ™ใ€‚

- `builtin/functions.c / .h`
- `PyInt_FromI32`, `PyList_New`, `int2str`, `print` ใชใฉใ‚’ๆไพ›
- LLVM IR ใ‹ใ‚‰ `declare` ๅ‘ผใณๅ‡บใ—ใ™ใ‚‹ใ“ใจใงใ€Python ็ต„ใฟ่พผใฟ้ขจใฎ้–ขๆ•ฐใ‚’ๅฎŸ่ฃ…
- `builtin/types.c / .h`
- `String`, `PyInt`, `PyList` ใชใฉใฎๅž‹ใ‚’ๅฎš็พฉ
- ๅ‹•็š„ใƒกใƒขใƒช็ฎก็†ใฏ Boehm GC ใซไปปใ›ใ€Python ็š„ใชใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใ‚’็ฐกๆ˜“็š„ใซๅ†็พ

ใ“ใ‚Œใ‚‰ใฎใƒฉใƒณใ‚ฟใ‚คใƒ ใ‚’ใƒชใƒณใ‚ฏใ™ใ‚‹ใ“ใจใงใ€`print("Hello, world!")` ใ‚„ใƒชใ‚นใƒˆๆ“ไฝœใชใฉใฎๅ‡ฆ็†ใŒๅฏ่ƒฝใซใชใ‚Šใพใ™ใ€‚

---

## ไปŠๅพŒใฎไบˆๅฎš / ๆณจๆ„็‚น

- **ๅž‹ๆŽจ่ซ–ใฎๅผทๅŒ–**: ใพใ  `int` / `str` ใชใฉไธ€้ƒจๅž‹ใซใ—ใ‹ๅฏพๅฟœใ—ใฆใ„ใชใ„
- **ๅˆถๅพกๆง‹ๆ–‡ใฎๆ‹กๅผต**: `while`, `for`, `try` ใ‚„ใ‚ฏใƒฉใ‚นๅฎš็พฉใฏๆœชๅฎŸ่ฃ…
- **ๆœ€้ฉๅŒ–ใƒ‘ใ‚น**: ใปใผ `clang -O2` ใชใฉใซไธธๆŠ•ใ’ใ€‚ๅฐ†ๆฅ็š„ใซ LLVM ใฎๆœ€้ฉๅŒ–ใƒ‘ใ‚นใ‚’ใ‚ซใ‚นใ‚ฟใƒ ใ™ใ‚‹ๅฏ่ƒฝๆ€งใ‚ใ‚Š
- **Windows ็ญ‰ใฎใ‚ตใƒใƒผใƒˆ**: ้–‹็™บใฏไธปใซ Unix ็ณป (Linux, macOS) ใ‚’ๆƒณๅฎšใ€‚Windows ใงใฎๆคœ่จผใฏ้™ๅฎš็š„ใงใ™

ๆœฌใƒ—ใƒญใ‚ธใ‚งใ‚ฏใƒˆใฏๅฎŸ้จ“็š„ๆฎต้šŽใฎใŸใ‚ใ€ไปŠๅพŒไป•ๆง˜ๅค‰ๆ›ดใŒๅ…ฅใ‚‹ๅ ดๅˆใŒใ‚ใ‚Šใพใ™ใ€‚
่ˆˆๅ‘ณใ‚’ๆŒใฃใฆใ„ใŸใ ใ‘ใŸๆ–นใฏใ€้€ฃ่ผ‰ใƒ–ใƒญใ‚ฐ่จ˜ไบ‹ใ‚„ใ‚ตใƒณใƒ—ใƒซใ‚’ๅ‚่€ƒใซใ€ใœใฒ่ฉฆใ—ใฆใฟใฆใใ ใ•ใ„๏ผ

---

## ใƒฉใ‚คใ‚ปใƒณใ‚น

ๆœฌใƒชใƒใ‚ธใƒˆใƒชใฎใ‚ฝใƒผใ‚นใ‚ณใƒผใƒ‰ใฏใ€็‰น่จ˜ใŒใชใ„้™ใ‚Š [MIT License](https://opensource.org/licenses/MIT) ใง้…ๅธƒใ•ใ‚Œใฆใ„ใพใ™ใ€‚
่ฉณ็ดฐใฏใ‚ฝใƒผใ‚นใ‚ณใƒผใƒ‰ๅ†…ใฎ่จ˜่ฟฐ๏ผˆ`lython/__init__.py` ใชใฉ๏ผ‰ใ‚’ใ”ๅ‚็…งใใ ใ•ใ„ใ€‚