Skip to content

Latest commit

 

History

History
69 lines (35 loc) · 16.2 KB

general.md

File metadata and controls

69 lines (35 loc) · 16.2 KB

Базовые учебники

Книги, в которых освещаются основные вопросы построения компиляторов на серьезном, теоретическом уровне.

Что я жду от современного учебника по компиляторам? Традиционно, упор в подобных работах делался на синтаксический анализ, как на наиболее формализованную и интересную чистым теоретикам область. Но для практика синтаксический анализ как раз наименее интересен и важен, по сравнению с остальными стадиями транслятора. В современной книге задачам синтаксического анализа лучше отвести от силы 10-15% общего объема текста, не более.

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

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

Теме анализа потоков данных и потоков управления отведены многочисленные монографии. Статический анализ востребован и за пределами классической задачи компиляции. Сюда можно отнести и абстрактную интерпретацию, символические вычисления и прочее.

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

Все еще мало освещены в литературе вопросы быстрого построения компиляторов, способы выразительного описания отдельных стадий трансляции.

A. Appel. Modern Compiler Implementation in ML

Комментарий от @true-grue. Серьезный академический учебник. При не таком уж большом объеме (всего 385 страниц) содержит массу полезных сведений и современных техник. Как и положено современному учебнику, упор сделан не на синтаксический анализ (ему отведено менее 60 страниц), а на более поздние стадии. Изложение иллюстрируется кодом на строгом и лаконичном языке ML. От раздела к разделу автор вместе с читателями движется в сторону построения компилятора для учебного языка Tiger, который имеет императивные и функциональные черты. Вот некоторые темы из учебника: проверка типов и упрощение выражений, выбор и планирование инструкций, распределение регистров, анализ потоков данных, сборка мусора, оптимизации циклов, форма SSA. Начальный раздел учебника содержит краткое введение в ML, но от читателя потребуется знакомство с функциональным программированием. Учебник можно рекомендовать всем, кто хочет получить основательный фундамент по теме и, при этом, сразу приобщиться к изящному стилю написания компилятора (стиль этот, увы, до сих пор не используется в большинстве популярных компиляторов). Избегайте Java- и C- версий книги. Они написаны в соавторстве и в них исходный посыл книги (ML-версия является оригиналом) сильно искажен.

комментарий от @vkazanov. К сожалению, оригинальный учебник на ML читать не довелось, но могу прокомментировать версию на Си. Книга не так плоха, как говорит @true-grue, и описывает все ключевые аспекты современного компилятора. То есть текст в книге аккуратный и интересный. Беда же издания в том, что автор (и, видимо, соавторы) явно на актуальном на тот момент промышленном Си никогда не писал. Большая часть кода отформатирована так, чтобы быть похожей на условный язык программирования семейства ML. Никаких специфичных для компиляторов на Си приемов не используется. Например, в самом начале книги автора просто говорит, что не хочет заниматься высвобождением памяти. И не занимается! Даже человеку, привычному к Си, такие листинги читать будет сложно. Выходит, что суть и соль книги - код комплятора - решительно невозможно где-то применять.

комментарий от @vkazanov. Прочитал, наконец, вариант книги на ML. Присоединяюсь к положительному комментарию @true-grue: это одна из лучших практических книг по бэкэндам компиляторов! Здесь рассматриваются все необходимые практические аспекты разработки бэкэндов компиляторов, причем не забыта и портативность - машино-зависимые аспекты вынесены в абстрактные модули. Язык автора лаконичный, точный и понятный, как и в других его книгах и публикациях. Кроме того, из книги видно, почему разработчики компиляторов так любят семейство языков ML. В сравнении с вариантом на простом Си (или с известными мне компиляторами на С++) кода совсем немного, и его можно легчо читать даже без глубоких знаний ML.

K. Cooper. L Torczon. Engineering a Compiler. Second Edition

комментарий от @vkazanov Со вторым изданием не знаком, но первое издание - неплохое общее введение в основные аспекты компиляторов. У авторов очень приятный стиль изложения материала, они скорее стараются передать идею, нежели дать строгий формализм, не в пример классической "Книге дракона". В отличие от последней большая часть материала посвящена всему тому, что компилятор делает уже после этапов синтаксического/семантического разбора. Главный недостаток книги - недетский объем, т.е. ее сложно читать последовательно. Это не какой-то единый фреймворк по построению компиляторор, а набор вводных глав плюс библиография для углубленного изучения тем.

