easy .py to .cpp -> .exe transpiler
- C++ 95.1%
- Python 4.6%
- Batchfile 0.3%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| include | ||
| src | ||
| tests | ||
| build.bat | ||
| calculator.py | ||
| py2cpp.exe | ||
| README.md | ||
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;
}
Поддерживаемые возможности
- Структура программы: функции (
def), возвращаемые значения (return), вложенные и взаимно рекурсивные вызовы. - Управляющие конструкции:
if,elif,else, циклыwhile, циклыfor .. in ..(включаяrange(...)и итерацию по спискам/коллекциям),break,continue,pass. - Вызовы библиотек:
import module,from module import func, const, вызов атрибутов и методовobj.method(...). - Типы данных: целые числа, вещественные числа, строки (с экранированием), булевы значения (
True/False),None, списки[...], кортежи(...), словари{...}. - Операторы:
+,-,*,/,//(floor division),%,**(pow),==,!=,<,<=,>,>=,in,not,and,or. - Доступ по индексам и ключам: чтение и запись
arr[i] = val,dict["key"] = val.