Skip to content

nkarbofos/mypython_compiler_cplusplus

Repository files navigation

MyPython - Компилятор языка Python на C++

Проект представляет собой полнофункциональный компилятор Python, реализованный на C++. Проект включает в себя все основные компоненты компилятора: лексер, парсер, компилятор, виртуальную машину, сборщик мусора и JIT-компилятор.

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

Проект состоит из следующих основных компонентов:

Компоненты компилятора

  1. Lexer (src/frontend/Lexer.cpp) - токенизация исходного кода Python

    • Поддержка индентации Python
    • Распознавание ключевых слов, операторов, литералов
    • Обработка строк, чисел, идентификаторов
  2. Parser (src/frontend/Parser.cpp) - парсинг токенов в AST (Abstract Syntax Tree)

    • Рекурсивный спуск
    • Поддержка выражений, операторов, циклов, условий
    • Обработка блоков кода с индентацией
  3. ASTAdapter (src/frontend/ASTAdapter.cpp) - адаптер между AST структурами

    • Конвертация AST от Parser в формат, ожидаемый Compiler
    • Преобразование типов выражений и операторов
  4. Compiler (src/compiler/bytecode.cpp) - компиляция AST в байт-код

    • Генерация байт-кода для кастомной виртуальной машины
    • Оптимизация кода на этапе компиляции
    • Управление константами и функциями
  5. Virtual Machine (Custom) (src/compiler/bytecode.cpp::bc::vm) - выполнение кастомного байт-кода

    • Стековая виртуальная машина
    • Выполнение байт-кода с поддержкой функций, циклов, условий
  6. Virtual Machine (Python) (src/vm/VirtualMachine.cpp) - выполнение Python байт-кода

    • Использует Python's Frame для выполнения байт-кода Python
    • Поддержка всех операций Python 3.13.7
    • Интеграция с Python runtime через pybind11
  7. Garbage Collector (src/vm/GarbageCollector.cpp) - сборщик мусора

    • Управление памятью для объектов виртуальной машины
    • Отслеживание корневых объектов
  8. JIT Compiler (src/jit/JitCompiler.cpp) - JIT-компиляция

    • Оптимизация горячих функций
    • Генерация оптимизированного кода

Поток данных компиляции

Python Source Code
    ↓
[Lexer] → Tokens (vector<Token>)
    ↓
[Parser] → Parser AST (Program/Stmt/Expr)
    ↓
[ASTAdapter] → Compiler AST (ast::Program/ast::Stmt/ast::Expr)
    ↓
[Compiler] → Bytecode Module (bc::module)
    ↓
[Custom VM] → Execution Result

Структура проекта

project-huawei/
├── include/                 # Заголовочные файлы
│   ├── frontend/           # Лексер, парсер, адаптер
│   │   ├── Lexer.hpp
│   │   ├── Token.hpp
│   │   ├── ASTAdapter.hpp
│   │   └── CompilerPipeline.hpp
│   ├── python/             # AST и runtime для компилятора
│   │   ├── ast.hpp
│   │   ├── bytecode.hpp
│   │   ├── token.hpp
│   │   └── runtime.hpp
│   ├── vm/                 # Виртуальная машина Python
│   │   ├── VirtualMachine.hpp
│   │   ├── Frame.hpp
│   │   ├── GarbageCollector.hpp
│   │   └── ...
│   └── jit/                # JIT компилятор
│       └── JitCompiler.hpp
├── src/                    # Исходные файлы
│   ├── frontend/          # Реализация лексера, парсера
│   ├── compiler/          # Компилятор байт-кода
│   ├── vm/                # Виртуальная машина
│   ├── jit/               # JIT компилятор
│   └── bindings/          # Python bindings (pybind11)
├── tests/                 # Тесты
├── CMakeLists.txt         # CMake конфигурация
└── README.md             # Этот файл

Требования

Для Linux/Mac:

  • CMake 3.25 или выше
  • C++17 компилятор (GCC 7+, Clang 5+)
  • Python 3.8+ с заголовочными файлами (python3-dev)
  • pybind11 (автоматически загружается через CMake)

Для Windows:

  • Visual Studio 2022 или новее (с компонентами C++)
  • Python 3.13 (официальный установщик, не из Microsoft Store)
  • CMake 3.25+
  • Ninja (опционально, для быстрой сборки)

Сборка проекта

Linux/Mac

# Клонируйте репозиторий
git clone https://github.com/ваш-логин/project-huawei.git
cd project-huawei

# Создайте директорию для сборки
cmake -B build -DCMAKE_BUILD_TYPE=Release

# Соберите проект
cmake --build build

# Модуль будет находиться в build/mypython.cpython-*.so
# Добавьте путь к модулю в PYTHONPATH
export PYTHONPATH="${PYTHONPATH}:$(pwd)/build"

Windows

# Откройте x64 Native Tools Command Prompt for VS 2022
git clone https://github.com/ваш-логин/project-huawei.git
cd project-huawei

# Сборка с Ninja (рекомендуется)
cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Release
cmake --build build

# Или с Visual Studio
cmake -B build -G "Visual Studio 17 2022" -A x64
cmake --build build --config Release

# Модуль будет: build\Release\mypython.pyd
# Или: build\mypython.pyd (в зависимости от генератора)

Режим отладки

Для включения отладочного вывода:

cmake -B build -DCMAKE_BUILD_TYPE=Debug -DMYPYTHON_DEBUG=ON
cmake --build build

