Добавлен: 23.05.2023
Просмотров: 295
Скачиваний: 4
СОДЕРЖАНИЕ
ГЛАВА 1 ТЕОРЕТИЧЕСКИЕ АСПЕКТЫ СИСТЕМ И ЯЗЫКОВ ПРОГРАММИРОВАНИЯ
1.1 Определение и назначение языков и систем программирования
1.2 Классификация и история развития языков программирования
1.3 Поколения языков программирования
ГЛАВА 2 СОВРЕМЕННЫЕ МЕТОДЫ ПРОГРАММИРОВАНИЯ
2.1 Модульное, сборочное программирование
2.2 Структурное программирование
2.3 Объектно-ориентированное проектирование (ООП)
2.5 Компонентное программирование
2.6 Аспектно-ориентированное программирование (АОП)
На языке высокого уровня программист задает процедуру (алгоритм) получения результата по известным исходным данным, поэтому они называются процедурными языками программирования. Языки сверхвысокого уровня называются непроцедурными т.к. сама процедура поиска решения встроена в язык (в его интерпретатор). Такие языки используются, например, для решения задач искусственного интеллекта (Lisp, Prolog). К непроцедурным языкам относят и языки запросов систем управления базами данных (QBE, SQL).
Таким образом, в ходе развития языков программирования появилось очень большое количество языков программирования. Существуют различные классификации языков программирования.
Наиболее распространенной классификацией языков программирования является разделение языков программирования на языки программирования низкого и высокого уровня.
Языки программирования
Низкого уровня
(машинно-зависимые)
Высокого уровня (машинно-независимые)
Машинные языки
Языки символического кодирования
Императивные (как делать?)
Декларативные
(что делать?)
Процедурные
на основе подпрограмм
Объектно-ориентированные
Традиционные
основаны на классах
Прототипные
используется объект-прототип
Функциональные
Логические
Рис. 2 Традиционная классификация языков программирования
Другой широко распространенной классификацией языков программирования предполагается разделение языков программирования на процедурные, непроцедурные и объектно-ориентированные.
Языки программирования
Процедурные
Непроцедурные
Объектно-ориентированные
Структурные
Операционные
Функциональные
Логические
Рис. 3 Классификация языков программирования (второй вариант)
В процедурных языках программа явно описывает действия, которые необходимо выполнить, а результат задается только способом получения его при помощи некоторой процедуры, которая представляет собой определенную последовательность действий. В структурных языках одним оператором записываются целые алгоритмические структуры: ветвления, циклы и т.д. В операционных языках для этого используются несколько операций.
Непроцедурное (декларативное) программирование появилось в начале 70-х годов 20 века и предполагает реализацию программы без описания последовательности действий. К непроцедурному программированию относятся функциональные и логические языки.
В функциональных языках программа описывает вычисление некоторой функции. Обычно эта функция задается как композиция других, более простых, те в свою очередь делятся на еще более простые задачи и т.д.
В логических языках программа вообще не описывает действий. Она задает данные и соотношения между ними. Машина перебирает известные и заданные в программе данные и находит ответ на вопрос. Порядок перебора не описывается в программе, а неявно задается самим языком.
На сегодняшний день существует много различных языков программирования. Для решения большинства задач можно использовать любой из них. Опытные программисты знают, какой язык лучше использовать для решения каждой конкретной задачи, так как каждый из языков имеет свои возможности, ориентацию на определённые типы задач, свой способ описания понятий и объектов.
Языки программирования
Степень ориентации на возможности ЭВМ
Степень
детализации алгоритма получения результата
Степень
ориентации на определенный класс задач
Возможность дополнения новыми типами данных и операциями
Машинно-зависимые
Машинно-независимые
Низкого уровня
Высокого уровня
Сверхвысокого уровня
Проблемно- ориентированные
Универсальные
Расширяемые
Нерасширяемые
Возможность управления реальными объектами и процессами
Способ получения результата
Тип решаемых задач
Систем реального времени
Систем условного времени
Процедурные
Непроцедурные
Системного программирования
Прикладного программирования
Рис. 4 Сводная схема классификации языков программирования
Реляционные
Функциональные
Логические
По типу встроенной процедуры поиска решения
1.3 Поколения языков программирования
Языки программирования по своим функциональным возможностям и времени создания принято разделять на несколько поколений (Generation Language, GL). На сегодняшний день выделяют пять поколений языков программирования. Каждое последующее поколение языков по своей функциональной мощности качественно отличается от предыдущего:
Первое поколение языков программирования (1GL): машинно-ориентированные языки программирования с ручным управлением памяти.
Второе поколение языков программирования (2GL): автокоды – языки программирования с мнемоническим представлением команд.
Третье поколение языков программирования (3GL): языки программирования общего назначения, предназначенные для разработки прикладных программ любого типа.
Четвертое поколение языков программирования (4GL): усовершенствованные языки программирования 3GL, разработанные для создания специальных прикладных программ, для управления базами данных.
Пятое поколение языков программирования (5GL): декларативные языки программирования для построения программ с использованием методов искусственного интеллекта, объектно-ориентированные и визуальные принципы программирования.
В первое поколение (1GL) входят языки, созданные в 40 - 50-х годах. Программы на языках поколения 1GL писались в машинных кодах, т. е. каждая компьютерная команда вместе с ее операндами вводилась в ЭВМ в двоичном виде, что требовало огромных усилий по набору цифровых текстов и приводило к множеству трудноуловимых ошибок. К первому поколению языков программирования также относят первый ассемблер (50-е гг.), который позволял задавать названия команд в символическом виде и указывать числа не только в двоичном, но и в десятичном или шестнадцатеричном формате, что существенно облегчало работу программистов. Языки первого поколения продолжают использоваться - программы в машинных кодах для новых микропроцессоров, для которых еще не разработаны компиляторы, поддерживающие требуемый набор команд.
Языки программирования 2GL - конец 50-х - начало 60-х годов - создан символический ассемблер, позволявший писать программы без привязки к конкретным адресам памяти. Было введено понятие переменной. Скорость разработки и эффективность функционирования программ резко возросли. Ассемблеры активно применяются в настоящее время, как правило, для создания программ, максимально использующих возможности аппаратуры - различных драйверов, модулей состыковки с нестандартным оборудованием и т.д.
Вторая половина 60-х гг. – появление языков программирования 3GL. Языки программирования 3GL - универсальные языки программирования высокого уровня, позволяющие решать задачи из любых прикладных областей. Основные качества языков программирования 3GL - качества новых языков - как относительная простота, независимость от конкретного компьютера и возможность использования мощных синтаксических конструкций.
Языки программирования 4GL не имеют единой практической или алгоритмической направленности. В рамках четвертого поколения языков программирования выделяют четыре основных направления эволюционирования языков программирования:
- Непроцедурное программирование – языки программирования искусственного интеллекта;
- Объектно-ориентированное программирование (внедрение в программирование принципов наследования, полиморфизма и инкапсуляции);
- Языки обработки баз данных – языки запросов;
- Языки параллельного программирования для создания программного обеспечения для вычислительных средств параллельной архитектуры (многомашинные, мультипроцессорные среды и др.).
Языки программирования пятого поколения - интенсивно развивающиеся языки искусственного интеллекта, экспертных систем, баз знаний и т.н. «естественные языки», не требующие освоения какого-либо специального синтаксиса.
ГЛАВА 2 СОВРЕМЕННЫЕ МЕТОДЫ ПРОГРАММИРОВАНИЯ
2.1 Модульное, сборочное программирование
Возможности. Одной из ключевых проблем раннего программирования (70-90е годы прошлого столетия) является формирование понятия модуля и использование его в качестве строительных блоков новых ПС. Программирование с помощью модулей прошло длинный путь своего развития от библиотек стандартных подпрограмм общего назначения, библиотек, банков модулей до современных библиотек классов, методов вычисления матриц и т. п.
Модуль - это логически законченная часть программы, выполняющая определенную функцию. Он обладает такими свойствами: завершенность, независимость, самостоятельность, раздельная трансляция, повторное использование и др. Модуль раньше других программных объектов накапливался в библиотеках или Банках программ и модулей как готовых «деталей», из которых собирается ПС и адаптируется к новым условиям среды обработки. Программирование с помощью модулей привело к появлению сборочного программирования (СБ) как метода проектирования ПС снизу вверх из более простых элементов - модулей. Идею сборки модулей по принципу конвейера сформулировал академик В.М.Глушков в 1976 г. С этого момента в Институте кибернетики АН УССР проводились разработки методов автоматизации построения сложных программ из модулей. В том числе система автоматизации программ - АПРОП (1976-1990 гг.), основанная на понятиях: модуль с паспортными характеристиками, интерфейс для стыковки модулей и автоматизированная сборка по принципу фабрики программ.
Базовой концепцией СБ из готовых модулей, записанных в языках программирования - ЯП (Фортран, ПЛ/1, Алгол, Ассемблер), является интерфейс, обеспечивающий связь модулей в этих языках. Идея интерфейса значительно позже получила развитие, когда мировое сообщество пришло к необходимости объединения разных видов программ для разных систем и машин. Были созданы языки описания интерфейсов API (Application Program Interface), IDL (Interface Definition Language) и др. Они и сейчас выступают в качестве главной доминанты взаимодействия компонентов, объектов, аспектов в современных распределенных средах.
Интерфейс двух модулей в СБ определяется как модуль-посредник, в котором описываются операторы вызова модуля, его параметры и их типы. Другой тип интерфейса - это интерфейс пары ЯП, сущность которого заключается в преобразовании несовпадающих структур и типов данных в этих ЯП, которое возникает при вызове процедур в этих ЯП. Это преобразование осуществляется статически с помощью заранее разработанных функций и макросов релевантного преобразования библиотеки интерфейса, которая для указанных ЯП включала более 65 таких элементов.
Созданная концепция интерфейса модулей для класса ЯП положена в основу метода сборки (интеграции) модулей в ПС [5, 23-25]. Метод сборки основывается на математических формализмах определения связей (по данным и по управлению) между разнородными модулями и функциях преобразования данных в модуле-посреднике для каждой пары разноязыковых модулей, в которых содержатся операторы CALL к вызывающему модулю.
Задача обеспечения интерфейса решается путем построении взаимно-однозначного соответствия между множеством фактических параметров V= {v1, v2 ,..., ук} вызывающего модуля и множеством формальных параметров F = { f1, f2 , ..., D1 } вызываемого модуля и их отображения в релевантные типы с помощью алгебраических систем преобразования данных в классе ЯП.
Алгебраическая система Ga4 = <Xa4 , 0a4 > , где Xa4 - множество значений типа данных, а 0a4 - множество операций над этим типом, ставит в соответствие типу Ta4 языка la операции преобразования и изоморфное отображение алгебраических систем Ga4 в Gpd. Построенный класс алгебраических систем S = {G ab , Gac , Gai , Gar , Gaa , Gaz } для типов данных ЯП (b-boolean, c-character, i-integer, r -real, a -array, z-record и др.) учитывает все виды преобразований. Доказан изоморфизм алгебраических систем класса S, кроме значений Ха4 и Хрч для типов Та4 и Трч из-за отсутствия соответствия.