Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

Другие советы

Текст компилятора хорош, но слишком сложен для самостоятельного изучения.У Джека Креншоу есть «книга», которая была серией статей, которые вы можете скачать и прочитать звонок «Позвольте создавать компилятор». Это следует за методологией «Учиться», которая великолепна, если вы ничего не получили от официальных занятий по этому вопросу, или прошло слишком много лет с тех пор, как взял его (это мой случай).Он держит вас за руку и ведет через написание компилятора, вместо того, чтобы забивать вас лямбда-исчислением и глубокими теоретическими вопросами, которые волнуют только академические круги.Это был хороший способ разбудить те клетки мозга, которые имели лишь смутные воспоминания о написании чего-то на Vax (ДА, именно VAX!) много-много лун назад в школе.Он написан очень разговорно, и его легко просто сесть и прочитать, в отличие от большинства учебников, в которых требуется несколько чашек кофе, чтобы прочитать первую главу.Если у вас есть основа для понимания, то более традиционные тексты, такие как Книга Дракона, станут отличным источником для расширения вашего понимания.(И лично мне нравится версия «Мертвого дерева», я распечатал версию Джека, ее гораздо легче читать в удобном положении, чем на ноутбуке.А устройства для чтения электронных книг слишком дороги для чего-то, что еще не дает ощущения, что вы читаете настоящую книгу.)

Что некоторые могут назвать «недостатком», так это то, что он написан на Паскале, но я подумал, что это заставило меня задуматься об этом больше, чем если бы кто-то дал мне для начала работающую программу на C.Кроме того, он был написан с учетом 68000, который на данный момент используется только во встроенных системах.Опять же, для меня это не было проблемой, я знал, что 68000 asm и 68000 asm легче читать, чем некоторые другие asm.

Если вам нужна версия мертвого дерева, попробуйте Искусство проектирования компиляторов:Теория и практика.

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

Для более длинного аннотации о lcc, видеть Компилируйте C быстрее в Linux.

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

P.S.Сожалею, что тебя обокрали в универе.

см. исходный код otcc Фабриса Беллара

http://bellard.org/otcc/

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

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

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

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

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

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

Конечно зависимости и т.д.тоже надо решить.

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top