Файл: Классификация языков программирования. Критерии выбора среды и языка разработки программ (Языки программирования).pdf
Добавлен: 31.03.2023
Просмотров: 106
Скачиваний: 1
Функциональное программирование не использует концепцию памяти как хранилища значений переменных. Операторы присваивания отсутствуют, вследствие чего переменные обозначают не области памяти, а объекты программы, что полностью соответствует понятию переменной в математике. В принципе, можно составлять программы и вообще без переменных. Кроме того, нет существенных различий между константами и функциями, то есть между программами и данными. В результате этого функция может быть значением вызова другой функции и может быть элементом структурированного объекта. Число аргументов при вызове функции не обязательно должно совпадать с числом параметров, указанных при ее описании. Перечисленные свойства характеризуют аппликативные языки как языки программирования очень высокого уровня. [5]
Центральным понятием в логическом программировании является отношение. Программа представляет собой совокупность определений отношений между объектами (в терминах условий или ограничений) и цели (запроса). Процесс выполнения программы трактуется как процесс общезначимости логической формулы, построенной из программы по правилам, установленным семантикой используемого языка. Результат вычисления является побочным продуктом этого процесса. В реляционном программировании нужно только специфицировать факты, на которых алгоритм основывается, а не определять последовательность шагов, которые требуется выполнить. Это свидетельствует о декларативности языка логического программирования. [4]
Языки логического программирования характеризуются:
- высоким уровнем;
- строгой ориентацией на символьные вычисления;
- возможностью инверсных вычислений, то есть переменные в процедурах не делятся на входные и выходные;
- возможной логической неполнотой, поскольку зачастую невозможно выразить в программе определенные логические соотношения, а также невозможно получить из программы все выводы правильные. [13]
Логические программы, в принципе, имеют небольшое быстродействие, так как вычисления осуществляются методом проб и ошибок, поиском с возвратами к предыдущим шагам.
В основе объектно-ориентированного стиля программирования лежит понятие объекта, а суть его выражается формулой: «объект - данные + процедуры». Каждый объект интегрирует в себе некоторую структуру данных и доступные только ему процедуры обработки этих данных, называемые методами. Объединение данных и процедур в одном объекте называется инкапсуляцией и присуще объектно-ориентированному программированию.
Для описания объектов служат классы. Класс определяет свойства и методы объекта, принадлежащего этому классу. Соответственно, любой объект можно определить как экземпляр класса.
Программирование рассматриваемого стиля заключается в выборе имеющихся или создании новых объектов и организации взаимодействия между ними. При создании новых объектов свойства объектов могут добавляться или наследоваться от объектов-предков. В процессе работы с объектами допускается полиморфизм – возможность использования методов с одинаковыми именами для обработки данных разных типов. [12, 15]
В последнее время многие программы, в особенности объектно-ориентированные, реализуются как системы визуального программирования. Отличительной особенностью таких систем является мощная среда разработки программ из готовых «строительных блоков», позволяющая создать интерфейсную часть программного продукта в диалоговом режиме, практически без кодирования программных операций. [7]
Выводы к Главе 1
Ознакомившись с историей развития и классификацией языков и стилей программирования, можно сделать следующие выводы:
- Информационные технологии актуальны в современном мире, быстро развиваются, этот прогресс способствует появлению новых программных языков. На данный момент существует 5 поколений языков программирования.
- Современное поколение языков программирования ориентировано на реализацию более сложных команд, простату задания программного кода.
Глава 2. Критерии выбора среды и языка разработки программ
2.1 Этапы разработки программ
Разработка программы состоит из нескольких этапов:
1. Постановка задачи:
- формулировка и анализ физической задачи;
- составление математической модели
- составление алгоритма задачи.
2. Создание программы:
- составление текста программы;
- ввод текста программы в компьютер;
- синтаксическая отладка программы;
- тестирование и семантическая отладка.
3. Документирование программы.
4. Запуск готовой программы и анализ полученных результатов.
Первый этап – математический, в ходе которого детально разбирается задача, для упрощения написания программы. В ходе первого этапа формулируется задача, далее при анализе задачи, формулировка может уточняться. Анализ задачи заключается в подробном просмотре задачи с определением и выявлением входной и выходной информации. На данном этапе программист имеет понятие с какими проблемами можно столкнуться в ходе дальнейшей работы над программой. [3, 7]
В ходе первого этапа также составляется математическая модель – система уравнений и концепций, используемых для описания и прогнозирования поведения объекта. Математическая модель является математическим представлением реальности, приближенно отражающее сформулированную задачу. Она позволяет осуществить предварительный выбор оптимальных вариантов решений исходя из определенных критериев. [2]
Далее необходимо составить алгоритм задачи. Алгоритмом принято считать описание последовательных действий, строгое исполнение которых приводит к решению поставленной задачи за конечное число шагов. Он должен быть представлен в форме, понятной объектам, которые его разрабатывать и выполнять алгоритмические действия.
Существует несколько видов алгоритмов, они подробно представлены на рисунке 1. [6]
Рисунок 1. – Виды алгоритмов.
Свойства алгоритмов подробно рассмотрены в таблице [7]:
Характеристика свойств алгоритмов
№ |
Свойство алгоритма |
Характеристика |
1 |
дискретность |
алгоритм должен состоять из конкретных действий, следующих в определенном порядке |
2 |
детерминированность |
любое действие должно быть строго и недвусмысленно определено в каждом случае |
3 |
конечность |
каждое действие и алгоритм в целом должны иметь возможность завершения |
4 |
массовость |
один и тот же алгоритм можно использовать с разными исходными данными |
5 |
результативность |
отсутствие ошибок, алгоритм должен приводить к правильному результату для всех допустимых входных значениях |
Второй этап создания программы заключается в разработке программного обеспечения [4].
Сначала, записывают алгоритм задачи при помощи одного из языков программирования, эта задача требует повышенной концентрации внимания. Затем происходит отладка программы – в ходе которой исправляются все допущенные ошибки. Наиболее распространенными являются синтаксические ошибки в тексте программы. Синтаксическая отладка позволяет определить расположение синтаксической ошибки в тексте и её характер. Оператор исправляет ошибку и повторяет трансляцию до тех пор, пока не будут исправлены все синтаксические ошибки. Необходимо обращать внимание точному синтаксису используемых вами функций, объектов, методов и свойств. [7]
Далее, после отладки, наступает процесс тестирования - динамического контроля программы. Тестирование – процесс деструктивный и заключается в проверке правильности программы при её выполнении на компьютере. Разработчики относятся к процессу тестирования творчески. Целью проведения тестирования является обнаружение в ней ошибок. При чем тестирование считается удачным и положительным, в случае обнаружения ошибок, и наоборот неудачным, если ошибку не удалось выявить.
Часто стараются избежать тестирования программы её автором, а разработчики не тестируют программное обеспечение единолично, обращаясь к организациям, специализирующимся на тестировании программных средств. [12]
Основные принципы организации тестирования отражены на рисунке 2.
Рисунок 2. – Принципы тестирования.
При структурном тестировании наиболее слабым из критериев является хотя бы однократное выполнение каждого выполнения программы, а более сильный критерий – минимум однократное прохождение каждой ветви алгоритма, или C1. [5]
Так же распространено использование подбора тестов, обеспечивающих переход в программе, пропуская при этом критерий С1. К примеру, в программе, написанной на языке Pascal, при использовании конструкции цикла WHILE x AND y DO… , применение критерия покрытия условий требует проверки обоих вариантов выхода из цикла: NOT x и NOT y.
Существуют конструкции, требующие по критерию покрытия условий два теста, например IF A AND B THEN… , A=true, B=false и A=false, B=true, при которых может не выполняться оператор, расположенный в then – ветви оператора if. Практически единственным средством, предоставляемым современными системами программирования, является возможность определения частоты выполнения различных операторов программы. Но с помощью этого инструмента поддержки тестирования можно проверить выполнение только слабейшего из критериев полноты - покрытие всех операторов. Правда, с помощью этого же инструмента можно проверить и выполнение критерия С1. Но для этого предварительно текст программы должен быть преобразован таким образом, чтобы все конструкции условного выбора (IF, CASE или SWITCH) содержали ветви ELSE или DEFAULT, хотя бы и пустые. [5]
На данный момент существует два метода современного тестирования модулей: пошаговое и монолитное тестирование. Если по отдельности тестируются все модули программного комплекса, а затем объединяются в рабочую программу для комплексного теста, то такое тестирование называется монолитным. Если каждый модуль для своего тестирования подключается к набору уже проверенных модулей – это пошаговое тестирование. [11, 21]
Для автономного монолитного тестирования требуется модуль – драйвер, имитирующий вызов тестируемого модуля и несколько модулей-заглушек, имитирующих работу модулей, вызываемых из тестируемого. При пошаговом тестировании модули проверяются изолированно, поэтому есть необходимость или только в драйверах, или только в заглушках.
При сравнении пошагового и монолитного тестирования можно отметить следующие преимущества первого подхода:
- меньшая трудоемкость (при монолитном тестировании требуются 5 драйверов и 5 заглушек; при пошаговом тестировании требуются или только 5 драйверов - если модули подключаются “снизу вверх”, - или только 5 заглушек - если модули подключаются “сверху вниз”);
- более раннее обнаружение ошибок в интерфейсах между модулями (их сборка начинается раньше, чем при монолитном тестировании);
- легче отладка, то есть локализация ошибок (они в основном связаны с последним из подключенных модулей);
- более совершенные результаты тестирования (более тщательная проверка совместного использования модулей).
При использовании пошагового тестирования возможны две стратегии подключения модулей: нисходящая и восходящая. [14]
Во время нисходящего тестирования начинают с главного модуля программы, а затем выбирается следующий подключаемый модуль из числа уже протестированных модулей.
Главной проблемой нисходящего тестирования считается создание заглушек. Так же при нисходящем тестировании могут возникнуть проблемы с созданием формы представления тестов в программе, т.к. главный модуль получает входные данные через специальные модули ввода, которые изначально заменяют заглушками. [20]
Для того, чтобы передавать различные тесты в главный модуль, необходимо записать эти тесты в файл во внешней памяти и с помощью заглушки считывать их, или иметь несколько разных заглушек.
Так как после тестирования главного модуля процесс проверки может продолжаться по-разному, стараются придерживаться правил:
- в первую очередь к тестированию должны подключаться модули, содержащие операции ввода-вывода;
- критические (т.е. наиболее важные) для программы модули также должны тестироваться в первую очередь.
Основными достоинствами нисходящего тестирования являются: получение на ранней стадии тестирования работающий вариант разрабатываемой программы и быстрое выявление ошибок, связанных с организацией взаимодействия с пользователем. [1]
При восходящем тестировании проверку программы начинают с терминальных модулей, которые не вызывают никаких других модулей программы. Это тестирование является противоположным нисходящему, и все достоинства одного метода – это недостатки другого. В данном случае нет проблемы выбора следующего подключаемого модуля, так как учитывают лишь то, чтобы он вызывал только протестированные модули. Разработка драйвера в большинстве случаев проще, так как в отличие от заглушек драйверы не должны иметь несколько версий.