1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/null_264_1745-chibicc

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Chibicc: небольшой компилятор C

(Старый мастер переехал в ветку historical/old. Это новая ветка, загруженная в сентябре 2020 года.)

Chibicc — это ещё один небольшой компилятор языка C, который реализует большинство функций C11. Хотя он, вероятно, всё ещё относится к категории «игрушечных» компиляторов, как и другие небольшие компиляторы, chibicc может компилировать несколько реальных программ, включая Git, SQLite, libpng и сам chibicc, без внесения изменений в скомпилированные программы. Сгенерированные исполняемые файлы этих программ проходят соответствующие тестовые наборы. Таким образом, chibibb действительно поддерживает широкий спектр функций C11 и способен правильно компилировать сотни тысяч строк реального кода на C.

Chibicc разрабатывается как эталонная реализация для книги, которую я сейчас пишу о компиляторе C и низкоуровневом программировании. Книга охватывает обширную тему с инкрементным подходом; в первой главе читатели будут реализовывать «компилятор», который принимает только одно число в качестве «языка», которое затем будет получать одну функцию за раз в каждом разделе книги, пока язык, принимаемый компилятором, не будет соответствовать спецификации C11. Я взял этот инкрементальный подход из статьи Абдулазиза Гулума.

Каждый коммит этого проекта соответствует разделу книги. Для этой цели не только конечное состояние проекта, но и каждый коммит был тщательно написан с учётом читаемости. Читатели должны иметь возможность узнать, как можно реализовать функцию языка C, просто прочитав один или несколько коммитов этого проекта. Например, вот так реализованы while, [], ?: и thread-local variable. Если у вас есть много свободного времени, возможно, вам будет интересно прочитать его с первого коммита.

Если вам нравится этот проект, пожалуйста, подумайте о покупке экземпляра книги, когда она станет доступна! 😀 Я публикую исходный код здесь, чтобы дать людям ранний доступ к нему, потому что я планировал сделать это в любом случае с разрешительной лицензией с открытым исходным кодом после публикации книги. Если я не буду взимать плату за исходный код, мне не имеет смысла держать его в секрете. Надеюсь опубликовать книгу в 2021 году. Вы можете зарегистрироваться здесь, чтобы получить уведомление, когда бесплатная глава будет доступна онлайн или книга будет опубликована. Я произношу chibicc как чиби си си. «Чиби» означает «мини» или «маленький» на японском языке. «CC» обозначает компилятор C.

Статус

Chibicc поддерживает почти все обязательные функции и большинство дополнительных функций C11, а также несколько языковых расширений GCC.

Функции, которые часто отсутствуют в небольшом компиляторе, но поддерживаются chibicc, включают (но не ограничиваются):

  • Препроцессор
  • float, double и long double (80-битные числа с плавающей запятой x87)
  • Битовые поля
  • alloca()
  • Массивы переменной длины
  • Составные литералы
  • Переменные потока
  • Атомарные переменные
  • Общие символы
  • Назначенные инициализаторы
  • L, u, U и u8 строковые литералы
  • Функции, которые принимают или возвращают структуры в соответствии со спецификацией x86-64 SystemV ABI

Chibicc не поддерживает комплексные числа, прототипы функций в стиле K&R и встроенную сборку в стиле GCC. Диграфы и триграфы намеренно опущены.

Chibicc выводит простое, но приятное сообщение об ошибке, когда обнаруживает ошибку в исходном коде.

Оптимизационного прохода нет. Chibicc выдаёт ужасный код, который, вероятно, в два или более раза медленнее, чем вывод GCC. У меня есть план добавить оптимизационный проход, как только фронтенд будет готов.

Я использую Ubuntu 20.04 для x86-64 в качестве среды разработки. Политика управления (или её отсутствие) выглядит очень странно, но имеет смысл для краткосрочных программ, таких как компиляторы.

DMD, компилятор для языка программирования D, использует ту же схему управления памятью по той же причине, например [1].

Об авторе

Я — Руи Уэяма. Я создатель 8сс — компилятора C в качестве хобби, а также первоначальный разработчик текущей версии компоновщика LLVM lld, который представляет собой компоновщик промышленного качества, используемый различными операционными системами и крупномасштабными сборочными системами.

Ссылки

  • tcc: небольшой компилятор C, написанный Фабрисом Белларом. Я многому научился на этом компиляторе, но дизайн tcc и chibicc отличается. В частности, tcc — это однопроходный компилятор, а chibicc — многопроходный.
  • lcc: ещё один небольшой компилятор C. Создатели написали книгу о внутреннем устройстве lcc, которая оказалась хорошим ресурсом, чтобы увидеть, как реализован компилятор.
  • «Инкрементальный подход к построению компиляторов».
  • «5 правил программирования Роба Пайка».

[1] https://www.drdobbs.com/cpp/increasing-compiler-speed-by-over-75/240158941

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

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

A Small C Compiler Развернуть Свернуть
C и 3 других языков
MIT
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/null_264_1745-chibicc.git
git@api.gitlife.ru:oschina-mirror/null_264_1745-chibicc.git
oschina-mirror
null_264_1745-chibicc
null_264_1745-chibicc
main