Использование

Python API

После сборки модуль mypython можно использовать в Python:

import mypython

# Стандартный режим - использует Python VM (через Python compile())
mypython.run("""
x = 10
y = 20
print(x + y)
""")

# Кастомный пайплайн - использует полный кастомный компилятор
# Lexer -> Parser -> ASTAdapter -> Compiler -> Custom VM
mypython.run_custom("""
x = 10;
y = 20;
print(x + y);
""")

# Токенизация (для отладки)
mypython.lex("x = 10; print(x);")

Примеры использования

Базовые операции

import mypython

# Арифметические операции
mypython.run_custom("""
a = 5;
b = 3;
c = a + b;
print(c);
""")

# Условия
mypython.run_custom("""
x = 10;
if x > 5:
    print("x is greater than 5");
else:
    print("x is not greater than 5");
""")

# Циклы
mypython.run_custom("""
i = 0;
while i < 5:
    print(i);
    i = i + 1;
""")

Работа со списками

import mypython

mypython.run_custom("""
arr = [1, 2, 3];
print(arr[0]);
arr[1] = 10;
print(arr[1]);
""")

Тестирование

Запуск тестов:

# Сборка тестов
cmake --build build

# Запуск отдельных тестов
./build/test_lexer
./build/test_parser
./build/test_compiler
./build/test_vm
./build/test_gc
./build/test_jit

# Python тесты
python tests/test_basic.py

API документация

Функции модуля mypython

mypython.run(code: str)

Выполняет Python код, используя стандартную Python VM (через compile()).

Параметры:

  • code (str): Исходный код Python

Пример:

mypython.run("print('Hello, World!')")

mypython.run_custom(code: str)

Выполняет Python код через полный кастомный пайплайн:

  1. Lexer - токенизация
  2. Parser - парсинг в AST
  3. ASTAdapter - конвертация AST
  4. Compiler - генерация байт-кода
  5. Custom VM - выполнение

Параметры:

  • code (str): Исходный код Python

Пример:

mypython.run_custom("x = 10; print(x);")

Примечание: В кастомном режиме требуется точка с запятой после операторов.

mypython.lex(source: str)

Токенизирует исходный код и выводит токены на экран (для отладки).

Параметры:

  • source (str): Исходный код для токенизации

Пример:

mypython.lex("x = 10; print(x);")
# Выведет:
# NAME("x")
# ASSIGN
# NUMBER(10)
# SEMICOLON
# ...

Компоненты в деталях

Lexer

Лексер разбивает исходный код на токены. Поддерживает:

  • Числа (целые)
  • Строки (одинарные и двойные кавычки)
  • Идентификаторы и ключевые слова
  • Операторы и разделители
  • Индентацию Python (INDENT/DEDENT)

Parser

Парсер строит AST из токенов. Поддерживает:

  • Выражения: числа, переменные, вызовы функций, операции
  • Операторы: присваивание, print, if/else, while
  • Блоки кода с индентацией

ASTAdapter

Адаптер конвертирует AST от Parser в формат, ожидаемый Compiler:

  • Конвертация типов выражений
  • Преобразование операторов
  • Адаптация структур данных

Compiler

Компилятор генерирует байт-код из AST:

  • Операции стека (push, pop)
  • Арифметические операции (add, sub, mul, div, mod)
  • Сравнения (cmp_eq, cmp_ne, cmp_lt, и т.д.)
  • Потоки управления (jmp, jmp_if_false)
  • Вызовы функций (call, ret)
  • Работа с массивами (load_elem, store_elem, new_array)

Virtual Machine

Две реализации VM:

  1. Custom VM (bc::vm) - выполняет кастомный байт-код

    • Стековая архитектура
    • Поддержка функций и вызовов
    • Управление локальными переменными
  2. Python VM (mypython::vm::VirtualMachine) - выполняет Python байт-код

    • Использует Python Frame
    • Поддержка всех операций Python 3.13.7
    • Интеграция с Python runtime

Garbage Collector

Сборщик мусора управляет памятью:

  • Отслеживание объектов
  • Сборка недостижимых объектов
  • Интеграция с виртуальной машиной

JIT Compiler

JIT-компилятор оптимизирует горячие функции:

  • Профилирование выполнения
  • Компиляция часто вызываемых функций
  • Генерация оптимизированного кода

Разработка

Добавление новых функций

  1. Новые операторы:

    • Добавьте токен в Lexer.cpp
    • Добавьте правило парсинга в Parser.cpp
    • Добавьте конвертацию в ASTAdapter.cpp
    • Добавьте генерацию байт-кода в bytecode.cpp
    • Добавьте выполнение в bc::vm::exec()
  2. Новые типы данных:

    • Расширьте runtime::Value в runtime.hpp
    • Добавьте поддержку в компилятор и VM

Отладка

Включите режим отладки:

cmake -B build -DMYPYTHON_DEBUG=ON

Это выведет дополнительную информацию о выполнении.

Известные ограничения

  • Кастомный пайплайн требует точки с запятой после операторов
  • Не все функции Python поддерживаются в кастомном режиме
  • Генераторы работают не полностью в Python VM режиме
  • Некоторые сравнения в assert могут не работать

Авторы

Метальников Никита, Круглова Анастасия, Мельникова Анастасия, Миронов Кирилл

Инструменты

  • pybind11 - для Python bindings
  • Python 3.13.7 - как эталон для совместимости

About

Custom Python compiler written in c++

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors