Книжная полка Сохранить
Размер шрифта:
А
А
А
|  Шрифт:
Arial
Times
|  Интервал:
Стандартный
Средний
Большой
|  Цвет сайта:
Ц
Ц
Ц
Ц
Ц

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

Покупка
Артикул: 817221.01.99
Книга рассказывает о том, как разрабатывать уникальные языки программирования, чтобы сократить время и стоимость создания приложений для новых или специализированных областей применения вычислительной техники. Вы начнете с реализации интерфейса компилятора для вашего языка, включая лексический и синтаксический анализатор, а к концу чтения сможете разрабатывать и воплощать в коде свои собственные языки, позволяющие компилировать и запускать программы. Издание адресовано разработчикам программного обеспечения, заинтересованным в создании собственного языка. Для изучения материала потребуется опыт программирования на языке высокого уровня, таком как Java или C++.
Клинтон, Л. Дж. Создай свой собственный язык программирования. Руководство программиста по разработке компиляторов, интерпретаторов и доменно-ориентированных языков для решения современных вычислительных задач : практическое руководство / Л. Дж. Клинтон ; пер. с англ. С. В. Минца. - Москва : ДМК Пресс, 2023. - 408 с. - ISBN 978-5-93700-140-5. - Текст : электронный. - URL: https://znanium.com/catalog/product/2109499 (дата обращения: 22.11.2024). – Режим доступа: по подписке.
Фрагмент текстового слоя документа размещен для индексирующих роботов
Клинтон Л. Джеффери

Создай 
 свой собственный  
язык программирования

Build Your Own 
Programming Language

A programmer’s guide to designing 
compilers, interpreters, and DSLs for solving 
modern computing problems

Clinton L. Jeffery

BIRMINGHAM—MUMBAI

Создай свой 
собственный язык 
программирования

Руководство программиста по разработке 
компиляторов, интерпретаторов и доменноориентированных языков для решения 
современных вычислительных задач

Клинтон Л. Джеффери

Москва, 2023

УДК 004.42
ББК  32.372
Д40

Клинтон Л. Джеффери
Д40 Создай свой собственный язык программирования. Руководство про
граммиста по разработке компиляторов, интерпретаторов и доменноориентированных языков для решения современных вычислительных 
задач / пер. с англ. С. В. Минца. – М.: ДМК Пресс, 2023. – 408 с.: ил.

ISBN 978-5-93700-140-5

Книга рассказывает о том, как разрабатывать уникальные языки программирования, чтобы сократить время и стоимость создания приложений для 
новых или специализированных областей применения вычислительной техники. Вы начнете с реализации интерфейса компилятора для вашего языка, 
включая лексический и синтаксический анализатор, а к концу чтения сможете 
разрабатывать и воплощать в коде свои собственные языки, позволяющие 
компилировать и запускать программы.
Издание адресовано разработчикам программного обеспечения, заинтересованным в создании собственного языка. Для изучения материала потребуется опыт программирования на языке высокого уровня, таком как Java или C++.

УДК 004.42
ББК 32.372

First published in the English language under the title ‘Build Your Own Programming Language’ – (9781800204805)

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

бы то ни было форме и какими бы то ни было средствами без письменного разрешения 
владельцев авторских прав.

Copyright ©Packt Publishing 2021
© Оформление, издание, перевод, ДМК Пресс, 2022
ISBN  (анг.) 978-1-80020-480-5
ISBN  (рус.) 978-5-93700-140-5

Памяти переводчика

Семена Викторовича Минца, 

просто очень хорошего человека

Эта книга – его последний перевод.
С Семеном было очень приятно работать – он был немногословен и деловит.
Отлично знал информатику и программирование и перевел для нас «Введение в логическое программирование», «Объяснимые модели искусственного интеллекта на Python», «Искусство неизменяемой архитектуры» и эту 
последнюю.
Он ушел слишком несправедливо рано, мог бы еще многое сделать.
Будет не хватать его. Людей, особенно талантливых, заменить невозможно.

Заместитель главного редактора
Сенченкова Елена

Оглавление

Об авторах ......................................................................................... 16

О рецензентах ................................................................................... 16

Предисловие ...................................................................................... 17
Для кого эта книга ............................................................................................17
Что скрывает обложка ......................................................................................17
Как получить от этой книги максимальную пользу .......................................20
Загрузка примеров ...........................................................................................20
Видео .................................................................................................................20
Цветные иллюстрации .....................................................................................20
Используемые сокращения ..............................................................................20
Список опечаток ...............................................................................................21
Нарушение авторских прав .............................................................................21

ЧАСТЬ I. ИНТЕРФЕЙСЫ ЯЗЫКА  
ПРОГРАММИРОВАНИЯ ................................................................ 23

