Путешествие по написанию компилятора
В этом репозитории Github я документирую свой путь к написанию самокомпилируемого компилятора для подмножества языка C. Я также расписываю детали, чтобы, если вы захотите следить за мной, было объяснение того, что я сделал и почему, а также некоторые ссылки на теорию компиляторов.
Но не слишком много теории, я хочу, чтобы это было практическое путешествие.
Вот шаги, которые я предпринял на данный момент:
- Часть 0: Введение в путешествие
- Часть 1: Введение в лексическое сканирование
- Часть 2: Введение в синтаксический анализ
- Часть 3. Приоритет операторов
- Часть 4: Настоящий компилятор
- Часть 5: Заявления
- Часть 6: Переменные
- Часть 7: Операторы сравнения
- Часть 8: Операторы if
- Часть 9: Циклы while
- Часть 10: Циклы for
- Часть 11: Функции, часть 1
- Часть 12: Типы, часть 1
- Часть 13: Функции, часть 2
- Часть 14. Генерация ассемблерного кода ARM
- Часть 15: Указатели, часть 1
- Часть 16. Правильное объявление глобальных переменных
- Часть 17. Улучшенная проверка типов и смещения указателей
- Часть 18: Еще раз о L-значениях и R-значениях
- Часть 19: Массивы, часть 1
- Часть 20: Символьные и строковые литералы
- Часть 21: Больше операторов
- Часть 22. Идеи дизайна для локальных переменных и вызовов функций
- Часть 23: Локальные переменные
- Часть 24: Параметры функции
- Часть 25: Вызовы функций и аргументы
- Часть 26: Прототипы функций
- Часть 27. Регрессионное тестирование и приятный сюрприз
- Часть 28. Добавление дополнительных флагов времени выполнения
- Часть 29: Немного рефакторинга
- Часть 30. Проектирование структур, объединений и перечислений
- Часть 31: Реализация структур, Часть 1
- Часть 32. Доступ к членам структуры
- Часть 33: Реализация союзов и доступ участников
- Часть 34: Перечисления и определения типов
- Часть 35: Препроцессор C
- Часть 36:
break
и continue
- Часть 37: Операторы Switch
- Часть 38: Висящие еще и не только
- Часть 39: Инициализация переменных, часть 1
- Часть 40: Инициализация глобальной переменной
- Часть 41: Инициализация локальной переменной
- Часть 42. Приведение типов и NULL
- Часть 43. Исправления ошибок и дополнительные операторы
- Часть 44: Постоянное складывание
- Часть 45: Объявления глобальных переменных, еще раз
- Часть 46: Параметры функции Void и изменения сканирования
- Часть 47: Подмножество
sizeof
- Часть 48. Подмножество
static
- Часть 49: Тернарный оператор
- Часть 50: Зачистка, часть 1
- Часть 51: Массивы, часть 2
- Часть 52: Указатели, часть 2
- Часть 53: Зачистка, часть 2
- Часть 54: Регистры разгрузки
- Часть 55: Ленивая оценка
- Часть 56: Локальные массивы
- Часть 57: Зачистка, часть 3
- Часть 58: Исправление приращения/уменьшения указателя
- Часть 59: Почему это не работает, часть 1
- Часть 60: Прохождение тройного теста
- Часть 61: Что дальше?
- Часть 62: Очистка кода
- Часть 63: Новый бэкэнд с использованием QBE
- Часть 64. Серверная часть для процессора 6809.
Для будущих частей нет расписания или графика, так что просто заходите сюда, чтобы узнать, написал ли я еще.
Авторские права
Я позаимствовал часть кода и множество идей из компилятора SubC, написанного Нильсом М. Холмом. Его код находится в открытом доступе. Я думаю, что мой код существенно отличается, и я могу применить к нему другую лицензию.
Если не указано иное,
- весь исходный код и сценарии принадлежат (c) Уоррену Туми под лицензией GPL3.
- все документы, не являющиеся исходным кодом (например, документы на английском языке, файлы изображений), принадлежат (c) Уоррену Туми по лицензии Creative Commons BY-NC-SA 4.0.