Как написать простейший компилятор

R

Renelio

Original poster
Лучший способ понять работу компиляторов — написать свой собственный. В этом поможет этот краткий, но исчерпывающий гайд.

Введение
Стандартный компилятор осуществляет следующие шаги:

  • Парсинг: исходный текст конвертируется в абстрактное синтаксическое дерево (Abstract Syntax Tree, AST).
  • Разрешение зависимостей с другими модулями (С откладывает этот этап на шаг линковки).
  • Семантическая валидация: исключение синтаксически корректных, но бессмысленных выражений, например, повторного объявления переменных.
  • Эквивалентные преобразования и высокоуровневая оптимизация: AST преобразуется для осуществления более эффективных вычислений при той же семантике.
  • Генерация кода: AST трансформируется в линейный код низкого уровня с переходами, распределением регистров и тому подобным.
  • Локальная оптимизация: низкоуровневый код проверяется на простые локальные недостатки.
В большинстве современных компиляторов (вроде gcc и clang) последние два пункта повторяются еще раз. Для начальной генерации кода они используют не совсем низкоуровневый, но платформонезависимый язык. Потом этот промежуточный код переводится в зависящий от архитектуры (x86, ARM и так далее).

После этого объектный код готов к линковке. Большая часть нативных компиляторов автоматически вызывает линковщик, создающий исполняемый код, но это еще не компиляция. В языках вроде Java или C# линковка может быть полностью динамической и выполняться в виртуальной машине в момент загрузки.

Запомните основные моменты
Компилятор должен быть:

  • работающим
  • красивым
  • эффективным
Эта классическая последовательность применима ко всей сфере разработки ПО. Сконцентрируйтесь на первом пункте. Сделайте простейшую вещь и заставьте ее работать.

Читайте книги!

Прочтите книгу

Авторизируйтесь или Зарегистрируйтесь что бы просматривать ссылки.

. Эта бессмертная классика до сегодняшнего дня не потеряла актуальности.

Авторизируйтесь или Зарегистрируйтесь что бы просматривать ссылки.

— также стоящая вещь.

Если на данном этапе это кажется вам слишком сложным, почитайте для начала какие-нибудь введения в парсинг.

Убедитесь, что вам комфортно работать с графами, особенно с деревьями. Это основа построения программ на логическом уровне.

Хорошо определите свой язык
Вы можете использовать любую нотацию, но будьте уверены, что имеете полное и последовательное описание языка. Оно включает в себя как синтаксис, так и семантику.

Используйте свой любимый язык
Это совершенно нормально — писать компилятор на Pyhton, Ruby или любом другом языке, который вам нравится. Используйте простые алгоритмы, принцип которых вы хорошо понимаете. Первый ваш компилятор вовсе не обязан быть быстрым, или эффективным, или обладать кучей фич. Все, что от него требуется — работать достаточно правильно и легко поддаваться переработкам.

Также нормально писать разные стадии развития компилятора на разных языках, если это требуется.

Приготовьтесь к написанию множества тестов
Весь ваш язык должен быть стопроцентно покрыт тестами, эффективнее всего, если он будет определен ими. Будьте на ты с выбранным тестовым фреймворком. Пишите тесты с первого дня. Рационально отдавать предпочтение «позитивным» тестам, которые предполагают корректную работу кода.

Регулярно прогоняйте все тесты. Чините некорректные тесты. Будет очень обидно остаться у разбитого корыта с плохо определенным языком, который не способен принять валидный код.

Сделайте хороший парсер
Парсеров существует огромное количество, выбирайте любой. Можно написать свой собственный, но это сработает только в том случае, если синтаксис вашего языка примитивен до маразма.

Парсер должен выявлять синтаксически ошибки и сообщать о них. Пишите много тестов, как позитивных, так и негативных. Переиспользуйте написанный код для определения языка.

На выходе ваш парсер должен генерировать абстрактное синтаксическое дерево. Если ваш язык использует модули, то результатом работы парсера может быть простейшее представление генерируемого «объектного кода».

Напишите семантический валидатор
Вполне вероятно, что ваш язык допускает синтаксически правильные конструкции, не имеющие смысла в некоторых контекстах. Примером может служить повторное объявление одной и той же переменной или пропуск параметра неправильного типа. Валидатор призван выявлять ошибки такого рода.

Также зона его ответственности охватывает разрешение зависимостей с другими модулями, написанными на вашем языке, загрузкой этих модулей и использовании их в процессе валидации. Например, именно на этом этапе проверяется соответствие количества параметров, поступающих на вход функции из подключаемого модуля.

Еще раз, пишите и запускайте много тестов. Тривиальные случаи также обязательны к рассмотрению, как и сложные.

Генерируйте код
Воспользуйтесь простейшими техниками, которые вы знаете. Чаще всего допустимо непосредственно переводить языковую конструкцию (например, условный оператор) в слабо параметризированный шаблон кода.

Забудьте об эффективности и сосредоточьтесь только на правильности.

Настройте платформо-независимую низкоуровневую виртуальную машину
Вероятнее всего, вас не очень интересуют низкоуровневые аспекты, если только вы не страстный поклонник всего, что связано с архитектурой.

Варианты для вас:

  • LLVM: позволяет эффективно генерировать машинный код, чаще всего для х86 и ARM.
  • CLR: ориентирована на .NET.
  • JVM: нацелена на мир Java, мультиплатформенна.
Забудьте об оптимизации
Оптимизация — это сложно. И почти всегда она бывает преждевременной. Генерируйте неэффективный, но рабочий код. Реализуйте весь язык прежде чем приступите к оптимизации.

Конечно, некоторая простая оптимизация вполне уместна на начальном этапе. Но старайтесь избегать излишних хитростей, пока ваш компилятор не будет достаточно стабилен.
 