Комментарий от @true-grue. Изложение ведется в довольно занудном тоне, книгу нельзя назвать компактной. Но этот учебник на сегодняшний день -- лучший по общим вопросам компиляции. Это не должно удивлять, ведь авторы данного учебника являются признанными специалистами в своей области. С этой книги можно начинать знакомиться с современными методами анализа и трансформации уровня промежуточных представлений. Здесь вы найдете актуальную информацию по SSA, в том числе и по распределению регистров с использованием SSA.

T. Mogensen. Introduction to Compiler Design (2017)

D. Grune et al. Modern compiler design (2012)

комментарий от @vkazanov Книга немного похожа на "Engineering a Compiler", про которую я писал выше как объемом, так и подходом. Автор в этой и другой своей книге ("Parsing Techniques - A Practical Guide", которая есть в списке ниже) стремится дать общий обзор тем, с упором на то, что интересующиеся читатели сами ознакомятся с деталями по ссылкам в библиографии. В отличие от книги Купера здесь значительно меньше уделяется внимания оптимизирующим преоборазованиям, но больше аспектам, связанным с реализацией конкретных семейств языков программирования (функциональных, объектных, параллельных, логических).

C. Fisher et al. Crafting A Compiler (2009)

W. Waite. G. Goos. Compiler Construction (1995)

Compilers: Principles, Techniques, and Tools. 2nd Edition

Книги по специальным вопросам компиляции

Учебники и справочники для тех, кто уже знаком с основами теории компиляции.

Steven Muchnick. Advanced Compiler Design and Implementation (1997)

Комментарий от @true-grue. Данный учебник хорошо иллюстрирует высказанную выше мысль: современный учебник по компиляторам -- это вовсе не про грамматики и синтаксический анализ. Данные темы у Мучника отсутствуют полностью. И при этом учебник считается до сих пор одним из лучших по компиляторам! Книгу отличает энциклопедический охват материала по всем важнейшим стадиям компиляции. В некоторой степени текст уже устарел, но богатый авторский опыт и хорошая организация материала сами по себе очень ценны. В целом, это, скорее, не учебник, а справочник, который, тем не менее, читать очень увлекательно.

R. Wilhelm and H. Seidl. Compiler Design: Syntactic and Semantic Analysis

R. Wilhelm and H. Seidl. Compiler Design: Analysis and Transformation

R. Wilhelm and H. Seidl. Compiler Design: Virtual Machines

R. Wilhelm, D. Maurer. Compiler Design (1995)

Dick Grune and Ceriel J.H. Jacobs. Parsing Techniques - Second Edition (2008)

Комментарий от @alexanius Хотя классические книги по компиляторам начитаются с построения лексических и синтаксических анализаторов, отдельных пособий по их созданию довольно мало. Книга Дика Грюна и Кериела Якобса как раз и является таким редким экземпляром. В книге рассказывается про принципы построения распознавателей грамматик, достаточных для создания компилятора. Краткие теоретические сведения, описания алгоритмов и большое количество примеров делают книгу приятной и интересной для прочтения. Разумеется, написать свой распознаватель можно и без сведений из книги, но она поможет глубже понять принципы построения синтаксических анализаторов. Отдельно стоит заметить что книги Грюна обладают некоторой широтой рассматриваемых тем, что отличает их от аналогов, и проявляется в рассматриваемой книге.

Y.N. Srikant and Priti Shankar. The Compiler Design Handbook: Optimizations and Machine Code Generation (2002)

Y.N. Srikant and Priti Shankar. The Compiler Design Handbook: Optimizations and Machine Code Generation, Second Edition (2007)

Bob Morgan. Building an Optimizing Compiler (1998)

Комментарий от @vkazanov. Неожиданная книга. Это не учебник и не обзорная работа, а скорее описание оптимизирующего компилятора и логики основных архитектурных решений. Для такого рода описательной книги материал изложен очень даже читаемо; другое дело, что реального кода компилятора никто не прилагает, а все алгоритмы изложены в псевдокоде. Лично мне книга показалась интересной, но не думаю, что могу ее в общем случае рекомендовать.