Об этом проекте

PB-Compiler (`pbc`) — это чистая реализация компиляторов семейства PowerBASIC, написанная на современном C#. Его основная цель — позволить компилировать исходный код на винтажном BASIC эпохи DOS в реальные, исполняемые 16-битные MS-DOS `.EXE` бинарники на современном 64-битном оборудовании. Проект делает упор на строгое соответствие историческим диалектам, гарантируя, что программы ведут себя идентично тем, что были созданы оригинальными проприетарными компиляторами, включая документированные ошибки. Ключевые возможности включают: **Поддержка диалектов**: Компилятор поддерживает широкий спектр диалектов через флаг `--dialect`, охватывая линию Borland (Turbo Basic, PowerBASIC 2.0-3.5) и линию Microsoft (BASICA, GW-BASIC, QuickBASIC 1.0-4.5, QBasic, BASIC PDS). Каждый диалект ограничивает новые функции и включает поведение, специфичное для версии. **Контракт точности**: Для исторических диалектов вывод проверяется против оригинальных бинарников с помощью оракульного дифференциального стенда. Это гарантирует, что сгенерированный код производит побайтово идентичный вывод программы, сохраняя совместимость с устаревшими программными экосистемами. **Конвейер оптимизации**: Продвинутый бэкенд оптимизации на основе SSA доступен для всех диалектов через флаг `--optimize`. Этот конвейер включает свёртку констант, удаление мёртвого кода, устранение общих подвыражений, снижение силы операций и многое другое. Он может значительно уменьшить размер бинарника (например, сжав программу Hello World до 25 байт) без изменения наблюдаемого поведения. **Надмножество PowerBASIC 3.6**: Перспективный диалект (`pb36`) добавляет современные языковые функции, такие как функции с телом-выражением, кортежи, перегрузка, параметры по умолчанию, лямбды/замыкания, обобщения, корутины (`YIELD`) и структурированная обработка исключений (`TRY/CATCH`). Они опциональны и не влияют на существующий код PB 3.5. **Форматы вывода**: Генерирует стандартные DOS MZ `.EXE` файлы, скомпилированные модули (`.PBU`) и библиотеки модулей (`.PBL`). Также поддерживает вывод переносимого C99 или LLVM IR для дальнейшей обработки. **Установка и использование**: Собран с использованием .NET, работает на любой ОС, поддерживающей .NET 6+. Пользователи клонируют репозиторий, собирают с помощью `dotnet` и компилируют исходники BASIC с помощью CLI-инструмента `pbc`. Результаты можно тестировать в DOSBox или на реальном оборудовании DOS.