Автор24

Информация о работе

Подробнее о работе

Страница работы

Использование и реализация инструментов метапрограммирования в компилируемых языках

  • 30 страниц
  • 2020 год
  • 0 просмотров
  • 0 покупок
Автор работы

BESKONECHNO

Профессор, кэн

750 ₽

Работа будет доступна в твоём личном кабинете после покупки

Гарантия сервиса Автор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.

Купить эту работу

Использование и реализация инструментов метапрограммирования в компилируемых языках

750 ₽

или заказать новую

Лучшие эксперты сервиса ждут твоего задания

от 500 ₽

Гарантии Автор24

Изображения работ

Страница работы
Страница работы
Страница работы

Понравилась эта работа?

или

24 декабря 2020 заказчик разместил работу

Выбранный эксперт:

Автор работы
BESKONECHNO
4.1
Профессор, кэн
Купить эту работу vs Заказать новую
0 раз Куплено Выполняется индивидуально
Не менее 40%
Исполнитель, загружая работу в «Банк готовых работ» подтверждает, что уровень оригинальности работы составляет не менее 40%
Уникальность Выполняется индивидуально
Сразу в личном кабинете Доступность Срок 1—6 дней
750 ₽ Цена от 500 ₽

5 Похожих работ

Курсовая работа

Создание базы данных для автоматизации процесса управления кадрами на предприятии

Уникальность: от 40%
Доступность: сразу
1000 ₽
Курсовая работа

Оптимизация сайта при помощи методов ИИ для увеличения конверсионного действия

Уникальность: от 40%
Доступность: сразу
300 ₽
Курсовая работа

Сравнение операционных систем Linux, Windows и MacOS

Уникальность: от 40%
Доступность: сразу
400 ₽
Курсовая работа

Разработка программы обработки списка смартфонов

Уникальность: от 40%
Доступность: сразу
350 ₽
Курсовая работа

Решение задач многомерной оптимизации. Методы безусловной оптимизации. Поиск условного экстремума, используя квадратичный штраф. (MathCad, Python).

Уникальность: от 40%
Доступность: сразу
1000 ₽

Отзывы студентов

Отзыв Далиас об авторе BESKONECHNO 2018-05-11
Курсовая работа

Очень доброжелательный и компетентный автор. Всегда был на связи, все разъяснил, предоставил несколько вариантов программы. Рекомендую.

Общая оценка 5
Отзыв pocya об авторе BESKONECHNO 2016-04-07
Курсовая работа

Спасибо за работу!

Общая оценка 5
Отзыв Марина [email protected] об авторе BESKONECHNO 2015-08-25
Курсовая работа

все отлично, спасибо!

Общая оценка 5
Отзыв Татьяна_5085 об авторе BESKONECHNO 2016-09-15
Курсовая работа

Все ОК

Общая оценка 5

другие учебные работы по предмету

Готовая работа

Разработка IP-сервера для обеспечения IP-телефонии во внутренних сетях связи

Уникальность: от 40%
Доступность: сразу
2240 ₽
Готовая работа

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

Уникальность: от 40%
Доступность: сразу
3000 ₽
Готовая работа

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

Уникальность: от 40%
Доступность: сразу
2240 ₽
Готовая работа

Разработка информационной системы поддержки научно-исследовательской деятельности на основе метода Zettelkasten

Уникальность: от 40%
Доступность: сразу
1799 ₽
Готовая работа

Разработка информационной системы учета приёма и оплаты заказов посетителей с использованием СУБД SQL Server и языка программирования С#

Уникальность: от 40%
Доступность: сразу
2200 ₽
Готовая работа

WEB-приложение оформления заказов в кондитерской. Предметом исследования является учет заказов кондитерских изделий в кондитерской.

Уникальность: от 40%
Доступность: сразу
4000 ₽
Готовая работа

WEB-приложение для салона красоты. Предмет исследования – процесс учёта заказов в салон красоты.

Уникальность: от 40%
Доступность: сразу
4000 ₽
Готовая работа

Автоматизация учета и анализа клиентского оборудования для интернет провайдера

Уникальность: от 40%
Доступность: сразу
2800 ₽
Готовая работа

Сравнительный анализ клиентских реализаций импорта пакетов и модулей в экосистеме JavaScript

Уникальность: от 40%
Доступность: сразу
2240 ₽
Готовая работа

Разработка интернет магазина по продаже семян и удобрений на базе joomla 1.7.

Уникальность: от 40%
Доступность: сразу
2000 ₽
Готовая работа

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

Уникальность: от 40%
Доступность: сразу
500 ₽
Готовая работа

НАХОЖДЕНИЕ СПЕКТРАЛЬНОГО РАДИУСА МАТРИЦЫ МОДИФИЦИРОВАННЫМ СТЕПЕННЫМ МЕТОДОМ

Уникальность: от 40%
Доступность: сразу
3000 ₽