Файл: Классификация языков программирования . Критерии выбора среды и языка разработки программ.pdf
Добавлен: 04.04.2023
Просмотров: 71
Скачиваний: 1
- в середине 1970-х гг. группа специалистов представила язык Smalltalk, который был уже всецело объектно-ориентированным;
- в период с 1969 по 1973 гг. велась разработка языка Си, популярного и по сей день, и ставшего основой для множества последующих языков, например, столь популярных, как С++ и Java;
- в 1972 г. был создан Пролог – наиболее известный (хотя и не первый, далеко не единственный) язык логического программирования;
- в 1973 г. в языке ML была реализована расширенная система полиморфной типизации, положившая начало типизированным языкам функционального программирования.
Каждый из этих языков породил по семейству потомков, и большинство современных языков программирования, в конечном счете, основано на одном из них. Кроме того, в 1960-1970-х гг. активно велись споры о необходимости поддержки структурного программирования в тех или иных языках [21, с. 90].
Голландский специалист Э. Дейкстра выступал в печати с предложениями о полном отказе от использования инструкций GOTO во всех высокоуровневых языках. Развивались также приемы, направленные на сокращение объема программ и повышение продуктивности работы программиста и пользователя.
Суммируя вышесказанное, мы приходим к выводу, что язык программирования – это знаковая система, предназначенная для записи компьютерных программ. Он определяет набор лексических, синтаксических и семантических правил, определяющих внешний вид программы и действия, которые выполнит исполнитель (обычно – ЭВМ) под ее управлением.
1.2. Классификация языков программирования
Существуют различные классификации языков программирования. По наиболее распространенной классификации все языки программирования, в соответствии с тем, в каких терминах необходимо описать задачу, делят на языки низкого и высокого уровня [3, с. 229].
Если язык близок к естественному языку программирования, то он называется языком высокого уровня, если ближе к машинным командам – языком низкого уровня. В группу языков низкого уровня входят машинные языки и языки символического кодирования: Автокод, Ассемблер. Операторы этого языка – это те же машинные команды, но записанные мнемоническими кодами, а в качестве операндов используются не конкретные адреса, а символические имена. Все языки низкого уровня ориентированы на определенный тип компьютера, т.е. являются машинно-зависимыми.
Машинно-ориентированные языки – это языки, наборы операторов и изобразительные средства которых существенно зависят от особенностей ЭВМ [20, с. 90].
К языкам программирования высокого уровня относят Фортран (переводчик формул – был разработан в середине 50-х гг. программистами фирмы IBM и в основном используется для программ, выполняющих естественно-научные и математические расчеты), Алгол, Кобол (коммерческий язык – используется, в первую очередь, для программирования экономических задач), Паскаль, Бейсик (был разработан профессорами Дармутского колледжа – Джоном Кемени и Томасом Курцом), Си (Деннис Ритч – 1972 г.), Пролог (в основе языка лежит аппарат математической логики) и т.д. [11, с. 931].
Эти языки машинно-независимы, так как они ориентированы не на систему команд той или иной ЭВМ, а на систему операндов, характерных для записи определенного класса алгоритмов.
Однако программы, написанные на языках высокого уровня, занимают больше памяти и медленнее выполняются, чем программы на машинных языках. Программу, написанную на языке программирования высокого уровня, ЭВМ не понимает, поскольку ей доступен только машинный язык. Поэтому для перевода программы с языка программирования на язык машинных кодов используют специальные программы-трансляторы.
Языки программирования также можно разделять на поколения [21, с. 90]:
- языки первого поколения: машинно-ориентированные с ручным управлением памяти на компьютерах первого поколения;
- языки второго поколения: с мнемоническим представлением команд, так называемые автокоды;
- языки третьего поколения: общего назначения, используемые для создания прикладных программ любого типа. Например, Бейсик, Кобол, Си и Паскаль;
- языки четвертого поколения: усовершенствованные, разработанные для создания специальных прикладных программ, для управления базами данных;
- языки программирования пятого поколения: языки декларативные, объектно-ориентированные и визуальные. Например, Пролог, ЛИСП (используется для построения программ с использованием методов искусственного интеллекта), Си++, Visual Basic, Delphi.
Языки программирования также можно классифицировать на процедурные и непроцедурные. В процедурных языках программа явно описывает действия, которые необходимо выполнить, а результат задается только способом получения его при помощи некоторой процедуры Говоря о программировании в Интернете, часто имеют в виду создание публикаций с использованием языка разметки гипертекстовых документов – HTML. Применение специальных средств (HTML-редакторов) позволяет не только создавать отдельные динамически изменяющиеся интерактивные HTML-документы, используя при этом данные мультимедиа, но и редактировать целые сайты [10, с. 71].
В книге Т. Пратта и М.Зелковича языки программирования разделены на четыре группы [23]:
- императивные;
- аппликативные;
- основанные на системах правил;
- объектно-ориентированные.
Приведены описания этих групп языков, но четких признаков, по которым тот или иной язык программирования относится к определенной группе не выделено.
Кобелев И.А., Иванова Л.В., Чекушина В.Е. предлагают разделить все языки программирования четко на две группы: императивные и функциональные [14, с. 56].
Таблица 2
Классификация языков программирования по И.А. Кобелеву, Л.В. Ивановой, В.Е. Чекушиной
Синонимы |
Императивные |
Функциональные |
процедурные, алгоритмические |
аппликагивные |
|
Память |
Система «склада». Изначально «склад» заполняется исходными данными, получаемыми непосредственно (с помощью специальной операции присваивания) или извне (с устройств ввода). Далее, данные берутся из одного «помещения» склада, обрабатываются (изменяются) и размещаются в другом. Результат – появление требуемых данных в указанном «помещении» склада (заполнение видеопамяти обеспечивает вывод ответа на мониторе ПК). |
Отсутствие «склада». Для полу- чения данных один «специалист» требует их непосредственно от другого «специалиста», тот от следующего. |
Переменная |
Фиксированное помещение выше упомянутого «склада». Всегда глобальны, но придуманы способы «скрытия» отдельных «помещений», например системы «видимости» имен переменных, позволяющие иметь локальные переменные. |
Информация, передаваемая от одного процесса обработки другому. Существует лишь для момента процесса передачи. Всегда локальны. |
Теоретическая база |
Принципы фон-Неймана, машина Тьюринга. |
Исчисление Черча, вычислимые функции. |
Режим работы |
Компиляционный. Высокое быстродействие. |
Интерпретационный. Режимы реального времени. |
Описание действий (ироцедурность). |
Описание возможностей (декларативность). |
Источник: Кобелев И.А., Иванова Л.В., Чекушина В.Е. Два типа языков программирования // Современные проблемы науки и образования. – 2014. – №4. – С. 56.
Императивные (процедурные) языки программирования (ЯП) задают вычисления как последовательность команд (операторов). Они ориентированы на компьютеры с архитектурой фон Неймана [20, с. 63].
Императивные языки программирования классифицируем по работе с переменными и подпрограммами, тенденция – приближение по возможностям к функциональным языкам.
Основные понятия императивных ЯП тесно связаны с компонентами компьютера [3, с. 230]:
- переменные различных типов (моделируют ячейки памяти);
- операторы присваивания (моделируют пересылки данных);
- повторения действий в форме итерации (моделируют хранение информации в смежных ячейках памяти).
Таблица 3
Классификация императивных языков программирования
Переменные |
Подпрограммы |
Проблемы |
Явно глобальные. Только базовые типы данных. |
Слабо представлены |
Необходимость следить за тем, чтобы в одну переменную не попадали разные данные, переприсваивание перед вызовом подпрограмм и после их исполнения. Фиксирование некоторых имен перемен ных, работающих одинаково, например, до сих пор счетчики в циклах обознача ются i, j. |
Появление областей видимости |
Разделяются на |
Возможность применения рекурсии. Появление сложных (структурированных) данных, которые пока невозможно воз вращать как значения функций. |
Хранение подпрограмм |
Унификация подпрограмм |
Активное применение указателей. Возвращение структурированных объек тов подпрограммами, как адресов этих объектов. Появление проблемы «очистки мусора». |
Объединение в единое целое данных и средств их обработки (объекты). |
||
Объектно-ориентированные языки программирования |
Использование программными системами уже имеющихся средств – объектов операционной системы. |
Источник: Кобелев И.А., Иванова Л.В., Чекушина В.Е. Два типа языков программирования // Современные проблемы науки и образования. – 2014. – №4. – С. 56.
В языки программирования первой подгруппы получение информации обеспечивается, в основном, присваиванием. Появляется режим пакетной обработки информации. По сути, получение пакета – обобщение операции присваивания. Для работы этих языков программирования операционная система не нужна. Средства языка достаточны для замены операционной системы [16, с. 24].
Много персональных компьютеров («Ямаха», «БК») выпускались с встроенным языком программирования, таким, как Бейсик или Фокал. К языкам этой группы можно отнести ассемблер, интерпретаторы Basic, Фортран. Язык ассемблера можно и отделить, как имеющий слабую типизацию данных, «машиннозависимый» язык. Фортран тоже занимает особую позицию, но с другой стороны: имеет достаточно серьезную типизацию данных [10, с. 71].
Глобальность переменных приводит к необходимости большого количества переприсваиваний. Перед каждым входом в подпрограмму (GWbasic, Qbasic) выполняется заполнение переменных подпрограммы значениями из переменных основной программы и обратная передача информации после завершения подпрограмм. Недопустимость одноименности переменных в программах и подпрограммах является причиной ошибок в больших программах и затрудняет использование чужих подпрограмм. Во избежание этих трудностей, в языки программирования второй группы, каждой подпрограмме предоставляется своя область определения, в том числе и имен. Появляется иерархия. При необходимости значения переменных берутся из области имен самой подпрограммы, если переменная в подпрограмме не объявлена, ищем в области определения подпрограммы, вызвавшей данную подпрограмму. Оказывается возможным применение рекурсии [24, с. 38].
Примерами языков программирования второй подгруппы являются: QBasic, Паскаль. Во всех рассмотренных языках сохраняется четкое разделение элементов программы на команды и выражения. И при выполнении программ, и при вычислении выражений часто приходится выполнять одинаковые действия, что организуется в виде подпрограмм [14, с. 59].
Подпрограммы – элементы программ получили название «процедуры», фактически, после объявления – отдельные команды программы. Подпрограммы – элементы выражений, называют функциями. С развитием теории алгоритмов, появляется отождествление понятий «алгоритм» и «функция». Как только мы представим исполнение программы вычислением некоторого результата (результатом, кроме данных, может быть и действие), а исходные данные сопоставим с аргументами, разница между процедурами и функциями стирается [14, с. 59].
Представителем языка программирования третьей подгруппы можно считать язык Си.
Представителем языков программирования четвертой подгруппы можно считать языки dBASE, FoxPro. Работа с объектами появляется в очередных версиях языка Паскаль, Си и других [14, с. 60].
Языки группы объектно-ориентированных по сути одно и то же. Традиционными остались формы записи основных алгоритмических структур и объявление переменных, как у предшественников, но других различий почти нет. Basic → VisualBasic, Pascal → Delphi, C → C++→C#. Существенную часть программ на этих языках составляют объекты системных библиотек, одних и тех же [14, с. 60].
Функциональные (аппликативные) языки задают вычисления как вызовы функций [20, с. 67].
Синтаксис функциональной программы выглядит следующим образом: functionri(…function2 (function1 (данные))…). В начале вычислении к исходным данным применяется функция function1, затем к полученному промежуточному результату – function2 и т.д. В последнюю очередь применяется функция functionn. Она возвращает ожидаемый результат [20, с. 67].