Проект представляет собой полнофункциональный компилятор Python, реализованный на C++. Проект включает в себя все основные компоненты компилятора: лексер, парсер, компилятор, виртуальную машину, сборщик мусора и JIT-компилятор.
Проект состоит из следующих основных компонентов:
-
Lexer (
src/frontend/Lexer.cpp) - токенизация исходного кода Python- Поддержка индентации Python
- Распознавание ключевых слов, операторов, литералов
- Обработка строк, чисел, идентификаторов
-
Parser (
src/frontend/Parser.cpp) - парсинг токенов в AST (Abstract Syntax Tree)- Рекурсивный спуск
- Поддержка выражений, операторов, циклов, условий
- Обработка блоков кода с индентацией
-
ASTAdapter (
src/frontend/ASTAdapter.cpp) - адаптер между AST структурами- Конвертация AST от Parser в формат, ожидаемый Compiler
- Преобразование типов выражений и операторов
-
Compiler (
src/compiler/bytecode.cpp) - компиляция AST в байт-код- Генерация байт-кода для кастомной виртуальной машины
- Оптимизация кода на этапе компиляции
- Управление константами и функциями
-
Virtual Machine (Custom) (
src/compiler/bytecode.cpp::bc::vm) - выполнение кастомного байт-кода- Стековая виртуальная машина
- Выполнение байт-кода с поддержкой функций, циклов, условий
-
Virtual Machine (Python) (
src/vm/VirtualMachine.cpp) - выполнение Python байт-кода- Использует Python's Frame для выполнения байт-кода Python
- Поддержка всех операций Python 3.13.7
- Интеграция с Python runtime через pybind11
-
Garbage Collector (
src/vm/GarbageCollector.cpp) - сборщик мусора- Управление памятью для объектов виртуальной машины
- Отслеживание корневых объектов
-
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 # Этот файл
- CMake 3.25 или выше
- C++17 компилятор (GCC 7+, Clang 5+)
- Python 3.8+ с заголовочными файлами (python3-dev)
- pybind11 (автоматически загружается через CMake)
- Visual Studio 2022 или новее (с компонентами C++)
- Python 3.13 (официальный установщик, не из Microsoft Store)
- CMake 3.25+
- Ninja (опционально, для быстрой сборки)
# Клонируйте репозиторий
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"# Откройте 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После сборки модуль 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Выполняет Python код, используя стандартную Python VM (через compile()).
Параметры:
code(str): Исходный код Python
Пример:
mypython.run("print('Hello, World!')")Выполняет Python код через полный кастомный пайплайн:
- Lexer - токенизация
- Parser - парсинг в AST
- ASTAdapter - конвертация AST
- Compiler - генерация байт-кода
- Custom VM - выполнение
Параметры:
code(str): Исходный код Python
Пример:
mypython.run_custom("x = 10; print(x);")Примечание: В кастомном режиме требуется точка с запятой после операторов.
Токенизирует исходный код и выводит токены на экран (для отладки).
Параметры:
source(str): Исходный код для токенизации
Пример:
mypython.lex("x = 10; print(x);")
# Выведет:
# NAME("x")
# ASSIGN
# NUMBER(10)
# SEMICOLON
# ...Лексер разбивает исходный код на токены. Поддерживает:
- Числа (целые)
- Строки (одинарные и двойные кавычки)
- Идентификаторы и ключевые слова
- Операторы и разделители
- Индентацию Python (INDENT/DEDENT)
Парсер строит AST из токенов. Поддерживает:
- Выражения: числа, переменные, вызовы функций, операции
- Операторы: присваивание, print, if/else, while
- Блоки кода с индентацией
Адаптер конвертирует AST от Parser в формат, ожидаемый 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)
Две реализации VM:
-
Custom VM (
bc::vm) - выполняет кастомный байт-код- Стековая архитектура
- Поддержка функций и вызовов
- Управление локальными переменными
-
Python VM (
mypython::vm::VirtualMachine) - выполняет Python байт-код- Использует Python Frame
- Поддержка всех операций Python 3.13.7
- Интеграция с Python runtime
Сборщик мусора управляет памятью:
- Отслеживание объектов
- Сборка недостижимых объектов
- Интеграция с виртуальной машиной
JIT-компилятор оптимизирует горячие функции:
- Профилирование выполнения
- Компиляция часто вызываемых функций
- Генерация оптимизированного кода
-
Новые операторы:
- Добавьте токен в
Lexer.cpp - Добавьте правило парсинга в
Parser.cpp - Добавьте конвертацию в
ASTAdapter.cpp - Добавьте генерацию байт-кода в
bytecode.cpp - Добавьте выполнение в
bc::vm::exec()
- Добавьте токен в
-
Новые типы данных:
- Расширьте
runtime::Valueвruntime.hpp - Добавьте поддержку в компилятор и VM
- Расширьте
Включите режим отладки:
cmake -B build -DMYPYTHON_DEBUG=ONЭто выведет дополнительную информацию о выполнении.
- Кастомный пайплайн требует точки с запятой после операторов
- Не все функции Python поддерживаются в кастомном режиме
- Генераторы работают не полностью в Python VM режиме
- Некоторые сравнения в assert могут не работать
Метальников Никита, Круглова Анастасия, Мельникова Анастасия, Миронов Кирилл
- pybind11 - для Python bindings
- Python 3.13.7 - как эталон для совместимости