easy .py to .cpp -> .exe transpiler
  • C++ 95.1%
  • Python 4.6%
  • Batchfile 0.3%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-09-12 18:00:44 +03:00
include Initial commit 2026-09-12 18:00:44 +03:00
src Initial commit 2026-09-12 18:00:44 +03:00
tests Initial commit 2026-09-12 18:00:44 +03:00
build.bat Initial commit 2026-09-12 18:00:44 +03:00
calculator.py Initial commit 2026-09-12 18:00:44 +03:00
py2cpp.exe Initial commit 2026-09-12 18:00:44 +03:00
README.md Initial commit 2026-09-12 18:00:44 +03:00

py2cpp: Python to C++ Transpiler

Парсер и транспилятор Python в C++, исходный код которого написан на C++.

Транспилятор преобразует Python-код в эквивалентную программу на C++, где:

  • Основной код становится нативным C++ (функция main(), функции с сигнатурами py::Value func(...), циклы for/while, условия if/elif/else).
  • Для вычислений, динамических типов и вызова библиотек используется встроенный Python C API через легковесную заголовочную библиотеку py_runtime.hpp.
  • Вы можете прозрачно вызывать любые стандартные библиотеки Python (math, sys, json, random и т.д.) или сторонние пакеты, сохраняя архитектуру C++ приложения.

Архитектура проекта

py2cpp/
├── include/
│   └── py_runtime.hpp       # Заголовочная библиотека-обертка над Python C API (RAII py::Value, py::Runtime)
├── src/
│   ├── token.hpp            # Определение типов токенов и структуры Token
│   ├── lexer.hpp / .cpp     # Лексер Python с поддержкой стека отступов (INDENT, DEDENT)
│   ├── ast.hpp              # Узлы абстрактного синтаксического дерева (AST)
│   ├── parser.hpp / .cpp    # Рекурсивный нисходящий парсер Python в AST
│   ├── codegen.hpp / .cpp   # Генератор чистого C++ кода из AST
│   └── main.cpp             # CLI интерфейс транспилятора
├── tests/
│   ├── test_basic.py        # Тест функций, рекурсии, циклов и условий
│   ├── test_math_lib.py     # Тест импорта и вызова библиотеки math
│   └── test_collections.py  # Тест списков, словарей, методов (.append) и операторов (in, and, not)
└── README.md

1. Сборка самого транспилятора (на C++)

Транспилятор не требует внешних зависимостей для своей сборки (только стандартный компилятор C++17):

g++ -std=c++17 -O2 src/main.cpp src/lexer.cpp src/parser.cpp src/codegen.cpp -Iinclude -o py2cpp.exe

2. Использование транспилятора

Для трансляции Python-скрипта в C++ исходный код:

# Транспиляция (по умолчанию автоматически создает calculator.cpp)
./py2cpp.exe calculator.py

# С явным указанием пути вывода
./py2cpp.exe calculator.py -o output.cpp

# Вывод в консоль
./py2cpp.exe calculator.py --stdout

Справка:

Usage: py2cpp.exe <input.py> [-o <output.cpp>]

Options:
  -o <file>    Specify output C++ source file path (default: <input>.cpp)
  --stdout     Print generated C++ code to terminal stdout
  -h, --help   Show this help message

3. Компиляция сгенерированного C++ кода

Так как вы компилируете полученный код самостоятельно, используйте компилятор C++ (например, MinGW g++) с подключением заголовочных файлов и библиотек Python:

g++ -std=c++17 output.cpp -Iinclude -IC:\Python314\include -LC:\Python314\libs -lpython314 -o output.exe

После чего запустите бинарник:

./output.exe

(Замените C:\Python314 на путь к вашей установке Python, если версия или каталог отличаются).


Пример работы

Исходный Python (example.py):

import math

def calculate(x):
    if x > 0:
        return math.sqrt(x) * 2
    return 0

for i in range(1, 5):
    print("sqrt * 2 for", i, "=", calculate(i))

Команда транспиляции:

./py2cpp.exe example.py -o example.cpp

Сгенерированный C++ (example.cpp):

// Generated by py2cpp - Python to C++ Transpiler
#include "py_runtime.hpp"
#include <iostream>

// Forward declarations
py::Value calculate(py::Value x);

py::Value calculate(py::Value x) {
    if (((x > py::Value(0LL))).is_truthy()) {
        return (((math).attr("sqrt")(x) * py::Value(2LL)));
    }
    return py::Value(0LL);
    return py::Value();
}

int main(int argc, char** argv) {
    py::Runtime __py_guard(argc, argv);

    // Top-level variables
    py::Value math;
    py::Value i;

    math = py::import("math");
    for (const auto& __item_1 : py::range(py::Value(1LL), py::Value(5LL))) {
        i = __item_1;
        py::print(py::Value("sqrt * 2 for"), i, py::Value("="), calculate(i));
    }
    return 0;
}

Поддерживаемые возможности

  1. Структура программы: функции (def), возвращаемые значения (return), вложенные и взаимно рекурсивные вызовы.
  2. Управляющие конструкции: if, elif, else, циклы while, циклы for .. in .. (включая range(...) и итерацию по спискам/коллекциям), break, continue, pass.
  3. Вызовы библиотек: import module, from module import func, const, вызов атрибутов и методов obj.method(...).
  4. Типы данных: целые числа, вещественные числа, строки (с экранированием), булевы значения (True/False), None, списки [...], кортежи (...), словари {...}.
  5. Операторы: +, -, *, /, // (floor division), %, ** (pow), ==, !=, <, <=, >, >=, in, not, and, or.
  6. Доступ по индексам и ключам: чтение и запись arr[i] = val, dict["key"] = val.