Файл: Содержание Введение Глава Генерация кода. Методы генерации кода.docx

ВУЗ: Не указан

Категория: Реферат

Дисциплина: Не указана

Добавлен: 07.11.2023

Просмотров: 61

Скачиваний: 3

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.



Содержание

Введение………………………………………………………………3

Глава 1. Генерация кода. Методы генерации кода……………..5

    1. Общие принципы генерации кода…………………….……...5

1.2.Способы внутреннего представления программ……..………..9

Глава 2. Оптимизация кода……………………………………....12

1.1.Основные методы оптимизации…………………..……………12

1.2. Общие принципы оптимизации кода…………………………17

Заключение …………………………………………………………22

Список используемой литературы ……………………………..23

Введение

С непрерывным углублением информационного века, развитием цифровизации и проникновением передовых технологий во все сферы жизни, значительно расширился спектр видов и типов программного обеспечения, кроме того, к нему выдвигаются все более высокие требования [1]. В данном контексте вопрос о том, можно ли повысить эффективность создания программ при соблюдении жестких требований к их качеству, чтобы быстро реагировать на требования рынка, является актуальным и практически значимым.

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

Актуальность этой технологии заключается в нескольких факторах:

  1. Ускорение процесса разработки: автоматизация процесса генерации кода позволяет ускорить процесс разработки ПО, уменьшить время на написание и отладку кода. Более того, это позволяет сократить количество ошибок и повысить качество продукта.

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

  3. Упрощение сопровождения: генерируемый код обладает высокой степенью консистентности и является более легким для сопровождения и документирования.

  4. Использование новых технологий: кодогенерация позволяет быстро применять новые технологии и платформы без необходимости изучения новых языков программирования или инструментов.

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


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

Целью курсовой работы является изучение принципов генерации кода, а так же оптимизация кода

Объект исследования –изучение различных методов и технологий кодогенерации

Предмет исследования -изучение различных подходов к генерации кода

Задачи исследования:

1.Изучение общих принципов генерации кода

2.Рассмотрение методов генерации кода

3.Анализ основных методов оптимизации кода

Данная курсовая работа состоит из введение двух глав и заключения

Глава 1. Генерация кода. Методы генерации кода

1.1.Общие принципы генерации кода.

Генерация объектного кода — это перевод компилятором внутреннего представ­ления исходной программы в цепочку символов выходного языка. Генерация объектного кода порождает результирующую объектную программу на языке ас­семблера или непосредственно на машинном языке (в машинных кодах). Внут­реннее представление программы может иметь любую структуру в зависимости от реализации компилятора, в то время как результирующая программа всегда представляет собой линейную последовательность команд. Поэтому генерация объектного кода (объектной программы) в любом случае должна выполнять дей­ствия, связанные с преобразованием сложных синтаксических структур в линей­ные цепочки.

Генерацию кода можно считать функцией, определенной на синтаксическом реве и на информации, содержащейся в таблице идентификаторов. Поэтому генерация объектного кода выполняется после того, как выполнен синтаксический анализ программы и все необходимые действия по подготовке к генерации кода распределено адресное пространство под функции и переменные, проверяет соответствие имен и типов переменных, констант и функций в синтаксических конструкциях исходной программы и т.д. Характер отображения входной программы в последовательность команд, выполняемого генерацией, зависит от входного языка, архитектуры вычислительной системы, на которую ориентиров; результирующая программа

, а также от качества желаемого объектного кода.

В идеале компилятор должен выполнить синтаксический разбор всей вход! программы, затем провести ее семантический анализ, после чего приступит подготовке генерации и непосредственно генерации кода. Однако такая схема боты компилятора практически почти никогда не применяется. Дело в том, в общем случае ни один семантический анализатор и ни один компилятор способны проанализировать и оценить смысл всей входной программы в цел Формальные методы анализа семантики применимы только к очень незначительной части возможных входных программ. Поэтому у компилятора нет практической возможности порождать эквивалентную выходную программу на основе всей входной программы.

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

Смысл (семантику) каждой такой синтаксической конструкции входного языка: можно определить, исходя из ее типа, а тип определяется синтаксическим анализатором на основании грамматики входного языка. Примерами типов скитнических конструкций могут служить операторы цикла, условные операторы, операторы выбора и т. д. Одни и те же типы синтаксических конструкций характерны для различных языков программирования, при этом они различаю синтаксисом (который задается грамматикой языка), но имеют схожий см (который определяется семантикой). В зависимости от типа синтаксических конструкции выполняется генерация кода результирующей программы, соответствующего данной синтаксической конструкции. Для семантически схожих конструкций различных входных языков программирования может порождаться повой результирующий код.

Чтобы компилятор мог построить код результирующей программы для синтаксической конструкции входного языка, часто используется метод, называем синтаксически управляемым переводом — СУ-переводом. СУ-перевод — это новый метод порождения кода результирующей программы на основании результатов синтаксического разбора. Для удобства понимания сути метода можно считать, что результат синтаксического разбора представлен в виде дерева син­таксического разбора (либо же дерева операций), хотя в реальных компиляторах это не всегда так.


Суть принципа СУ-перевода заключается в следующем: с каждой вершиной де­рева синтаксического разбора N связывается цепочка некоторого промежуточного кода C(N). Код для вершины N строится путем сцепления (конкатенации) в фик­сированном порядке последовательности кода C(N) и последовательностей кодов, связанных со всеми вершинами, являющимися прямыми потомками N. В свою очередь, для построения последовательностей кода прямых потомков вершины N потребуется найти последовательности кода для их потомков — потомков вто­рого уровня вершины N — и т. д. Процесс перевода идет, таким образом, снизу-вверх в строго установленном порядке, определяемом структурой дерева.

Для того чтобы построить СУ-перевод по заданному дереву синтаксического разбора, необходимо найти последовательность кода для корня дерева. Поэтому для каждой вершины дерева порождаемую цепочку кода надо выбирать таким образом, чтобы код, приписываемый корню дерева, оказался искомым кодом для всего оператора, представленного этим деревом. В общем случае необходимо иметь единообразную интерпретацию кода C(N), которая бы встречалась во всех ситуациях, где присутствует вершина N. В принципе эта задача может оказаться нетривиальной, так как требует оценки смысла (семантики) каждой вершины дерева. При применении СУ-перевода задача интерпретации кода для каждой вершины дерева решается только разработчиком компилятора.

Возможна модель компилятора, в которой синтаксический анализ входной про­граммы и генерация кода результирующей программы объединены в одну фазу. Такую модель можно представить в виде компилятора, у которого операции ге­нерации кода совмещены с операциями выполнения синтаксического разбора. Для описания компиляторов такого типа часто используется термин «СУ-компиляция» (синтаксически управляемая компиляция).

Схему СУ-компиляции можно реализовать не для всякого входного языка про­граммирования. Если принцип СУ-перевода применим ко всем входным КС-языкам, то применить СУ-компиляцию оказывается не всегда возможным. Од­нако известно, что схемы перевода на основе СУ-компиляции можно построить для многих из широко распространенных классов КС-языков, в частности для LR- и LL-языков [6, 15].

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


  • помещение в выходной поток данных машинных кодов или команд ассембле­ра, представляющих собой результат работы (выход) компилятора;

  • выдача пользователю сообщений об обнаруженных ошибках и предупрежде­ниях (которые должны помещаться в выходной поток, отличный от потока, используемого для команд результирующей программы);

□ порождение и выполнение команд, указывающих, что некоторые действия должны быть произведены самим компилятором (например, операции, выполняемые над данными, размещенными в таблице идентификаторов).

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

1.2.Способы внутреннего представления программ

Возможны различные формы внутреннего представления синтаксических конструкций исходной программы в компиляторе. На этапе синтаксического анализа (часто используется форма, именуемая деревом вывода .Но формы представления, используемые на этапах синтаксического анализа, оказываются неудобными в работе при генерации и оптимизации объектного кода. Поэтому перед оптимизацией и непосредственно перед генерацией объектного кода внутреннее представление программы преобразовываться в одну из соответствующих форм записи.

Все внутренние представления программы обычно содержат в себе две принципиально различные вещи — операторы и операнды. Различия между формами внутреннего представления заключаются лишь в том, как операторы и операнды соединяются между собой. Также операторы и операнды должны отличаться друг от друга, если они встречаются в любом порядке. За различение операндов и операторов, как уже было сказано выше, отвечает разработчик компилятор, который руководствуется семантикой входного языка.

Известны следующие формы внутреннего представления программ:

  • связочные списочные структуры, представляющие синтаксические дерев

  • многоадресный код с явно именуемым результатом (тетрады);

  • многоадресный код с неявно именуемым результатом (триады);

  • обратная (постфиксная) польская запись операций;

  • ассемблерный код или машинные команды.

В каждом конкретном компиляторе может использоваться одна из этих форм выбранная разработчиками. Но чаще всего компилятор не ограничивается пользованием только одной формы для внутреннего представления программы. На различных фазах компиляции могут использоваться различные формы, кото­рые по мере выполнения проходов компилятора преобразуются одна в другую. Не все из перечисленных форм широко используются в современных компиля­торах, и об этом будет сказано по мере их рассмотрения.