Глава 1. Зачем создавать еще один  
язык программирования? ............................................................... 25
Итак, вы хотите создать свой собственный язык программирования... ......25
Типы реализации языков программирования ...........................................26
Организация реализации языка байт-кода ................................................27
Языки, используемые в примерах ...............................................................28
Язык и библиотека – в чем разница? ..............................................................30
Применимость к другим задачам разработки программного  
обеспечения ......................................................................................................30
Определение требований к вашему языку .....................................................31
Тематическое исследование – требования, которые вдохновили  
на создание языка Unicon ................................................................................33
Требование Unicon № 1 – сохранять то, что люди любят в Icon ................34
Требование Unicon № 2 – поддержка крупномасштабных программ,  
работающих с большими данными .............................................................34
Требование Unicon № 3 – высокоуровневый ввод/вывод  
для современных приложений ....................................................................35
Требование Unicon № 4 – обеспечить универсально реализуемые  
системные интерфейсы ...............................................................................35
Заключение .......................................................................................................36
Вопросы .............................................................................................................36

Глава 2. Дизайн языка программирования .................................. 37

Определение видов слов и пунктуации в вашем языке ................................38
Определение потока управления ....................................................................40
Решение о том, какие типы данных поддерживать .......................................41
Атомарные типы ...........................................................................................41
Составные типы ............................................................................................42
Типы, специфичные для конкретной области ...........................................44
Общая структура программы ..........................................................................44
Завершение определения языка Jzero ............................................................45
Тематическое исследование – проектирование графических  
объектов в Unicon .............................................................................................46
Поддержка языка для графики 2D ...............................................................47
Добавление поддержки трехмерной графики ............................................49
Заключение .......................................................................................................50
Вопросы .............................................................................................................50

Глава 3. Сканирование исходного кода ........................................ 52

Технические требования ..................................................................................52
Лексемы, лексические категории и токены ....................................................53
Регулярные выражения ....................................................................................54
Правила регулярных выражений ................................................................54
Примеры регулярных выражений ...............................................................56
Использование UFlex и JFlex ............................................................................57
Раздел заголовка ...........................................................................................58
Раздел регулярных выражений ...................................................................58
Написание простого сканера исходного кода ............................................59
Запуск сканера ..............................................................................................62
Токены и лексические атрибуты .................................................................63
Расширение нашего примера для построения токенов ............................64
Написание сканера для Jzero ...........................................................................66
Спецификация Jzero flex ..............................................................................66
Код Unicon Jzero ............................................................................................69
Код Java Jzero .................................................................................................72
Запуск сканера Jzero .....................................................................................75
Регулярных выражений не всегда достаточно ...............................................76
Заключение .......................................................................................................80
Вопросы .............................................................................................................80

Глава 4. Парсинг................................................................................. 81

Технические требования ..................................................................................81
Анализ синтаксиса ...........................................................................................82
Понимание бесконтекстных грамматик .........................................................83
Написание правил бесконтекстной грамматики .......................................84
Написание правил для программных конструкций  .................................85
Использование iyacc и BYACC/J........................................................................87
Объявление символов в разделе заголовка ................................................88

Оглавление  7

Составление раздела бесконтекстной грамматики yacc ............................89
Понимание парсеров yacc  ...........................................................................90
Устранение конфликтов в парсерах yacc .................................................. 92
Исправление синтаксических ошибок ........................................................93
Создание игрушечного примера .................................................................93
Написание парсера для Jzero ...........................................................................98
Спецификация Jzero lex ...............................................................................98
Спецификация yacc в Jzero ..........................................................................98
Код Unicon Jzero ..........................................................................................103
Код парсера Jzero на языке Java .................................................................105
Запуск парсера Jzero ...................................................................................105
Улучшение сообщений об ошибках синтаксиса ...........................................107
Добавление деталей в сообщения Unicon об ошибках синтаксиса  ........108
Добавление деталей в сообщения Java об ошибках синтаксиса .............108
Использование Merr для создания лучших сообщений  
об ошибках синтаксиса ..............................................................................109
Заключение .....................................................................................................110
Вопросы ...........................................................................................................110

Глава 5. Деревья синтаксиса .........................................................111
Технические требования ................................................................................111
Использование GNU make ..............................................................................112
Изучение деревьев .........................................................................................115
Определение типа дерева синтаксиса ......................................................115
Деревья разбора в сравнении с деревьями синтаксиса ...........................117
Создание листьев из терминальных символов ............................................119
Обертывание токенов в листья ..................................................................120
Работа со стеком значений YACC ..............................................................120
Обертка листьев для стека значений парсера ..........................................122
Определение нужных вам листьев  ...........................................................123
Построение внутренних узлов из правил производства .............................124
Доступ к узлам дерева в стеке значений ..................................................124
Использование фабричного метода узла дерева .....................................126
Формирование деревьев синтаксиса для языка Jzero ..................................127
Отладка и тестирование вашего дерева синтаксиса ....................................134
Предотвращение распространенных ошибок в дереве синтаксиса .......134
Распечатка вашего дерева в текстовом формате .....................................136
Печать дерева с помощью dot ....................................................................138
Заключение .....................................................................................................143
Вопросы ...........................................................................................................143

