Большинство людей при слове «компилятор» бросает в дрожь. Это касается даже тех, кто недавно начал изучать программирование. А при этом не все еще знают, что есть «теория компиляторов», а еще все компиляторы содержат собственные принципы, технологии и инструменты. И когда молодой программист начинает обо всем этом узнавать, то компилятор ассоциируется у него с суперсложной сверхсекретной компьютерной разработкой.
А при этом при всем компилятор — это всего лишь очередная, но важная компьютерная программа. И, в принципе, уверенный в себе программист способен написать собственный компилятор.
В этой статье мы простыми словами разберем, что такое теория компиляторов и какие принципы, технологии и инструменты используют эти самые компиляторы, а также посоветуем пару достойных книг по компиляторам.
Компиляторы: принципы, технологии, инструменты
Для начала давайте обговорим несколько классических терминов, которые необходимо знать, приступая к изучению компиляторов:
Транслятор — это программа-переводчик, которая переводит текст с одного языка на другой, если нужно перевести ваш текст программы на «машинный язык», чтобы его понял ваш компьютер, то это и будет компилятором, то есть компилятор — это определенный вид транслятора.
Автокод — это код, который очень похож на машинный код, но таковым не является.
Ассемблер — это скрипт, который может перевести исходную программу, выраженную автокодом, в исполняемый код.
Интерпретатор — это скрипт, который просто выполняет код, который в него поступил.
Компиляторы можно разработать на автокоде или на высокоуровневых языках. Также есть специализированные языки для разработки компиляторов — «компиляторы компиляторов» (КК).
Компиляторы: принципы и технологии
Еще раз уточним, что компилятор ничем не отличается от обычного транслятора (программы переводчика). То есть фактически то, что мы делаем, когда переводим текст с русского на английский, чтобы объяснить иностранцу, как найти Большой Театр, — это же действие проводит компилятор с нашей написанной программой, просто в роли «иностранца» будет компьютер, который воспринимает только собственный машинный код.
Когда вы пишете программу, выполняющую определенные действия, на любом из языков программирования, вы используете термины, которые непонятны компьютеру. На самом деле компьютер очень глуп, он понимает только самые простые элементы: число, переменную, регистр, ячейку, оперативную память, жесткий диск, байт и др. Так вот, основная задача компилятора — это перевести то, что вы написали, на язык, понятный компьютеру.
Любые компиляторы используют следующие принципы и технологии в своей работе:
Проводят лексический анализ кода;
Проводят синтаксический анализ кода;
Генерируется промежуточный код;
Код оптимизируется;
Распределяется память между переменными компилируемого скрипта;
Генерируется объектный код и компонуются программные сегменты.
Таким образом построены все компиляторы для разных языков. Когда-то была идея построить универсальный компилятор. Но попытки не увенчались успехом, и все это осталось в теории.
Теория компиляторов
Теория компиляторов возникла еще в 70-х годах прошлого столетия. Тогда программисты прониклись идеей создать единый язык программирования для всего на свете и единый компилятор.
Но мир меняется, и требования к языкам программирования тоже меняются. Программы решают очень разносторонние задачи, и представить, что все можно написать одним языком программирования, очень сложно. Ведь сфера деятельности у программирования разная: одно дело писать скрипт для управления полетом баллистической ракеты, а другое — скрипт для начисления зарплаты 10-ти сотрудникам. Задачи разные, подходы разные, языки программирования разные, соответственно, и компиляторы будут разные.
А в последнее время вообще стало модным, чтобы у каждой крупной компании был собственный язык программирования и, соответственно, собственный компилятор. А помимо крупных фирм типа: Google, Microsoft, Oracle, есть еще масса более мелких разработчиков, которые тоже создают собственные языки и собственные компиляторы. Поэтому универсальный язык и универсальный компилятор пока остаются только в теории.
Но теория создания новых компиляторов гласит, что, несмотря на компилируемый язык программирования, компиляторы используют одинаковые принципы, технологии и инструментарий в своей работе. Поэтому разработка собственного компилятора — это не что-то необычное, уже существуют наработанные структуры и способы создания компиляторов, также в сети множество блогов, статей и книг по разработке компиляторов.
Книги для разработки компилятора
Несколько книг, которые помогут вам разобраться в том, что такое компилятор и как его создать самостоятельно:
«Компиляторы. Принципы, технологии и инструментарий». Ахо Альфред В., Лам Моника С. Данная книга есть в 2-х изданиях, последнее издание ориентировано на современные реалии. Но полезным будут оба издания, чтобы вы могли посмотреть, как менялась теория создания компиляторов.
«Engineering a compiler». Книга наполнена материалом, затрагивающим последние тенденции в разработке компиляторов.
«Modern Compiler Implementation». Andrew W. Appel. В этой книге четко проработаны все этапы создания компилятора. Есть информация, чем отличается создание компиляторов для разных языков программирования. Также есть целая серия книг с похожим названием, но для разных языков программирования: Java, C, ML и др.
«Introduction to Compiler Design». В этой книге подробно описано, как создавать компиляторы для простых ЯП. Очень подробно описана сама концепция создания компилятора.
«Compiler Construction». Это «живая» книга, которая постоянно обновляется. У нее нет конкретных авторов, ее пишет вики-сообщество. Много практических моментов. Основной посыл книги — это то, что создать собственный компилятор может даже новичок.
Другое