Компиляторы, интерпретаторы, компоновщики




Инструментальные средства разработки ПО

 

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

Необходимые

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

редакторы текстов;

компиляторы и интерпритаторы;

компоновщики или редакторы связей (linkers);

Часто используемые

Это средства, использования которых, в отличие от необходимых, можно избежать. Но без них процесс разработки весьма затрудняется и удлиняется. Из часто используемых средств стоит назвать:

утилиты автоматической сборки проекта;

отладчики;

программы создания инсталляторов;

редакторы ресурсов;

программы поддержки версий;

программы создания файлов помощи (документации).

Специализированные

Эти инструментальные средства используются в исключительных случаях, решают довольно специфичные задачи:

программы отслеживания зависимостей;

дизассемблеры;

декомпиляторы;

hex-редакторы;

программы отслеживания активности системы и изменений, происходящих в системе;

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

Интегрированные среды разработки

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

Текстовые редакторы

Текстовые редакторы относятся к необходимым инструментальным средствам. Это так, потому что не имея текстового редактора, мы не сможем редактировать исходный текст на языке программирования. Важно понимать, что в этом контексте под текстовым редактором понимается не что-то вроде Microsoft Word с его многообразием функций для форматирования текста, таблиц и т.п.. Текстовый редактор для программирования должен обеспечивать немного другой функционал:

- возможность сохранения документов в требуемом формате (поддержка нужных расширений и т.п.);

- возможность подсветки синтаксиса (выделение ключевых слов, констант и т.п.);

- возможность копирования, вставки, замены фрагментов текста;

- возможность автодополнения вводимого текста, отображения вариантов для вызываемых функций и т.п.;

- возможности автоформатирования вводимого текста (автоматически создавать отступы в теле функции и т.п.).

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

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

Пожалуй, нет смысла описывать тут процесс открытия и сохранения документов в текстовом редакторе. Сделаем акцент на другой момент при работе с исходными текстами программ. Дело в том, что русские символы могут кодироваться по-разному. Существует несколько однобайтных кодировок (например: cp-1251, cp-866, koi8-r) и несколько двухбайтных (utf-8, utf-16). Получается, что если сохранить файл в одной кодировке, а открыть, подразумевая, что он в другой - русский текст сложно будет прочитать. Это - основной источник проблем при работе с текстовыми редакторами. Несмотря на повсеместный переход на UTF-8, проблема всё еще актуальна и нужно помнить о том, какая у вас кодовая страница и поддерживает ли её редактор. Таким образом, практически обязательным требованием для текстового редактора является поддержка разных кодировок текста и способность преобразования текста из одной в другую.

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

Компиляторы, интерпретаторы, компоновщики

Итак, у нас есть исходный текст, написанный на языке программирования. Он составлен в соответствиями с правилами языка и готов к дальнейшей обработке. Каким образом компьютер может выполнить этот исходный текст? Тут нам на помощь приходит программа, именуемая интерпретатор или компилятор. Обе эти программы выполняют схожие задачи (преобразование исходных текстов в машинный код), но подходят к ним по-разному.

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

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

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

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

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

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

Таким образом, «пропустив» исходный текст через компилятор мы (при отсутствии ошибок на этапах анализа) получим объектный код, который почти готов к выполнению. Компиляторы одних языков программирования (например, С) генерируют код для конкретного типа процессора (например Intel), в то время как компиляторы других языков программирования (например Java) генерируют код для выполнения в специальной виртуальной машине. Почему компилятор не генерирует сразу готовый код?

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

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

Интерпретатор тоже преобразует текст на языке высокого уровня, но делает это построчно. Как только первая строка преобразована - она тут же запускается на выполнение. У такого подхода есть как достоинства, так и недостатки.

Достоинства интерпретаторов:

- боìльшая переносимость интерпретируемых программ — программа будет работать на любой платформе, на которой есть соответствующий интерпретатор.

- как правило, более совершенные и наглядные средства диагностики ошибок в исходных кодах.

- упрощение отладки исходных кодов программ.

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

Недостатки интерпретаторов:

- интерпретируемая программа не может выполняться отдельно без программы-интерпретатора. Сам интерпретатор при этом может быть очень компактным.

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

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

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

Компоновщик, известный так же как редактор связей, (linker, link editor) занимается созданием готового исполняемого файла из «кусочков» объектного кода. Выше, в разделе компиляции мы рассматривали ситуацию, когда проще выполнить компиляцию по частям. Если был применен такой подход, то окончательную сборку выполняет компоновщик. Как-правило, компоновщик является частью компилятора.

Для связывания модулей компоновщик использует таблицы имён, созданные компилятором в каждом из объектных модулей. Такие имена могут быть двух типов:

- определённые или экспортируемые имена — функции и переменные, определённые в данном модуле и предоставляемые для использования другим модулям;

- неопределённые или импортируемые имена — функции и переменные, на которые ссылается модуль, но не определяет их внутри себя.

Работа компоновщика заключается в том, чтобы определить и связать ссылки на неопределённые имена в каждом модуле. Для каждого импортируемого имени находится его определение в других модулях и после этого упоминание имени заменяется на его адрес.

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

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-06-26 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: