Очень доброжелательный и компетентный автор. Всегда был на связи, все разъяснил, предоставил несколько вариантов программы. Рекомендую.
Подробнее о работе
Гарантия сервиса Автор24
Уникальность не ниже 50%
Оглавление
Оглавление 2
Введение 3
Метапрограммирование с современных языках 4
Цель работы 6
Постановка задачи 7
Компилятор Grit 9
Выбор инструментов 9
Архитектура компилятора 12
Токенизация 13
Построение AST 15
Кодогенерация 19
Язык Grit 22
Результаты 27
Заключение 29
Список литературы 31
Цель работы
В промышленной разработке прочно закрепились лишь некоторые отдельные инструменты метапрограммирования, простые и понятные даже начинающим разработчикам, либо зарекомендовавшие себя годами использования — например, шаблоны из C++. Многие другие инструменты и целые языки, основной частью которых является поддержка метапрограммирования, не получают широкого распространения как раз из-за необычности подхода, некоторой трудности в изучении и предполагаемого ухудшения читаемости.
С другой стороны, если рассматривать интерпретируемые языки которые, во-первых, не гнушаются потери в производительности, а во-вторых не компилируются и потому могут позволить себе полагаться на наличие обильной информации о самой программе во время ее исполнения, то в них метапрограммирование получило гораздо более широкое распространение.
...
Постановка задачи
Поскольку целью работы является исследование подходов для разработки компилятора с поддержкой возможностей метапрограммирования, при планировании функционала разумно руководствоваться только этой целью.
Естественно, невозможно и не нужно реализовывать компилятор для полноценного языка программирования для достижения обозначенной ранее цели. Нет так же и прямой необходимости реализовывать продвинутые парадигмы разработки – объектно-ориентированную или функциональную. Достаточно реализовать базовый набор инструментов процедурного программирования, чтобы иметь возможность писать «реалистичные» программы, и при этом не погрязнуть в разработке нового полнофункционального языка, и уже поверх этой основы создать функционал для метапрограммирования.
...
Выбор инструментов
Теперь, когда сформулированы цели и планируемый функционал компилятора, необходимо примерно представить архитектуру будущего решения и подобрать подходящие инструменты для разработки.
Поскольку нас интересует только процесс превращения исходного кода программы в инструкции, и не так важны детали реализации компилятора под конкретные машины (учитывая обозначенную ранее цель, при желании можно было бы писать компилятор даже под виртуальные машины, например JVM – низкоуровневые дет (Ахо, et al.)али не важны для этого проекта), желательно максимально абстрагироваться от этого механизма.
Конечно, при компиляции и реализации высокоуровневого функционала необходимо учитывать производительность и другие показатели генерируемых программ, однако выигрыш в этом плане от написания собственного компиляторного бэкенда6 значительно меньше, чем затраты на это – следовательно, разумно использовать какой-либо уже существующий инструмент.
...
1. Токенизация9 (разбиение на лексемы берет на себя Parsec)
2. Семантический анализ, предобработка AST
3. Кодогенерация IR
Таким образом, мы уже можем определить высокоуровневую структуру программы:
parseCode :: String -> Either ParserError [Expr]
processAST :: [Expr] -> [Expr]
buildIR :: [Expr] -> Module
-- Исходный код → parseCode → processAST → buildIR → код LLVM IR
Каждая из этих функции соответствует этапу обработки данных, которые были описаны выше. Разберем каждый этап отдельно, и посмотрим, какие особенности каждого из них можно использовать при реализации инструментов метапрограммирования.
Токенизация
Этот этап заключается, в основном, в создании описания синтаксиса в формате, понятном Parsec, и затем написании комбинаторов парсеров для всех синтаксических конструкций. Не будем вдаваться в детали реализации и остановимся только на внутреннем представлении синтаксиса.
Высокоуровневая структура языка очень простая – это массив выражений.
...
Построение AST
Полученный после токенизации набор выражений уже можно, в некотором смысле, считать синтаксическим деревом – мы знаем, что точка входа это main, и имеем определения всех символов в программе. C этого я и начал разработку первой версии – не храня и не проверяя типы, кроме как для объявлений, без метаинформации, полностью доверяя программисту, написавшему код – обходить массив и генерировать LLVM IR. Этого было достаточно, пока дело не дошло до сообщений об ошибках, проверки типов, и, в первую очередь, декораторов. Первые две вещи не слишком сложны в реализации и не представляют большого интереса в контексте этой работы, а о декораторах стоит сказать подробнее.
Как должен выглядеть декоратор в не слишком высокоуровневом, компилируемом, статически типизированном языке? Это в любом случае будет некоторая конструкция, внутри себя имеющая дополнительный код и способ обратится к декорируемой функции.
...
3. Кодогенерация IR
Таким образом, мы уже можем определить высокоуровневую структуру программы:
parseCode :: String -> Either ParserError [Expr]
processAST :: [Expr] -> [Expr]
buildIR :: [Expr] -> Module
-- Исходный код → parseCode → processAST → buildIR → код LLVM IR
Каждая из этих функции соответствует этапу обработки данных, которые были описаны выше. Разберем каждый этап отдельно, и посмотрим, какие особенности каждого из них можно использовать при реализации инструментов метапрограммирования.
Токенизация
Этот этап заключается, в основном, в создании описания синтаксиса в формате, понятном Parsec, и затем написании комбинаторов парсеров для всех синтаксических конструкций. Не будем вдаваться в детали реализации и остановимся только на внутреннем представлении синтаксиса.
Высокоуровневая структура языка очень простая – это массив выражений.
...
Язык Grit
В этом разделе проведем обзор получившегося языка.
Grit – статически сильно типизированный язык, фразированный (expression-oriented), с некоторыми возможностями для метапрограммирования. Встроенные типы: int (целочисленный) и float (дробное число. Точкой входа в программу является функция main.
Любое выражение, за исключением особо указанных исключений и объявлений функций, возвращает значение. Арифметические операции и операции сравнения возвращают свои результаты, операция присваивания возвращают присваиваемое значение (позволяя писать конструкции вида a = b = c = 1).
Конструкция if возвращает значение последнего выражения в выполняемой ветке.
...
Результаты
Разработанный в рамках этой работы компилятор реализует не слишком сложный язык, но обладающий несколькими описанными выше интересными особенностями – а главное, поддерживающий декораторы. Декораторы являются крайне нетипичным инструментом метапрограммирования для компилируемых языков – им недостаточно знать о машинном представлении функций – адресе начала инструкции или требуемых аргументах. Декораторы, во всех языках, и этот – не исключение, полагаются на модификацию самой программы. Однако, если у интерпретируемых языков есть возможность делать это во время выполнения самой программы, то компилируемые языки должны как-то решать эту проблему во время компиляции.
...
Заключение
Исходной целью работы было выяснение возможности реализации «динамических» инструментов метапрограммирования в компилируемых языках. Думаю, можно смело сказать, что по крайней мере на этот вопрос теперь можно ответить однозначно – написание такого компилятора возможно.
Другой стороной вопроса является изучение эффекта внедрения такого функционала на размер производимых исполняемых файлов и производительность программы. Как было показано, для реализации инструментов метапрограммирования часто необходимо модифицировать AST – этот процесс, обычно, не влияет на скорость выполнения самой программы, но может существенно замедлить компиляцию и увеличить размер итогового исполняемого файла.
...
Список литературы
Компиляторы: принципы, технологии и инструментарий — 2 изд. [Книга] / авт. Ахо Альфред В. [и др.]. - 2008 : Вильямс.
Введение В Метапрограммирование [В Интернете] / авт. Бартлетт Д. // Ibm.com. - 2005 г.. - https://www.ibm.com/developerworks/ru/library/l-metaprog1/index.html.
Lambda Lifting: Transforming Programs to Recursive Equations [Книга] / авт. Джонсон Томас. - [б.м.] : ACM Press, 1985.
Modular Domain Specific Languages and Tools [Книга] / авт. Худак Пол. - New Haven : IEEE Computer Society Press, Department of Computer Science, Yale University, 1998.
The Architecture of Open Source Applications [Книга] / авт. Браун Эми и Уилсон Грег. - Dallas, TX : lulu, 2012.
Не подошла эта работа?
Закажи новую работу, сделанную по твоим требованиям
Оглавление
Оглавление 2
Введение 3
Метапрограммирование с современных языках 4
Цель работы 6
Постановка задачи 7
Компилятор Grit 9
Выбор инструментов 9
Архитектура компилятора 12
Токенизация 13
Построение AST 15
Кодогенерация 19
Язык Grit 22
Результаты 27
Заключение 29
Список литературы 31
Цель работы
В промышленной разработке прочно закрепились лишь некоторые отдельные инструменты метапрограммирования, простые и понятные даже начинающим разработчикам, либо зарекомендовавшие себя годами использования — например, шаблоны из C++. Многие другие инструменты и целые языки, основной частью которых является поддержка метапрограммирования, не получают широкого распространения как раз из-за необычности подхода, некоторой трудности в изучении и предполагаемого ухудшения читаемости.
С другой стороны, если рассматривать интерпретируемые языки которые, во-первых, не гнушаются потери в производительности, а во-вторых не компилируются и потому могут позволить себе полагаться на наличие обильной информации о самой программе во время ее исполнения, то в них метапрограммирование получило гораздо более широкое распространение.
...
Постановка задачи
Поскольку целью работы является исследование подходов для разработки компилятора с поддержкой возможностей метапрограммирования, при планировании функционала разумно руководствоваться только этой целью.
Естественно, невозможно и не нужно реализовывать компилятор для полноценного языка программирования для достижения обозначенной ранее цели. Нет так же и прямой необходимости реализовывать продвинутые парадигмы разработки – объектно-ориентированную или функциональную. Достаточно реализовать базовый набор инструментов процедурного программирования, чтобы иметь возможность писать «реалистичные» программы, и при этом не погрязнуть в разработке нового полнофункционального языка, и уже поверх этой основы создать функционал для метапрограммирования.
...
Выбор инструментов
Теперь, когда сформулированы цели и планируемый функционал компилятора, необходимо примерно представить архитектуру будущего решения и подобрать подходящие инструменты для разработки.
Поскольку нас интересует только процесс превращения исходного кода программы в инструкции, и не так важны детали реализации компилятора под конкретные машины (учитывая обозначенную ранее цель, при желании можно было бы писать компилятор даже под виртуальные машины, например JVM – низкоуровневые дет (Ахо, et al.)али не важны для этого проекта), желательно максимально абстрагироваться от этого механизма.
Конечно, при компиляции и реализации высокоуровневого функционала необходимо учитывать производительность и другие показатели генерируемых программ, однако выигрыш в этом плане от написания собственного компиляторного бэкенда6 значительно меньше, чем затраты на это – следовательно, разумно использовать какой-либо уже существующий инструмент.
...
1. Токенизация9 (разбиение на лексемы берет на себя Parsec)
2. Семантический анализ, предобработка AST
3. Кодогенерация IR
Таким образом, мы уже можем определить высокоуровневую структуру программы:
parseCode :: String -> Either ParserError [Expr]
processAST :: [Expr] -> [Expr]
buildIR :: [Expr] -> Module
-- Исходный код → parseCode → processAST → buildIR → код LLVM IR
Каждая из этих функции соответствует этапу обработки данных, которые были описаны выше. Разберем каждый этап отдельно, и посмотрим, какие особенности каждого из них можно использовать при реализации инструментов метапрограммирования.
Токенизация
Этот этап заключается, в основном, в создании описания синтаксиса в формате, понятном Parsec, и затем написании комбинаторов парсеров для всех синтаксических конструкций. Не будем вдаваться в детали реализации и остановимся только на внутреннем представлении синтаксиса.
Высокоуровневая структура языка очень простая – это массив выражений.
...
Построение AST
Полученный после токенизации набор выражений уже можно, в некотором смысле, считать синтаксическим деревом – мы знаем, что точка входа это main, и имеем определения всех символов в программе. C этого я и начал разработку первой версии – не храня и не проверяя типы, кроме как для объявлений, без метаинформации, полностью доверяя программисту, написавшему код – обходить массив и генерировать LLVM IR. Этого было достаточно, пока дело не дошло до сообщений об ошибках, проверки типов, и, в первую очередь, декораторов. Первые две вещи не слишком сложны в реализации и не представляют большого интереса в контексте этой работы, а о декораторах стоит сказать подробнее.
Как должен выглядеть декоратор в не слишком высокоуровневом, компилируемом, статически типизированном языке? Это в любом случае будет некоторая конструкция, внутри себя имеющая дополнительный код и способ обратится к декорируемой функции.
...
3. Кодогенерация IR
Таким образом, мы уже можем определить высокоуровневую структуру программы:
parseCode :: String -> Either ParserError [Expr]
processAST :: [Expr] -> [Expr]
buildIR :: [Expr] -> Module
-- Исходный код → parseCode → processAST → buildIR → код LLVM IR
Каждая из этих функции соответствует этапу обработки данных, которые были описаны выше. Разберем каждый этап отдельно, и посмотрим, какие особенности каждого из них можно использовать при реализации инструментов метапрограммирования.
Токенизация
Этот этап заключается, в основном, в создании описания синтаксиса в формате, понятном Parsec, и затем написании комбинаторов парсеров для всех синтаксических конструкций. Не будем вдаваться в детали реализации и остановимся только на внутреннем представлении синтаксиса.
Высокоуровневая структура языка очень простая – это массив выражений.
...
Язык Grit
В этом разделе проведем обзор получившегося языка.
Grit – статически сильно типизированный язык, фразированный (expression-oriented), с некоторыми возможностями для метапрограммирования. Встроенные типы: int (целочисленный) и float (дробное число. Точкой входа в программу является функция main.
Любое выражение, за исключением особо указанных исключений и объявлений функций, возвращает значение. Арифметические операции и операции сравнения возвращают свои результаты, операция присваивания возвращают присваиваемое значение (позволяя писать конструкции вида a = b = c = 1).
Конструкция if возвращает значение последнего выражения в выполняемой ветке.
...
Результаты
Разработанный в рамках этой работы компилятор реализует не слишком сложный язык, но обладающий несколькими описанными выше интересными особенностями – а главное, поддерживающий декораторы. Декораторы являются крайне нетипичным инструментом метапрограммирования для компилируемых языков – им недостаточно знать о машинном представлении функций – адресе начала инструкции или требуемых аргументах. Декораторы, во всех языках, и этот – не исключение, полагаются на модификацию самой программы. Однако, если у интерпретируемых языков есть возможность делать это во время выполнения самой программы, то компилируемые языки должны как-то решать эту проблему во время компиляции.
...
Заключение
Исходной целью работы было выяснение возможности реализации «динамических» инструментов метапрограммирования в компилируемых языках. Думаю, можно смело сказать, что по крайней мере на этот вопрос теперь можно ответить однозначно – написание такого компилятора возможно.
Другой стороной вопроса является изучение эффекта внедрения такого функционала на размер производимых исполняемых файлов и производительность программы. Как было показано, для реализации инструментов метапрограммирования часто необходимо модифицировать AST – этот процесс, обычно, не влияет на скорость выполнения самой программы, но может существенно замедлить компиляцию и увеличить размер итогового исполняемого файла.
...
Список литературы
Компиляторы: принципы, технологии и инструментарий — 2 изд. [Книга] / авт. Ахо Альфред В. [и др.]. - 2008 : Вильямс.
Введение В Метапрограммирование [В Интернете] / авт. Бартлетт Д. // Ibm.com. - 2005 г.. - https://www.ibm.com/developerworks/ru/library/l-metaprog1/index.html.
Lambda Lifting: Transforming Programs to Recursive Equations [Книга] / авт. Джонсон Томас. - [б.м.] : ACM Press, 1985.
Modular Domain Specific Languages and Tools [Книга] / авт. Худак Пол. - New Haven : IEEE Computer Society Press, Department of Computer Science, Yale University, 1998.
The Architecture of Open Source Applications [Книга] / авт. Браун Эми и Уилсон Грег. - Dallas, TX : lulu, 2012.
Купить эту работу vs Заказать новую | ||
---|---|---|
0 раз | Куплено | Выполняется индивидуально |
Не менее 40%
Исполнитель, загружая работу в «Банк готовых работ» подтверждает, что
уровень оригинальности
работы составляет не менее 40%
|
Уникальность | Выполняется индивидуально |
Сразу в личном кабинете | Доступность | Срок 1—6 дней |
750 ₽ | Цена | от 500 ₽ |
Не подошла эта работа?
В нашей базе 149294 Курсовой работы — поможем найти подходящую