Подтвердить что ты не робот

Как работают компиляторы C/С++?

После более чем десятилетия программирования на C/С++ я заметил следующий шаблон: очень хорошие программисты имеют тенденцию иметь подробное знание внутренних компонентов компилятора.

Я достаточно хороший программист, и у меня есть специальная коллекция компиляторов "суеверий", поэтому я хотел бы перезагрузить свои знания и начать с основ.

Может ли кто-нибудь рекомендовать ссылки на онлайн-ресурсы или любимые книги? Я особенно заинтересован в компиляции C/С++, оптимизации, GCC и LLVM.

4b9b3361

Ответ 1

Начните с книги драконов.... (больше внимания уделяйте оптимизации кода и генерации кода)

Идите на пишущий компилятор игрушек для образовательного языка программирования, например Decaf или Cool.., вы можете использовать генераторы парсеров (lex и yacc) для вашего интерфейса (чтобы облегчить жизнь и сосредоточиться на большем количестве предметов)....

Затем прочитайте внутреннюю книгу gcc вместе с просмотром исходного кода gcc.

Ответ 2

Текст компилятора хорош, но они немного тяжелы для обучения. У Джека Креншоу есть "Книга", которая представляет собой серию статей, которые вы можете скачать и прочитать "Lets Build the Compiler". Это следует из методологии "Learn By Doing", которая великолепна, если вы не получили ничего из формальных занятий по этому предмету, или это было слишком много лет спустя после этого (это мое дело). Он держит вашу руку и ведет вас через написание компилятора вместо того, чтобы ударить вас с помощью Lambda Calculus и глубокие теоретические проблемы, которые волнуют только академики. Это был хороший способ разжечь те клетки мозга, у которых была только нечеткая память о том, что вы написали что-то на Vax (YEAH, это право VAX!), Много лет назад в школе. Это написано очень разговорчиво и просто, чтобы просто сесть и прочитать, в отличие от большинства учебников, для которых требуется несколько горшков кофе, чтобы пройти мимо первой главы. Как только у вас есть основа для понимания, более традиционные тексты, такие как книга Дракона, являются отличными ссылками для расширения вашего понимания. (И лично мне нравятся версии Dead Tree, я печатал Джека, его гораздо легче читать в удобном положении, чем на ноутбуке. И читатели Ebook слишком дороги для чего-то, что на самом деле не похоже, что вы читаете настоящая книга.)

То, что некоторые могут назвать "недостатком", заключается в том, что оно написано на Паскале, но я подумал, что это заставило меня думать об этом больше, чем если бы кто-то дал мне рабочую программу на C, чтобы начать с нее. Appart, из которого он был написан с учетом 68000, который используется только в встроенных системах в данный момент времени. Снова для меня это не проблема, я знал, что 68000 ашм и 68000 аш легче читать, чем какой-либо другой asm.

Ответ 5

Как отметил Пит Эдди, учебник Джека Креншоу отлично подходит для новичков. Но если вы хотите увидеть как настоящий, компилятор C compiler работает — тот, который был разработан блестящими инженерами вместо того, чтобы создавать, бросая код на стену, пока что-то не застрял, не получите копию Фрейзер и Хансон A Retargetable C Compiler: Design and Implementation, который содержит исходный код для очень чистого lcc компилятор. Объяснения конструкции и реализации смешаны с кодом. Это не первая книга для новичка, но она будет отплачивать тщательное изучение, и вы можете получить использованную копию для $35.

Для более длинного рекламного сообщения о lcc см. Компилировать C Faster в Linux.

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

P.S. Извините, вы были сорваны в Uni.

Ответ 8

В зависимости от того, что вы точно хотите знать, вы должны посмотреть на шаблон фильтров pipe & filter, потому что, насколько я знаю, это (или что-то подобное) используется во многих компиляторах за последние годы.

Когда мои знания компилятора не слишком устарели, он работает следующим образом:

Разбирать исходный код в символическое представление

Очистить символическое представление, выполнить некоторую нормализацию

Оптимизация символического дерева на основе определенных правил

выписать исполняемый код на основе символического дерева

Разумеется, зависимости также должны быть разрешены.

И, конечно, просмотр исходного кода gcc или javac может помочь в более подробном понимании.

Ответ 9

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

Я бы серьезно подумал о том, чтобы посмотреть на источник на язык сценариев, который внутренне скомпилирован в байт-код для виртуальной машины. Несколько языков соответствуют этому описанию, но я бы начал с Lua. Язык маленький, а ВМ - новый. Исходный код также мал, и биты, на которые я смотрел, были очень ясными, хотя и слегка комментировались.

Ответ 10

посмотрите Калейдоскоп. Вы можете написать свой собственный компилятор всего за несколько дней с помощью LLVM.