Название темы
Автор Заголовок Раздел Ответы Дата
G Как написать безопасный код на JS Другие ЯП 0
АнАлЬнАя ЧуПаКаБрА [Гайд] - Как написать человеку в Вк если вы у него в ЧС. Другое 0
S Как написать сообщение вк если ты в чс СИ/Фишинг/Мошенничество 41
АнАлЬнАя ЧуПаКаБрА Гайд как написать простенький проэкт в Private Keeper Полезные статьи 5
Admin Как написать вирус для Андроид. Часть 5 Вирусология 0
Admin Как написать вирус для Андроид. Часть 4 Вирусология 0
Admin Как написать вирус для Андроид. Часть 3 Вирусология 0
Admin Как написать вирус для андроид. Часть 2 Вирусология 1
Admin Как написать вирус для андроид Вирусология 0
Support81 Важно!!! Мобильный аудит Wi-Fi сетей: как быстро найти уязвимости с помощью Stryker WiFi/Wardriving/Bluejacking 0
wrangler65 Интересно Как МВД России ищет киберпреступников и как оставаться анонимным в 2025 Анонимность и приватность 0
Support81 JPEG, пицца и разоблачения: как Error Level Analysis считывает ложь по пикселям Новости в сети 0
Support81 Ваш VPN — это троян. Он выглядит как защита, но работает как слежка Новости в сети 0
Support81 От идеологии к наживе: как хактивисты превращаются в киберпреступников Полезные статьи 0
Support81 Дарквеб 2024: эксплойты по цене машины, логи — как хлеб в магазине Новости в сети 0
Support81 Важно!!! Как Tor стал символом свободы, паранойи и мифов одновременно Анонимность и приватность 0
Support81 Письмо от «шефа», фальшивая переписка и счёт на услуги — как российские компании теряют деньги, не заметив подмены Новости в сети 0
Support81 За деньги — да: как преступники «купили» службу поддержки Coinbase Новости в сети 0
Support81 Открыл PSD — получил троян. Как хакеры «кошмарят» графических дизайнеров Новости в сети 0
Support81 Услуги 18+, отмывание и прописка в США — как один Telegram-рынок объединил КНДР и китайскую мафию Новости в сети 0
Support81 Seed → POST-запрос → пустой баланс: как устроена быстрая и чистая кража крипты через FreeDrain Новости в сети 0
Support81 Одна атака — минус миллиард: как Marks & Spencer потерял состояние за пару дней Новости в сети 0
Support81 Из пепла: как 4chan смог перезапустить себя после разрушительного взлома Новости в сети 0
Support81 CouchDB как проходной двор: эксплойты для критической SSH-уязвимости уже гуляют по сети Новости в сети 0
Support81 Фишинг с печатью Google — как злоумышленники смогли обмануть DKIM Новости в сети 0
Support81 Исповедь хакера: как случайный эксперимент оставил без связи тысячи людей в Бразилии Новости в сети 0
Support81 Фейковые айтишники, настоящие миллиарды и немного ядерной программы: как прокачанные фишеры замиксовали $1,5 млрд Новости в сети 0
Support81 Microsoft дала ИИ настоящий инструмент программиста — и он впервые узнал, как сложно быть человеком Новости в сети 0
Support81 25 000 за воздух: как «таможенники» из Telegram разводят на доверии Новости в сети 0
Support81 $21 млн в крипте: как офицеры КСИР прикрылись «борьбой с мошенничеством» Новости в сети 0
Support81 Шифрование не спасет: как хакеры читают "защищенные" сообщения без взлома Новости в сети 0
Support81 Невидимая империя зла: как ИИ, дети и крипта строят цифровую империю Новости в сети 1
Support81 DNS без штанов: как нас сдают провайдерам по умолчанию Новости в сети 0
Support81 Комната 641А: как инженер AT&T раскрыл систему массовой слежки Новости в сети 0
Support81 "Чудо-решение" или маркетинг: как Google создает иллюзию объективности для продвижения технологий Новости в сети 0
Support81 Фрод в рекламе: как мошенники крадут бюджеты и что с этим делать Новости в сети 0
Support81 Невидимый взломщик: как обычные разговоры позволяют взломать GPT-4o Новости в сети 0
Support81 5 лет до точки невозврата: как квантовые компьютеры обрушат мировые банки Новости в сети 0
Support81 Вирус в заявке: как Zhong Stealer «ломает» компании через службу поддержки Новости в сети 0
Support81 Обмани себя сам: как ИИ-трейдеры ведут подписчиков к финансовому краху Новости в сети 0
Support81 Взлом, майнинг, выкуп: 5 хакеров придумали, как выжать из IT-гигантов все соки Новости в сети 0
Support81 CAPTCHA + PDF: как мошенники превратили Webflow в орудие фишинга Новости в сети 0
Support81 $16 млн и 1000 жертв: как хакеры Phobos попались в ловушку спецслужб Новости в сети 0
Support81 Мечта хакеров: как CVE-2024-52875 стала идеальным инструментом для кибератак Новости в сети 0
Support81 StarkRDP теперь LakeVPS: как злоумышленники возрождают подпольные рынки за считанные дни Новости в сети 0
Support81 Дешевле – не значит лучше: как уязвимости DeepSeek уничтожают защиту бизнеса Новости в сети 1
Support81 Важно!!! MMS возвращается: как устаревший протокол стал оружием криптомошенников Новости в сети 0
Support81 Chrome, Firefox и Edge: как Flesh Stealer стал ночным кошмаром для браузеров Новости в сети 0
Support81 Майнеры в облаке: как хакеры годами добывают криптовалюту за чужой счёт Новости в сети 0
У Статья Как скрыть цифровой след в интернете: практическое руководство. Полезные статьи 0

Название темы