Файл: Классификация языков программирования высокого уровня и их характеристика.pdf
Добавлен: 24.04.2023
Просмотров: 233
Скачиваний: 2
Введение
Причиной выбора данной темы: «Классификация языков программирования высокого уровня», было узнать языки программирования, определить их классификацию по уровням. Разные авторы книг разбивают языки на три уровня (машинные, машинно-ориентированные и машинно-независимые языки), либо на два уровня (языки программирования низкого уровня, языки программирования высокого уровня). В таком случае деления языков программирования на три уровня, которые будут низшим уровнем считаться машинный код – набор команд, которые выполняются конкретным процессором и разработанны специально для него. Обычно является последовательностью шестнадцатеричных символов. Средний уровень будет являться машинно-ориентированные языки, это те языки, которые призванные управлять непосредственно командами процессора, и более доступно человеку для восприятия языка. Примером являются языки ассемблера. Язык ассемблера, который по сути, представляет каждую команду машинного кода с помощью удобных для восприятия человеком символических команд – мнемокодов. Как правило, этот язык ассемблера использует особенности конкретного семейства процессоров. Высшим же уровнем будут считаться машинно-независимые языки. Они разработаны для удобства восприятия, которых будут быстро их понимать и легко работать с ними. Характерная черта этих языков программирования – абстракция, которая есть введении смысловых конструкций, кратко описывающих данные и операции над ними, описания которых в машинно- ориентированных языках очень длинны и сложны для понимания. Также они были призваны обеспечить платформенную независимость сути алгоритмов. С их появлением зависимость от платформы перекладывается на трансляторы, «переводящие» текст, написанный на языке высокого уровня, в элементарные машинные команды. Примерами языков программирования высокого уровня являются C++, C#, PHP, Perl, Java и многие другие. В современной классификации языков программирования по уровням всё чаще используют деление на два уровня: языки высокого и низкого уровней.
Глава 1. Языки Программирования и их развития
Исходное определение языка программирования
Язык программирования – это знаковая система, которая предназначена для планирования поведения компьютера. Знаковая система – это совокупность соглашений, которые определяют набор знаковых ситуаций. Знаковая ситуация – первичное понятие семиотики, ее элементами есть знак и денотат (рис.1.1).
Знак – это обозначение или имя, денотат – значение, смысл.
Правила, которые определяют структуру допустимых знаков, их называют синтаксисом языка. Правила, которые определяют денотаты, соответствуют допустимым знакам, называют семантикой языка. Опираясь на введенные понятия, можно предложить модифицированную формулировку языка программирования.
Язык программирования — это правила образования знаков (синтаксис) и согласованные с ними правила образования денотатов (семантика).
В языке программирования знаки — это элементы программ, а денотаты — характеристики поведения исполнителя (компьютера).
Практическое определение языка программирования
Язык программирования — это средство общения между человеком (пользователем) и компьютером.
С помощью языка программирования формируются сообщения для компьютера. Эти сообщения должны быть понятны компьютеру. Все возможные ошибки разделяют на синтаксические, семантические и прагматические.
Синтаксические ошибки могут возникать, если автор сообщения подразумевает одну структуру сообщения, а получатель — другую. Устраняются очень легко. В языке программирования таких ошибок не бывает, так как их создатели используют принцип синтаксической однозначности (правильный текст имеет единственную допустимую структуру).
Семантические ошибки связаны с искажением смысла элементов сообщения, а прагматические ошибки — с искажением цели (назначения) элемента или сообщения.
Прагматические ошибки — самые трудные. Их примеры: часы хорошие-плохие, для выяснение смысла программы без знания ее назначения.
Для исключения ошибок необходимо, чтобы отправитель и адресат пользовались:
одинаковыми правилами разложения сообщения на составляющие (предмет синтаксиса);
согласованными правилами, придающие сообщению смысл (предмет семантики);
согласованными целевыми установками (предмет прагматики).
Технологическое определение языка программирования
Язык программирования — инструмент для производства программных услуг.
Программирование нацелено на обслуживание пользователя. Принцип хорошего обслуживания: «Клиент всегда прав». Это означает, то что программы должны быть дружественными к пользователю.
Программы должны быть:
надежными (содержать мало ошибок);
устойчивыми (сохранять работоспособность в неблагоприятных условиях эксплуатации, ограниченности ресурсов, перегрузок, ошибок пользователя, сбоев и отказов аппаратуры);
заботливыми (должны уметь объяснять свои действия и ошибки пользователя).
Известно, что создание программ — дорогое занятие. С современной точки зрения, аппаратура компьютера по относительной стоимости сравнима с упаковкой, в которую «заворачивается» программное изделие. Почему? Причина — сложность программирования. Известны два источника сложности [3, 13].
Семантический разрыв — разрыв между уровнем простых операций компьютера и уровнем потенциально возможных услуг. Компьютер — очень быстрый исполнитель операций. Отсюда желание программировать его на оказание сложных услуг (с помощью очень сложных программ). В свою очередь возможности человека при работе со связанными объектами ограничены числом ИНГВЕ = 7 ± 2. Выход из положения — создавать для определенного класса услуг подходящий язык программирования (со сложными операциями) и программировать на таком языке.
Незнание компьютером реального мира может иногда становиться фатальной ошибкой. Поэтому компьютер не может контролировать соответствие указаний программиста поставленным задачам (целям), ради достижения которых они сформированы.
Примеры крупных программных ошибок:
Космический аппарат «Маринер-1» (22 июля 1962 г.). Цель — Венера. Разрушен через 294,5 секунды после старта.
Космический аппарат «Маринер-2» (27 августа 1962 г). Источник ошибки — пробел и отсутствие запятой в Фортран-программе управления (оператор цикла DO).
Ракета-носитель «Ариан-5» (4 июня 1996 г.). Уничтожена при старте. Цена ошибки — $500 000 000.
Массовые отключения электричества на северо-востоке Северной Америки (14 августа 2003 г.). Ценой — 10 миллиардов долларов.
Средство борьбы с семантическим разрывом — аппарат абстракции-конкретизации языка. Этот аппарат — основа ориентации на проблему. Например, в языке Fortran средство абстракции — подпрограмма, а соответствующее средство конкретизации — послания к ней с фактическими параметрами.
Эволюция развития языков программирования
В развитии инструментального программного обеспечения рассматривают пять поколений языков программирования. Языки программирования как средство общения человека с ЭВМ от поколения к поколению улучшали свои характеристики, которые становились всё более доступными в освоении непрофессионалам.
Первые три поколения языков программирования характеризовались более трудным набором зарезервированных слов и синтаксисом. Языки четвертого поколения все ещё требуют соблюдения определенного синтаксиса при написании программ, но он горазда легче для освоения. Естественные языки, которые разрабатывают в настоящее время, составят пятое поколение и позволят определять необходимые процедуры обработки информации, используя предложения языка, очень близкого к естественному и не требующего соблюдения особого синтаксиса.
Языки первого поколения представляли собой набор машинных команд в двоичном (бинарном) или восьмеричном формате, определяющей архитектурой конкретной ЭВМ. Каждый тип ЭВМ имел свой язык, программы на котором были пригодны только для данного типа ЭВМ. От программиста при этом требовалось хорошее знание не только машинного языка, но и архитектуры ЭВМ.
Рассмотрим проблему программирования в абсолютных (машинных) адресах.
Вычислительная машина (система), которая независимо от типа и поколения, состоит из двух основных типов устройств:
- центральное устройство (ЦУ), которое включает в себя центральный процессор (ЦП) и оперативную память (ОП).
- периферийные (внешние) устройства (ВУ).
Невзирая на то, что постоянно идут исследования в направлении разработки новых принципов структур и архитектур ЭВМ, тормозят в большинстве современных машин реализованы так называемые принципы Фон Неймана:
- ОП организована как совокупность машинных слов (МС) фиксированной длины или разрядности. Например, ранние ПЭВМ имели разрядность 8, затем появились 16-разрядные, а в последнее время 32- и 64-разрядные машины. В свое время существовали также 45-разрядные (М-20, М-220), 35-разрядные (Минск-22, Минск-32) и другие компьютеры.
- ОП образует единое адресное пространство, адреса МС возрастают от младших к старшим;
- в ОП размещаются как данные, так и программы, причем в области данных одно слово, как правило, оно соответствует одному числу, а в области программы – одной команде;
- команды выполняются в конкретной последовательности, если/пока не встретится команда управления, в итоге которой естественная последовательность нарушится;
-ЦП может хаотично обращаться к любым адресам в ОП для выборки и/или записи в МС чисел или команд.
Общий порядок функционирования некоторого абстрактного (упрощенного) ЦУ следующий:
° извлечение из ОП следующей команды. Характерная команда содержит: код операции (КОП), действия (сложение, вычитание чисел; сравнение строк; передача управления, обращение к ВУ и пр.); адреса операндов А1, А2 и т.д., участвующих в выполнении команды (чисел, строк, других команд программы);
° расшифровка КОП;
° выборка адресов А1, А2 и пр. в регистры адреса;
° выполнение операции (арифметической, логической и пр.) и
помещение результата в регистр результата;
° запись результата по одному из адресов (если необходимо);
° переход к следующей команде.
Таким образом, когда программирование в машинных адресах требует знания системы команд конкретной ЭВМ и их адресности. Притом реализация даже довольно простых вычислений требует разложения их на несложные операции, что значительно увеличивает общий объём программы и затрудняет ее чтение и отладку.
В качестве примера рассмотрим последовательность реализации вычисления по формуле у = (a + b)2 – c/d.
Ряд последовательности машинных операций, выполнение их приведет к нужному результату, в данном случае следующий:
1. r1 =a + b; — операция сложения
2. r2 = r1 * r1; — операция умножения
3. r3 = c/d; — операция деления
4. у = r2 — r3; — операция вычитания
5. Стоп. — завершение обработки
Тут количество переменных, которые необходимо для хранения промежуточных результатов, связано с адресностью системы команд и с тем, самым разрешено или нет в процессе вычислений изменить значения исходных данных.
Некоторые из приведенных выше операций могут быль в свою очередь разложены на несколько операций. Это обусловливается системой команд (например, если операция сложения может складывать только величины, находящиеся в специально отведенных для этой цели регистрах, то потребуется дополнительно применять операции пересылки данных в эти регистры).
Адресность команд ЦП связана с разрядностью ОП. Типичная команда состоит из фиксированной части (КОП) и адресной части, в указанных адресах операндов. Увеличение разрядности позволяет увеличить адресность команды и длину адреса (т.е. объём памяти, доступной данной команде). Увеличение адресности, в свою очередь, это приводит к повышению быстродействия обработки (за счет снижения числа требуемых команд). С увеличением разрядности увеличивается и диапазон значений которые обрабатывают числа и количества информации, извлекаемой за один такт работы машины из ОП, или записываемой в ОП. Ранние ПЭВМ имели разрядность 8, объем ОП б4 Кбайт, последние модели имеют разрядность 32 — б4 и объемом ОП 64-512 Мбайт.
Второе поколение языков программирования характеризуется созданием языка ассемблерного типа (ассемблеров, макроассемблеров), которые позволяют вместо двоичных и других форматов машинных команд использовать их мнемонические символьные обозначения (имена), являющиеся большим шагом вперед, ассемблерные языки все еще оставались машинно-зависимыми, а программист все также должен быть хорошо знаком с организацией и функционированием аппаратной среды определенного типа ЭВМ. При этом ассемблерные программы все так же затруднительны для чтения, трудоемки при отладке и требуют очень больших усилий для переноса на другие типы ЭВМ. Конечно и сейчас ассемблерные языки используются при необходимости разработки высокоэффективного программного обеспечения (минимального по объему и с максимальной производительностью).