Файл: Обзор и анализ характеристик языков программирования (подробно).pdf
Добавлен: 06.04.2023
Просмотров: 96
Скачиваний: 1
СОДЕРЖАНИЕ
1. Процедурные (императивные) языки программирования
1.1 Языки программирования низкого уровня
1.2 Языки программирования высокого уровня
2 Непроцедурные языки программирования
2.1 Объектно-ориентированные, логические, функциональные языки программирования
2 Непроцедурные языки программирования
2.1 Объектно-ориентированные, логические, функциональные языки программирования
К непроцедурным языкам относятся декларативные и объектно-ориентированные языки (Object Pascal, Java, Objective Caml и др.) Объектно-ориентированный подход связывает данные с обрабатывающими эти данные процедурами в единое целое - объект. Он использует следующие базовые понятия: объект; свойство объекта; событие; метод обработки; класс объектов [5, С. 54].
Если программа написана на интерпретируемом языке программирования, то ее можно выполнить на том компьютере, на котором будет установлен интерпретатор. Программы, написанные на компилируемых языках программирования, в посредниках не нуждаются – после компиляции уже получен машинный код, в котором есть все необходимее для работы процессора. Эти программы работают на любом компьютере и делают это в сотни раз быстрее. У программ, написанных на интерпретируемых языках программирования, есть свое преимущество [3, С. 72]. Так как мы можем исполнять их только под управлением интерпретатора, то соответственно в любой момент времени можно остановить работу программы, посмотреть ее операторы, внести нужные изменения, вновь запустить и т. д. Содержание программы открыто для пользователя. Для откомпилированных программ это сделать практически невозможно. После компиляции программы ее исходный текст остается только у автора. Все остальные пользователи получают машинный код, который можно исполнять, но практически нельзя ни посмотреть, ни изменить [3, С. 78].
При создании языков объектно-ориентированного программирования преследовались две цели:
1) сократить размеры программ за счет повышения размера строительных элементов («маленькие» переменные заменяются «большими» объектами), чтобы обеспечить возможность создания более крупных программных приложений;
2) упростить процесс создания новых программ на базе старых.
Объектно-ориентированные языки задают вычисления как взаимодействия программных объектов. Объектом называют именуемый модуль, заключающий в себе данные и операции для их обработки. Программный объект похож на физический, он имеет свое состояние и демонстрирует окружающей среде свое поведение. Поведение объекта задается последовательностью выполняемых операций, а состояние характеризуется перечнем данных и их значений. Объекты взаимодействуют друг с другом с помощью сообщений. Сообщение посылает объект-источник, а принимает объект-приемник. Каждое сообщение является запросом на выполнение операции объектом-приемником. Описание объектов с общей структурой и поведением называется классом. Единичные объекты создаются по их описаниям. В роли описаний для переменных, выступают типы данных, а в роли описаний для объектов - классы. Объект считается экземпляром класса. Неповторимость объектно-ориентированного подхода определяют три принципа.
1. Инкапсуляция (сокрытие содержимого от внешнего мира), означает, что каждый объект помещен в защитную оболочку, сквозь которую другие объекты видят только необходимое: заголовки операций, которые может выполнять объект.
2. Наследование (возможность получения потомками структуры и поведения предков), позволяет внедрить в новый класс элементы данных и операции старого класса, обеспечивая возможность их модификации.
3. Полиморфизм (применение одного имени для выражения разных действий и объектов), поддерживает возможность существования целого семейства разных операций с тем же именем [7, С. 123].
Первым объектно-ориентированным языком является Simula 67 (как расширение императивного языка Algol 60). Целью работы над вторым языком – Smalltalk, было создание целой среды для персонального компьютера. Первоначально программы на Smalltalk выполнялись только в специализированной вычислительной среде. Работа Smalltalk основана на модели взаимодействия. Данные образуются объектами, а методы рассматриваются как сообщения, посылаемые объектам. Smalltalk применяет динамическую модель последовательности действий. Каждый метод выполняется с одновременным созданием записи активации. Для хранения объектов данных и записей активации язык реализует динамическую организацию памяти в виде кучи. Для очистки памяти выполняется динамическая сборка мусора [7, С. 140].
Язык Smalltalk определяют следующие характеристики.
1) Среда разработки. Язык создавался как целая система, элементами которой являются: язык, среда программирования, аппаратные средства, операционное окружение компьтера.
2) Минимальный язык разработки. Основные операторы Smalltalk задают присваивание и последовательность действий. В самом языке описан набор базовых средств, чтобы создать класс и прикрепить к нему методы.
Мощность языка обеспечивается параметрическим механизмом сообщений, которые определяют структуры ветвления и циклы [11, С. 90]. В исходной поставке системы прописан набор встроенных классов. В ходе инсталляции формируется образ системы с этими классами и пустым окружением. При вызове интерпретатора Smalltalk программист получает собственную копию этого образа, внутри которой создает новые классы и модифицирует существующие. Системный администратор может изменить систему Smalltalk, предложив другой набор классов [2, С. 142].
Для создания гипертекстовых документов в среде World Wide Web - Всемирная паутина, был создан язык разметки гипертекста язык HTML - HyperText Markup Language. Это один из наиболее простых языков создания веб-страниц. У каждого компьютера в Интернете имеется свой адрес. Когда на веб-сервер приходит запрос, адрес отправителя всегда известен и ответ посылается именно по этому адресу [21, С. 40]. Взаимодействие сервера и клиента обеспечивают несколько протоколов передачи данных. Описания документов в языке HTML создаются при помощи элементов.
Элемент - это команда, записываемая тегами. Теги элемента еще называют контейнером, который заполняется конкретным содержанием. Элемент имеет следующую структуру: открывающий тег – содержание - закрывающий тег. Содержание - это некоторая последовательность символов. Все теги начинаются с левой угловой скобки ( ). Внутри угловых скобок указывается имя, которое формирует имя всего элемента. Самый первый элемент, который встречается в документе, должен начинаться с тега. Он сообщает веб-браузеру, что документ написан на языке HTML. Структурно документ делится на две части: заголовочную и основную [15, С. 340].
Логические языки - (Prolog, Lisp, Mercury, KLO) ориентированы на систематическое и формализованное описание задачи с тем, чтобы решение следовало из составленного описания. В этих языках указывается, что дано и что требуется получить, а поиск решения возлагается непосредственно на ЭВМ. Логические (декларативные) языки описывают не способ решения задачи, а саму задачу, то есть задают формализованное представление предметной области [10, С. 75]. Логические языки называют языками, основанными на системе правил. Порядок выполнения действия осуществляются не в той последовательности, в которой они определены в программе.
Самым известным языком называют язык Prolog. Он создан авторским коллективом во Франции в 1972 году и ориентирован на решение задач с использованием исчисления предикатов [4, С. 115]. Язык Prolog предоставляет возможность задания спецификаций решения и позволяет компьютеру вывести из них последовательность выполнения для этого решения. Он не задает алгоритм решения задачи. Программа языка Prolog состоит из набора фактов и отношений, которые устанавливаются между объектами данных (фактами) и набором правил. Факты и правила заносят в базу данных при помощи операции consult. Для начала работы программы необходимо ввести запрос. Запрос образует набор термов, которые должны иметь истинное значение. Факты и правила из базы данных определяют такие подстановки для переменных в запросе (унификация), которые согласуются с информацией в базе данных [4, С. 125].
Система реализации языка Prolog приглашает пользователя вводить информацию. Пользователь набирает запрос, выводится значение этого запроса и возможные значения переменных запроса, присвоение которых унифицирует запрос. Нажатие клавиши Enter воспринимается как «прекратить поиск дополнительных решений». В языке Prolog применяется простой синтаксис и простая семантика. Основными формами представления данных являются переменная и список [4, С. 134].
К функциональным языкам программирования относятся LISP, ML (MetaLanguage), Язык Haskell. В отличие от императивного подхода к вычислениям, работа функциональных языков основывается на собственной идее. вместо отслеживания последовательности состояний, через которые проходит компьютер для получения ответа, здесь ищется функция программы, обеспечивающая ожидаемый результат [9, С. 331]. Внимание концентрируется на последовательных преобразованиях начальных данных с помощью функций. Как только будет придуман конечный ответ (последовательность функций), его применяют к начальным данным и получают результат [5, С. 80]. Функциональные (аппликативные) языки задают вычисления как вызовы функций. В функциональных языках отсутствуют переменные, нет операторов присваивания, нет повторений в форме итераций. Для определения функции, сначала придумывают ее имя и задают вычисляемое ей выражение. Описание единичного действия - это вызов функции с конкретными аргументами. Описание программы - это описание последовательности вызовов отдельных функций [9, С. 44].
Язык функционального программирования LISP появился в рамках проекта по искусственному интеллекту в 1960 году под руководством Джона Маккарти. Он широко использовался для научных исследований в области естественных языков, доказательства теорем, задач искусственного интеллекта. Программы на LISP выполняются в диалоговой среде, поэтому главной программы как таковой не существует. Вместо этого пользователь вводит последовательность выражений, которые необходимо вычислить.[4] Система LISP вычисляет выражения по мере их ввода и автоматически выводит результаты на экран монитора. В LISP не существует блочной структуры. Единственной формой взаимодействия между функциями является обращение к одной функции из другой во время выполнения программы.
Функции LISP всегда определяются как выражения [5, С. 59]. Каждый оператор является функцией, возвращающей некоторое значение, а подпрограммы записываются как единые выражения. Базовый синтаксис LISP определяет только выражения. Для увеличения сходства с обычным синтаксисом программы в язык были добавлены специальные конструкции. Набор типов данных в LISP не велик. Основными элементарными типами данных являются литеральные атомы (символы) и числовые атомы (числа). Основные структуры данных образуют связанные списки и списки свойств. LISP имеет широкий набор элементарных операций для создания, уничтожения и модификации списков. Дополнительно поддерживаются основные арифметические операции [3, С. 39]. Во время выполнения одной программы можно транслировать и выполнять другие.
Структуры управления LISP очень просты. Используемые выражения записываются в кембриджской польской записи и содержат условное ветвление. Комментарии начинаются точкой с запятой, а вся следующая за этим символом строка является комментарием. Обработка нелокальных ссылок основана на правиле последней ассоциации. Параметры функций передаются по значению или по имени. Проще всего LISP реализуется с помощью программного интерпретатора и программного моделирования всех элементарных операций. Дополнительно предоставляется компилятор, который можно использовать для компиляции определений функций в машинные коды.[5] LISP плохо приспособлен для компиляции, потому что большая часть связываний происходит во время выполнения программы. Основным средством для хранения данных это система управления памятью. На протяжении 1970-80х годов разрабатывалось множество различных диалектов языка LISP и была создана стандартная версия языка - COMMON LISP (1984) [6, С. 111].
Язык ML (MetaLanguage) созданный Робином Милнером (1990 г), поддерживал не только функциональную, но и императивную парадигму. В этот язык вернулись понятия переменной, типа и оператора. Синтаксис языка ML подобен синтаксису императивных языков. Современным преемником языка Miranda, как чисто функциональный, считается язык Haskell (1992 г). Здесь использована идея «ленивого» вычисления: никакое выражение не вычисляется, пока не потребуется его значение.
2.2 Скриптовые языки, их характеристики
Традиционные языки программирования нужны для создания программ, которые принимают входные данные, обрабатывают их и генерируют соответствующие результаты. Однако в большинстве компьютерных приложений требуется координация множества программ. Например, работа в компьютерной программе дизайнера или фотографа состоит из загрузки изображения из цифровой камеры, выбора формата, вращения изображения для выбора оптимальной ориентации, индексация по теме, времени, цветовой гамме, перемещения в архив [17, С. 255]. Несомненно, ручное выполнение данных шагов и утомительно, и подвержено ошибкам. Иная нагрузка идет при работе в большой платежной банковской системе. Здесь должны обрабатываться данные сканируемых бумажных документов, устройств чтения кредитных карточек, данные, вводимые вручную с клавиатуры [8, С. 25].
В процессе работы выполняются тысячи запросов к базе данных, реализуются сотни юридических и корпоративных правил, создается обширная документация, поддерживается связь с серверами по всему миру для обеспечения депозитов в режиме «онлайн». Эти задачи требуют применения сотен отдельных программ. Координация этих программ в свою очередь потребует разнообразных проверок и логических решений, циклов, подпрограмм и абстракций — тех же видов логических утилит, которые традиционные языки предоставляют внутри приложения. В подобном стиле создание динамической веб-страницы может требовать идентификации и авторизации, поиска в базе данных, отображения манипуляций, удаленного взаимодействия, чтения и записи текста HTML. Сценарии подобных действий называют скриптами [6, С. 37]. Эти сценарии обосновывают потребность в программах, которые координируют другие программы.