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




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

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

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

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

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

 

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

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

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

Командный интерпретатор

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

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

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

ОС Linux использует несколько различных видов интерпретаторов. Наиболее распространенными среди них являются:

  • sh. Bourne Shell. Прообраз командных интерпретаторов сегодняшнего дня. В современных Linux-системах sh представляет собой символическую ссылку на файл bash;
  • bash. Bourne-Again SHell. Основной командный интерпретатор ОС Linux. Представляет собой развитие ash и sh. Поддерживает богатый язык написания скриптов, удобный интерфейс для редактирования командной строки, автопродолжение команд и множество других полезных возможностей;
  • tcsh. C Shell. Расширенная версия интерпретатора C Shell, использующегося в BSD-системах. Поддерживает функцию автозавершения текста и расширенные возможности редактирования;
  • zsh. Очень развитый командный интерпретатор, объединяющий в себе возможности csh, bash с дополнительными, такими как: улучшенная поддержка автопродолжения, более развитые возможности редактирования, расширенные файловые шаблоны и ряд других;
  • nash. Not A SHell. Предельно облегченная оболочка, предназначенная для интерпретации сценариев в linuxrc файлах, при загрузке с виртуального диска initrd. Не позволяет работать пользователю в интерактивном режиме.

Отличительной особенностью программ интерпретаторов, являются две буквы sh, в конце их имени (от англ. shell — оболочка, командный интерпретатор). Как работает командный интерпретатор?

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

[user@host dir]

По умолчанию приглашение содержит информацию об имени пользователя, имени компьютера и текущем каталоге. Завершающим символом является $ или # в зависимости от того, обладает ли пользователь, от имени которого запущен интерпретатор, привилегиями суперпользователя (#) или нет ($).

Формат приглашения можно настроить при помощи переменной командного интерпретатора PS1

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

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

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

  • Файловые шаблоны. Специальные метасимволы, необходимые для описания групп файлов;
  • Перенаправление. Механизм, обеспечивающий взаимодействие несвязанных между собой программ: данные, поступающие с выхода одной программы попадают на вход другой.
  • Переменные интерпретатора. Командный интерпретатор использует переменные как временное хранилище данных, необходимое ему для нормальной работы: например, переменные могут использоваться в скриптах интерпретатора или для передачи настроек. Переменные также обеспечивают удобный доступ к среде окружения программ.
  • Скриптинг. Команды могут не вводится пользователем в интерактивном режиме, а считываться из заранее подготовленного файла. Это облегчает многократное исполнение одинаковых или схожих между собой действий. Интерпретаторы развивают эту идею, позволяя обрабатывать не просто последовательность подряд идущих команд, а целые сценарии, содержащие конструкции алгоритмических языков программирования: циклы, ветвления, функции.

Ввод командной строки

Командный интерпретатор bash делает редактирование командной строки предельно эффективным. Ввод строки осуществляется быстро и точно. Для выполнения этих требований bash обладает несколькими особенностями:

  • Мощный и гибко настраиваемый интерфейс редактирования командной строки;
  • История команд;
  • Автопродолжение.

Редактирование

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

Перечисленные привязки к клавишам не являются жесткими. Интерфейс может быть гибко настроен с помощью библиотеки GNU readline. Интерпретатор bash поддерживает более сотни встроенных команд, облегчающих редактирование

История команд

Все команды, введенные пользователем в интерпретаторе bash, сохраняются. Перечень ранее введенных команд называется историей. После того как нажимается клавиша Enter, команда записывается в историю. Если при этом размер списка истории слишком велик (максимальный размер определяется переменной HISTSIZE), первая команда из него удаляется. При завершении работы bash история сохраняется в файле, а в начале его работы — восстанавливается.

Если команда раньше была введена, ее можно не вводить полностью, а просто выбрать из списка истории. Наиболее простые команды для передвижения по списку истории: клавиши вверх и вниз для перехода соответственно к предыдущему и следующему элементу истории. [Предостережение] Предостережение

Первая команда это первая команда в списке истории, т.е. первая введенная команда. Последняя — последняя команда в списке, последняя введенная команда.



Поделиться:




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

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


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