Скачиваний:
145
Добавлен:
14.06.2020
Размер:
3.2 Mб
Скачать
  1. Технологии разработки программных средств.

Основные принципы построения П.О.:

  1. Компилирующие программы;

  2. Интерпретируемые (MATLAB);

  3. Программы в работающие в режиме динамической компиляции.

Компиляция ­— перевод текста с языка программирования на внутренний язык компьютера.

*Трансляция  преобразование программы, представленной на одном из языков программирования, в программу на другом языке и, в определённом смысле, равносильную первой.

Виды компиляции:

  1. Пакетная. Компиляция нескольких исходных модулей в одном пункте задания.

  2. Построчная. То же, что и интерпретация.

  3. Условная. Компиляция, при которой транслируемый текст зависит от условий, заданных в исходной программе компилятора. Так, в зависимости от значения некоторой константы, можно включать или выключать трансляцию части текста программы.

Структура компилятора.

Процесс компиляции состоит из следующих этапов:

  1. Лексический анализ. На этом этапе последовательность символов исходного файла преобразуется в последовательность лексем (лексема-слово как абстрактная единица естественного языка).

  2. Синтаксический (грамматический) анализ. Последовательность лексем преобразуется в дерево.

  3. Семантический анализ. Дерево разбора обрабатывается с целью установления его семантики (смысла) — например, привязка идентификаторов к их декларациям, типам, проверка совместимости, определение типов выражений и т. д. Результат обычно называется «промежуточным представлением/кодом», и может быть дополненным деревом разбора, новым деревом, абстрактным набором команд или чем-то ещё, удобным для дальнейшей обработки.

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

  5. Генерация кода. Из промежуточного представления порождается код на целевом языке.

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

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

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

Интерпретируемые языки

В отличие от компилируемых языков, интерпретируемым для исполнения программы не нужен машинный код; вместо этого программу построчно исполнят интерпретаторы. Раньше процесс интерпретации занимал очень много времени, но с приходом таких технологий, как JIT-компиляция, разрыв между компилируемыми и интерпретируемыми языками сокращается. Примерами интерпретируемых языков являются PGP и Python. Вот некоторые из концептов, которые стали проще благодаря интерпретируемым языкам:

Независимость от платформы;

Меньший размер исполняемых файлов:

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

Редко используются, из-за неудобности

Компиляция в MSIL

MSIL (Microsoft Intermediate Language) – промежуточный язык Microsoft

В “сборку” входят инструменты, команды (MSIL), Метаданные, манифест.

Метаданные – буквально переводится как "данные о данных", информация о другом наборе данных. Метаданные — это структурированные, кодированные данные, которые описывают характеристики объектов-носителей информации, способствующие идентификации, обнаружению, оценке и управлению этими объектами.

Манифест – общее название для сборки. Манифест содержит "объявление" рассказывающее (обычно другим программам) что-то о данной программе/модуле и список внешних ссылок.

При компиляции компилятор преобразует исходный код в промежуточный язык Microsoft (MSIL), представляющий собой независимый от процессора набор инструкций, который можно эффективно преобразовать в машинный код. Язык MSIL включает инструкции для загрузки, сохранения, инициализации и вызова методов для объектов, а также инструкции для арифметических и логических операций, потоков управления, прямого доступа к памяти, обработки исключений и других операций. Перед выполнением код MSIL необходимо преобразовать в код для конкретного процессора, обычно с помощью JIT. Поскольку среда CLR предоставляет для каждой поддерживаемой компьютерной архитектуры один или несколько JIT-компиляторов, один набор инструкций MSIL можно компилировать и выполнять в любой поддерживаемой архитектуре. Когда компилятор создает код MSIL, одновременно создаются метаданные. Метаданные содержат описание типов в коде, включая определение каждого типа, на которые есть ссылки в коде, а также другие сведения, используемые средой выполнения во время выполнения.

CLR – (Common Language Runtime) работа с прог. на промежуточном языке CLR (Common language runtime) — общеязыковая исполняющая среда. Она обеспечивает интеграцию языков и позволяет объектам благодаря стандартному набору типов и метаданным), созданным на одном языке, быть «равноправными гражданами» кода, написанного на другом. Другими словами CLR этот тот самый механизм, который позволяет программе выполняться в нужном нам порядке, вызывая функции, управляя данными. И все это для разных языков (c#, VisualBasic, Fortran). Да, CLR действительно управляет процессом выполнения команд (машинного кода, если хотите) и решает, какой кусок кода (функцию) от куда взять и куда подставить прямо в момент работы программы. Процесс компиляции представлен на рисунке 2.

Механизм работы

CLR компилирует код приложения на языке MCIL во время его исполнения, а также предоставляет MSIL-программам (а следовательно и программам, написанным на языках высокого уровня, поддерживающих .NET Framework) доступ к библиотеке классов, рисунок 1

Рисунок 1 Механизм работы

Рисунок 2 Процесс компиляции

IL (Intermediate Language) — код на специальном языке . В него преобразуется код из других языков. Вот тогда-то и пропадает зависимость от выбранного языка.

Совмещенные языки. В совмещенных языках исходный код проходит две стадии обработки. На первой стадии происходит компиляция исходного кода до уровня промежуточного языка (байт-код в Java или язык MSIL в технологии .NET). На второй стадии происходит интерпретация промежуточного кода (в Java этим занимается виртуальная машина Java) или докомпиляция промежуточного кода до выполняемого машинного кода (эту функцию осуществляет среда выполнения CLR в технологии .NET).

Программы в режиме динамической компиляции.

Байт-код — набор инструкций, исполняемых виртуальной машиной. Каждый код операции байт-кода — один байт.

Динамическая компиляция

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

  • JIT-компиляция (Just-in-time compilation, компиляция «на лету»), динамическая компиляция (dynamic translation) — технология увеличения производительности программных систем, использующих байт-код, путём компиляции байт-кода в машинный код или в другой формат непосредственно во время работы программы. Таким образом достигается высокая скорость выполнения по сравнению с интерпретируемым байт-кодом (сравнимая с компилируемыми языками) за счёт увеличения потребления памяти (для хранения результатов компиляции) и затрат времени на компиляцию.

  • JIT-компиляция может быть применена как ко всей программе, так и к её отдельным частям. Например, текстовый редактор может на лету компилировать регулярные выражения для более быстрого поиска по тексту.

  • Большинство реализаций JIT имеют последовательную структуру: сначала приложение компилируется в байт-код виртуальной машины среды исполнения (AOT-компиляция), а потом JIT компилирует байт-код непосредственно в машинный код. В итоге при запуске приложения тратится лишнее время, что впоследствии компенсируется более быстрой его работой.

  • Основная цель использования JIT — достичь и превзойти производительность статической компиляции, сохраняя при этом преимущества динамической компиляции

*, по сути, JIT-компиляция является одной из форм динамической компиляции