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

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
Admin Как написать вирус для Андроид. Часть 5 Вирусология 0
Admin Как написать вирус для Андроид. Часть 4 Вирусология 0
Admin Как написать вирус для Андроид. Часть 3 Вирусология 0
Admin Как написать вирус для андроид. Часть 2 Вирусология 1
Admin Как написать вирус для андроид Вирусология 0
Emilio_Gaviriya Статья Metadata Cleaner: Как эффективно защитить свою приватность при обмене файлами. Анонимность и приватность 0
Emilio_Gaviriya Как вычислить местоположение по IP-адресу? Статьи 0
Emilio_Gaviriya Статья Как работает JSON Web Token. Анонимность и приватность 0
Emilio_Gaviriya Статья Как происходит ICMP атака. Уязвимости и взлом 0
Emilio_Gaviriya Статья Как ловить хакеров на живца. Уязвимости и взлом 0
Emilio_Gaviriya Как работать с Search4Faces. Статьи 0
Emilio_Gaviriya Статья Как найти Wi-Fi точки. WiFi/Wardriving/Bluejacking 0
Emilio_Gaviriya Статья Как распространяются вирусы? Вирусология 0
Emilio_Gaviriya Статья Как найти человека? Полезные статьи 4
Emilio_Gaviriya Статья Как обнаружить 10 популярных техник пентестеров. Уязвимости и взлом 0
Emilio_Gaviriya Статья Как работает Анти-DDoS. Уязвимости и взлом 0
Emilio_Gaviriya Статья Как получают привязанный к Telegram мобильный номер. Анонимность и приватность 0
Emilio_Gaviriya Статья Как заразить компьютер с помощью обычного ярлыка. Полезные статьи 0
Emilio_Gaviriya Статья Защита конфиденциальности: Как сбросить данные на Android в экстренных ситуациях. Полезные статьи 0
Emilio_Gaviriya Статья Безопасность в сети: Как избежать угроз при использовании коротких ссылок. Уязвимости и взлом 0
Emilio_Gaviriya Статья Как вас деанонимизируют силовики. Анонимность и приватность 0
Emilio_Gaviriya Статья Как следит провайдер? Анонимность и приватность 1
Emilio_Gaviriya Статья Как вычисляют мобильник? Анонимность и приватность 0
Support81 Как хакеры взломали мир: 14 самых громких взломов 2023 года Новости в сети 1
DELTABEK Как зарабатывать 100.000 рублей в день на арбитраже криптовалют? Способы заработка 5
Support81 Как минимум 7 друзей ShadowSyndicate: компании всего мира под прицелом киберальянса Новости в сети 0
Support81 Как взломать сайт за 5 минут: уязвимость в плагине Ultimate Member дает полный доступ к WordPress Новости в сети 0
Traven Как создать свою криптовалюту без знаний и зарабатывать 40000$ в месяц (паста) Способы заработка 0
yaNaSvyazi [Wealth Whispers] [Udemy] Как использовать ChatGPT для YouTube (2023) Способы заработка 0
yaNaSvyazi [Виталий Бруновский] [Udemy] Как заработать с помощью ChatGPT? (2023) Способы заработка 0
yaNaSvyazi [Катерина Яшина] Как заработать на нейросетях первым (2023) Способы заработка 0
alexgoldboy Как вернуть убытки на Pocket Option? Ищу работу. Предлагаю свои услуги. 1
Gorsilov Подскажите что с етими базами делать? и Как? Вопросы и интересы 0
D Как поставить лайк? или убрать хайд? может ли не показываться кнопка лайка? Вопросы и интересы 7
yaNaSvyazi Как заработать на продаже курсов подготовки к ЕГЭ Способы заработка 0
S Как отменить отправленную транзакцию Bitcoin Свободное общение и флейм 0
A Как взломать аккаунт в инстограме Вопросы и интересы 1
I Как слать Zelle с Chase Полезные статьи 0
L Как отменить отправленную транзакцию BTC Корзина 0
D Как найти клон страницы ВК Вопросы и интересы 1
N Как подключится к видеокамерам сервера зная пароль отт маршрутизатора? Вопросы и интересы 5
M Закрыто Обучение Google ADS. Как лить на любые фейки без суспенда. + Продам логи без соседей + гугл разбаны ручной фарм Корзина 2
semsvm Интересно Как можно заработать на кошельке Payeer. Способы заработка 1
S Как сейчас купить доллары в РФ? Свободное общение и флейм 3
AHAHAC Интересно Как просто начать скрытый майнинг Способы заработка 1
Alldied Как заработать около $1000 на американской бирже. Способы заработка 1
Dolphin Anty Как выбрать антидетект браузер ❓ Продажа софта 0

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