Общие сведения об алгоритмических языках и программировании. Простейшие команды языка. Интерпретатор и компилятор.
100
0
4 минуты
Управлять компьютером нужно по определенному алгоритму. Алгоритм —
это точно определенное описание способа решения задачи в виде
конечной (по времени) последовательности действий. Такое описание
еще называется формальным. Для представления алгоритма в виде,
понятном компьютеру, служат языки программирования сегодня
практически все программы создаются с помощью языков
программирования. Теоретически программу можно написать и
средствами обычного человеческого (естественного) языка — это
называется программированием на метаязыке (подобный подход обычно
используется на этапе составления алгоритма), но автоматически
перевести такую программу в машинный код пока невозможно из-за
высокой неоднозначности естественного языка. Языки программирования
— искусственные языки. От естественных они отличаются ограниченным
числом «слов», значение которых понятно транслятору, и очень
строгими правилами записи команд (операторов). Совокупность
подобных требований образует синтаксис языка программирования, а
смысл каждой команды и других конструкций языка — его семантику.
Нарушение формы записи программы приводит к тому, что транслятор не
может понять назначение оператора и выдает сообщение о
синтаксической ошибке, а правильно написанное, но не отвечающее
алгоритму использование команд языка приводит к семантическим
ошибкам (называемые еще логическими ошибками или ошибками времени
выполнения). Процесс поиска ошибок в программе называется
тестированием, процесс устранения ошибок — отладкой. С помощью
языка программирования создается не готовая программа, а только ее
текст, описывающий ранее разработанный алгоритм. Чтобы получить
работающую программу, надо этот текст либо автоматически перевести
в машинный код (для этого служат программы-компиляторы) и затем
использовать отдельно от исходного текста, либо сразу выполнять
команды языка, указанные в тексте программы (этим занимаются
программы-интерпретаторы). Интерпретатор берет очередной оператор
языка из текста программы, анализирует его структуру и затем сразу
исполняет (обычно после анализа оператор транслируется в некоторое
промежуточное представление или даже машинный код для более
эффективного дальнейшего исполнения). Только после того как текущий
оператор успешно выполнен, интерпретатор перейдет к следующему. При
этом, если один и тот же оператор должен выполняться в программе
многократно, интерпретатор всякий раз будет выполнять его так, как
будто встретил впервые. Вследствие этого, программы, в которых
требуется осуществить большой объем повторяющихся вычислений, могут
работать медленно. Кроме того, для выполнения такой программы на
другом компьютере там также должен быть установлен интерпретатор —
ведь без него текст программы является просто набором символов.
По-другому, можно сказать, что интерпретатор моделирует некую
виртуальную вычислительную машину, для которой базовыми
инструкциями служат не элементарные команды процессора, а операторы
языка программирования. Компиляторы полностью обрабатывают весь
текст программы (он иногда называется исходный код). Они
просматривают его в поисках синтаксических ошибок (иногда несколько
раз), выполняют определенный смысловой анализ и затем автоматически
переводят (транслируют) на машинный язык — генерируют машинный код.
Нередко при этом выполняется оптимизация с помощью набора методов,
позволяющих повысить быстродействие программы (например, с помощью
инструкций, ориентированных на конкретный процессор, путем
исключения ненужных команд, промежуточных вычислений и т. д.).
В
результате законченная программа получается компактной и
эффективной, работает в сотни раз быстрее программы, выполняемой с
помощью интерпретатора, и может быть перенесена на другие
компьютеры с процессором, поддерживающим соответствующий машинный
код. Основной недостаток компиляторов — трудоемкость трансляции
языков программирования, ориентированных на обработку данных
сложной структуры, часто заранее неизвестной или динамически
меняющейся во время работы программы. Тогда в машинный код
приходится вставлять множество дополнительных проверок,
анализировать наличие ресурсов операционной системы, динамически их
захватывать и освобождать, формировать и обрабатывать в памяти
компьютера сложные объекты, что на уровне жестко заданных машинных
инструкций осуществить довольно трудно, а для ряда задач
практически невозможно. С помощью интерпретатора, наоборот,
допустимо в любой момент остановить работу программы, исследовать
содержимое памяти, организовать диалог с пользователем, выполнить
сколь угодно сложные преобразования данных и при этом постоянно
контролировать состояние окружающей программно-аппаратной среды,
благодаря чему достигается высокая надежность работы. Интерпретатор
при выполнении каждого оператора проверяет множество характеристик
операционной системы и при необходимости максимально подробно
информирует разработчика о возникающих проблемах. Кроме того,
интерпретатор очень удобен для использования в качестве инструмента
изучения программирования, так как позволяет понять принципы работы
любого отдельного оператора языка. В реальных системах
программирования перемешаны технологии и компиляции, и
интерпретации. В процессе отладки программа может выполняться по
шагам, а результирующий код не обязательно будет машинным — он даже
может быть исходным кодом, написанным на другом языке
программирования (это существенно упрощает процесс трансляции, но
требует компилятора для конечного языка), или промежуточным
машиннонезависимым кодом абстрактного процессора, который в
различных компьютерных архитектурах станет выполняться с помощью
интерпретатора или компилироваться в соответствующий машинный код.
Разные типы процессоров имеют разные наборы команд. Если язык
программирования ориентирован на конкретный тип процессора и
учитывает его особенности, то он называется языком программирования
низкого уровня. В данном случае «низкий уровень» не значит
«плохой». Имеется в виду, что операторы языка близки к машинному
коду и ориентированы на конкретные команды процессора. Языком
самого низкого уровня является язык ассемблера, который просто
представляет каждую команду машинного кода, но не в виде чисел, а с
помощью символьных условных обозначений, называемых мнемониками.
Однозначное преобразование одной машинной инструкции в одну команду
ассемблера называется транслитерацией. Так как наборы инструкций
для каждого модели процессора отличаются, конкретной компьютерной
архитектуре соответствует свой язык ассемблера, и написанная на нем
программа может быть использована только в этой среде. С помощью
языков низкого уровня создаются очень эффективные и компактные
программы, так как разработчик получает доступ ко всем возможностям
процессора. С другой стороны, при этом требуется очень хорошо
понимать устройство компьютера, затрудняется отладка больших
приложений, а результирующая программа не может быть перенесена на
компьютер с другим типом процессора. Подобные языки обычно
применяют для написания небольших системных приложений, драйверов
устройств, модулей стыковки с нестандартным оборудованием, когда
важнейшими требованиями становятся компактность, быстродействие и
возможность прямого доступа к аппаратным ресурсам. В некоторых
областях, например в машинной графике, на языке ассемблера пишутся
библиотеки, эффективно реализующие требующие интенсивных вычислений
алгоритмы обработки изображений.
Понравилась работу? Лайкни ее и оставь свой комментарий!
Для автора это очень важно, это стимулирует его на новое творчество!