Языки программирования — искусственные языки. От естественных они отличаются ограниченным числом «слов», значение которых понятно транслятору, и очень строгими правилами записи команд (операторов). Совокупность подобных требований образует синтаксис языка программирования, а смысл каждой команды и других конструкций языка — его семантику. Нарушение формы записи программы приводит к тому, что транслятор не может понять назначение оператора и выдает сообщение о синтаксической ошибке, а правильно написанное, но не отвечающее алгоритму использование команд языка приводит к семантическим ошибкам (называемым еще логическими ошибками или ошибками времени выполнения).
Процесс поиска ошибок в программе называется тестированием, процесс устранения ошибок — отладкой.
ЯП – фиксированная система обозначений и правил для описания алгоритмов и структур данных.
С помощью языка программирования создается не готовая программа, а только ее текст, описывающий ранее разработанный алгоритм. Чтобы получить работающую программу, надо этот текст либо автоматически перевести в машинный код (для этого служат программы-компиляторы ) и затем использовать отдельно от исходного текста, либо сразу выполнять команды языка, указанные в тексте программы (этим занимаются программы-интерпретаторы ).
Интерпретатор берет очередной оператор языка из текста программы, анализирует его структуру и затем сразу исполняет. Только после того, как текущий оператор успешно выполнен, интерпретатор перейдет к следующему. При этом если один и тот же оператор должен выполняться в программе многократно, интерпретатор всякий раз будет выполнять его так, как будто встретил впервые. Вследствие этого, программы, в которых требуется осуществить большой объем повторяющихся вычислений, могут работать медленно. Кроме того, для выполнения такой программы на другом компьютере там также должен быть установлен интерпретатор — ведь без него текст программы является просто набором символов.
По-другому можно сказать, что интерпретатор моделирует некую виртуальную вычислительную машину, для которой базовыми инструкциями служат не элементарные команды процессора, а операторы языка программирования.
Компиляторы полностью обрабатывают весь текст программы (он иногда называется исходный код ). Они просматривают его в поисках синтаксических ошибок (иногда несколько раз), выполняют определенный смысловой анализ и затем автоматически переводят (транслируют) на машинный язык — генерируют машинный код. Нередко при этом выполняется оптимизация с помощью набора методов, позволяющих повысить быстродействие программы (например, с помощью инструкций, ориентированных на конкретный процессор, путем исключения ненужных команд, промежуточных вычислений и т. д.). В результате законченная программа получается компактной и эффективной, работает в сотни раз быстрее программы, выполняемой с помощью интерпретатора, и может быть перенесена на другие компьютеры с процессором, поддерживающим соответствующий машинный код.
Основной недостаток компиляторов — трудоемкость трансляции языков программирования, ориентированных на обработку данных сложной структуры, часто заранее неизвестной или динамически меняющейся во время работы программы. Тогда в машинный код приходится вставлять множество дополнительных проверок, анализировать наличие ресурсов операционной системы, динамически их захватывать и освобождать, формировать и обрабатывать в памяти компьютера сложные объекты, что на уровне жестко заданных машинных инструкций осуществить довольно трудно, а для ряда задач практически невозможно.
С помощью интерпретатора, наоборот, допустимо в любой момент остановить работу программы, исследовать содержимое памяти, организовать диалоге пользователем, выполнить сколь угодно сложные преобразования данных и при этом постоянно контролировать состояние окружающей программно-аппаратной среды, благодаря чему достигается высокая надежность работы. Интерпретатор при выполнении каждого оператора проверяет множество характеристик операционной системы и при необходимости максимально подробно информирует разработчика о возникающих проблемах. Кроме того, интерпретатор очень удобен для использования в качестве инструмента изучения программирования, так как позволяет понять принципы работы любого отдельного оператора языка.
В реальных системах программирования перемешаны технологии и компиляции, и интерпретации. В процессе отладки программа может выполняться по шагам, а результирующий код не обязательно будет машинным — он даже может быть исходным кодом, написанным на другом языке программирования (это существенно упрощает процесс трансляции, но требует компилятора для конечного языка), или промежуточным машинно-независимым кодом абстрактного процессора, который в различных компьютерных архитектурах станет выполняться с помощью интерпретатора или компилироваться в соответствующий машинный код.
Эволюция и классификация ЯП.
I поколение. ЯП – набор машинных команд в двоичном или восьмиричном формате. Для каждой ЭВМ требовался свой язык. От программиста требовалось не только знание ЯП, но и знание архитектуры компьютера.
II поколение. Языки ассемблерного типа, позволяющие вместо двоичного или восьмиричного кода использовать их мнемоническое символьное обозначение – имена. Это шаг вперед по сравнению с 1 поколением, но все же это машинно-ориентированные языки. По-прежнему от программиста требовалось не только знание ЯП, но и знание архитектуры компьютера. Сейчас эти ЯП используются для создания ПО по минимальному объему и с максимальной производительностью.
III поколение. В 1965 г. появился первый язык высокого уровня FORTRAN (Дж. Бэкус, фирма IBM). ЯП этого уровня человеко-ориентированные, проще в освоении. Версии FORTRAN использовались на ЭВМ всех классов. За FORTRAN появились и развились ALGOL, COBOL, BASIC, PL/1, PASCAL, APL, ADA,C, FORth, LISP, MODULA, и др. В настоящее время более 2000 ЯП.
IV поколение. ЯП
1) носят непроцедурный характер – описывают ЧТО делать, а не КАК надо делать. Пример – PROLOG, LONGIN. Свободно осваиваются и применяются непрофессионалами;
2) объектно-ориентированнные - каждый графический объект знает, что нужно делать со своими данными (SMALLTALK, его основа SIMULA-67);
3) языки запросов – извлечение информации из БД. Стандарт этих ЯП является SQL – STRUCTURED QUERY LANGUAGE;
4) языки параллельного программирования – ориентированы на создание ПО для вычислительных систем параллельной архитектуры (многомашинные, мультипроцессорные системы и т.д.). Эти языки являются модификацией FORTRAN, OCCAM, SISAL и т.д.).
V поколение. Языки искусственного интеллекта (InterLisp, EXPERTLISP, IQLISP, SAIL) и естественные языки, не требующие освоения специального синтаксиса. В настоящее время естественные языки ограниченных возможностей (CLOUT, Q$A, HAL).
Фактор | Характеристика | Группы | Примеры ЯП |
Уровень ЯП | Степень близости ЯП к архитектуре компьютера | Низкий | Автокод, ACCEMBLER |
Средний | FORTRAN, PASCAL, ADA, BASIC, C | ||
Высокий | СЕТЛ | ||
Специализация ЯП | Потенциальная или реальная область применения | Общего назначения (универсальные) | ALGOL, PL/1, SIMULA, BASIC, PASCAL |
Специализированные | FORTRAN (инженерные расчеты), COBOL (коммерческие задачи), REFAL, LISP (символьная обработка), MODULA, ADA (программирование в режиме реального времени) | ||
Алгоритмичность (процедурность) | Возможность абстрагироваться от деталей алгоритма. Алгоритмичность тем выше, чем точнее приходится планировать порядок выполняемых действий | Процедурные | ACCEMBLER, FORTRAN, BASIC, PASCAL, ADA |
Непроцедурные | PROLOG, LANGIN |