ЧАСТЬ II. ОБХОДЫ ДЕРЕВА СИНТАКСИСА .........................145

Глава 6. Таблицы символов ...........................................................147
Технические требования ................................................................................148
Создание основы для таблиц символов ........................................................148
Объявления и области видимости.............................................................148

8  
Оглавление

Присваивание и разыменование переменных ........................................149
Выбор подходящего обхода дерева для работы .......................................150
Создание и заполнение таблиц символов для каждой  
области видимости .........................................................................................151
Добавление семантических атрибутов к деревьям синтаксиса ..............152
Определение классов для таблиц символов и записей  
в таблицах символов ..................................................................................154
Создание таблиц символов ........................................................................155
Заполнение таблиц символов ....................................................................157
Синтез атрибута isConst .............................................................................159
Проверка наличия необъявленных переменных .........................................160
Идентификация тел методов .....................................................................160
Выявление использования переменных в теле метода ...........................161
Поиск повторно объявленных переменных .................................................162
Вставка символов в таблицу символов .....................................................163
Сообщение о семантических ошибках .....................................................163
Обработка пакетов и областей видимости классов в Unicon ......................164
Искажение имен .........................................................................................165
Вставка self для ссылок на переменные-члены .......................................166
Вставка self в качестве первого параметра в вызовы методов ...............166
Тестирование и отладка таблиц символов ....................................................167
Заключение .....................................................................................................169
Вопросы ...........................................................................................................170

Глава 7. Проверка базовых типов .................................................171
Технические требования ................................................................................171
Представление типов в компиляторе ...........................................................171
Определение базового класса для представления типов ........................172
Подклассификация базового класса для сложных типов ........................173
Присвоение информации о типе объявленным переменным ....................175
Синтез типов из зарезервированных слов ...............................................177
Наследование типов в списке переменных ..............................................178
Определение типа в каждом узле дерева синтаксиса ..................................179
Определение типа в листьях ......................................................................180
Вычисление и проверка типов во внутренних узлах ...............................182
Проверка типов во время выполнения и вывод типов в Unicon .................186
Заключение .....................................................................................................188
Вопросы ...........................................................................................................188

Глава 8. Проверка типов в массивах, вызовах методов  
и доступах к структурам ................................................................189
Технические требования ................................................................................189
Операции проверки типов массивов ............................................................189
Управление объявлениями переменных в массивах ...............................190
Проверка типов при создании массива ....................................................191
Проверка типов при обращении к массиву ..............................................193
Проверка вызовов методов ............................................................................194

Оглавление  9

Вычисление параметров и информации  
о возвращаемом типе .................................................................................194
Проверка типов в каждом месте вызова метода ......................................197
Проверка типов в операторах возврата ....................................................200
Проверка обращений к структурированным типам ....................................202
Обработка объявлений переменных экземпляра ....................................202
Проверка типов при создании экземпляра ..............................................203
Проверка типов при обращении к экземпляру ........................................205
Заключение .....................................................................................................208
Вопросы ...........................................................................................................209

Глава 9. Генерация промежуточного кода ..................................210
Технические требования ................................................................................210
Подготовка к генерации кода ........................................................................210
Зачем генерировать промежуточный код? ..............................................211
Изучение областей памяти в созданной программе ...............................211
Представление типов данных для промежуточного кода .......................212
Добавление атрибутов промежуточного кода в дерево...........................214
Генерация меток и временных переменных ............................................215
Набор инструкций промежуточного кода ....................................................218
Инструкции .................................................................................................218
Декларации .................................................................................................219
Аннотирование деревьев синтаксиса метками  
для потока управления ..................................................................................219
Генерация кода для выражений ....................................................................222
Генерация кода для потока управления........................................................225
Генерация целевых меток для выражений условий ................................225
Генерация кода для циклов ........................................................................228
Генерация промежуточного кода для вызовов методов ..........................229
Проверка сгенерированного промежуточного кода ................................231
Заключение .....................................................................................................232

Глава 10. Раскраска синтаксиса в IDE ..........................................233
Загрузка примеров IDE, используемых в этой главе ....................................234
Интеграция компилятора в редактор программиста ..................................236
Анализ исходного кода из среды IDE ........................................................236
Отправка выходных данных компилятора в IDE .....................................237
Предотвращение повторного разбора всего файла  
при каждом изменении .................................................................................238
Использование лексической информации  
для раскрашивания токенов ..........................................................................242
Расширение компонента EditableTextList  
для поддержки цвета ..................................................................................242
Раскрашивание отдельных токенов по мере их создания.......................242
Подсветка ошибок с использованием результатов разбора ........................243
Добавление поддержки Java ..........................................................................245
Заключение .....................................................................................................247

10  
Оглавление