Файл: Классификация языков программирования. Критерии выбора среды и языка разработки программ (Языки программирования).pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 31.03.2023

Просмотров: 110

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Функциональное программирование не использует концепцию памяти как хранилища значений переменных. Операторы присваивания отсутствуют, вследствие чего переменные обозначают не области памяти, а объекты программы, что полностью соответствует понятию переменной в математике. В принципе, можно составлять программы и вообще без переменных. Кроме того, нет существенных различий между константами и функциями, то есть между программами и данными. В результате этого функция может быть значением вызова другой функции и может быть элементом структурированного объекта. Число аргументов при вызове функции не обязательно должно совпадать с числом параметров, указанных при ее описании. Перечисленные свойства характеризуют аппликативные языки как языки программирования очень высокого уровня. [5]

Центральным понятием в логическом программировании является отношение. Программа представляет собой совокупность определений отношений между объектами (в терминах условий или ограничений) и цели (запроса). Процесс выполнения программы трактуется как процесс общезначимости логической формулы, построенной из программы по правилам, установленным семантикой используемого языка. Результат вычисления является побочным продуктом этого процесса. В реляционном программировании нужно только специфицировать факты, на которых алгоритм основывается, а не определять последовательность шагов, которые требуется выполнить. Это свидетельствует о декларативности языка логического программирования. [4]

Языки логического программирования характеризуются:

- высоким уровнем;

- строгой ориентацией на символьные вычисления;

- возможностью инверсных вычислений, то есть переменные в процедурах не делятся на входные и выходные;

- возможной логической неполнотой, поскольку зачастую невозможно выразить в программе определенные логические соотношения, а также невозможно получить из программы все выводы правильные. [13]

Логические программы, в принципе, имеют небольшое быстродействие, так как вычисления осуществляются методом проб и ошибок, поиском с возвратами к предыдущим шагам.

В основе объектно-ориентированного стиля программирования лежит понятие объекта, а суть его выражается формулой: «объект - данные + процедуры». Каждый объект интегрирует в себе некоторую структуру данных и доступные только ему процедуры обработки этих данных, называемые методами. Объединение данных и процедур в одном объекте называется инкапсуляцией и присуще объектно-ориентированному программированию.


Для описания объектов служат классы. Класс определяет свойства и методы объекта, принадлежащего этому классу. Соответственно, любой объект можно определить как экземпляр класса.

Программирование рассматриваемого стиля заключается в выборе имеющихся или создании новых объектов и организации взаимодействия между ними. При создании новых объектов свойства объектов могут добавляться или наследоваться от объектов-предков. В процессе работы с объектами допускается полиморфизм – возможность использования методов с одинаковыми именами для обработки данных разных типов. [12, 15]

В последнее время многие программы, в особенности объектно-ориентированные, реализуются как системы визуального программирования. Отличительной особенностью таких систем является мощная среда разработки программ из готовых «строительных блоков», позволяющая создать интерфейсную часть программного продукта в диалоговом режиме, практически без кодирования программных операций. [7]

Выводы к Главе 1

Ознакомившись с историей развития и классификацией языков и стилей программирования, можно сделать следующие выводы:

  1. Информационные технологии актуальны в современном мире, быстро развиваются, этот прогресс способствует появлению новых программных языков. На данный момент существует 5 поколений языков программирования.
  2. Современное поколение языков программирования ориентировано на реализацию более сложных команд, простату задания программного кода.

Глава 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]


Для автономного монолитного тестирования требуется модуль – драйвер, имитирующий вызов тестируемого модуля и несколько модулей-заглушек, имитирующих работу модулей, вызываемых из тестируемого. При пошаговом тестировании модули проверяются изолированно, поэтому есть необходимость или только в драйверах, или только в заглушках.

При сравнении пошагового и монолитного тестирования можно отметить следующие преимущества первого подхода:

  1. меньшая трудоемкость (при монолитном тестировании требуются 5 драйверов и 5 заглушек; при пошаговом тестировании требуются или только 5 драйверов - если модули подключаются “снизу вверх”, - или только 5 заглушек - если модули подключаются “сверху вниз”);
  2. более раннее обнаружение ошибок в интерфейсах между модулями (их сборка начинается раньше, чем при монолитном тестировании);
  3. легче отладка, то есть локализация ошибок (они в основном связаны с последним из подключенных модулей);
  4. более совершенные результаты тестирования (более тщательная проверка совместного использования модулей).

При использовании пошагового тестирования возможны две стратегии подключения модулей: нисходящая и восходящая. [14]

Во время нисходящего тестирования начинают с главного модуля программы, а затем выбирается следующий подключаемый модуль из числа уже протестированных модулей.

Главной проблемой нисходящего тестирования считается создание заглушек. Так же при нисходящем тестировании могут возникнуть проблемы с созданием формы представления тестов в программе, т.к. главный модуль получает входные данные через специальные модули ввода, которые изначально заменяют заглушками. [20]

Для того, чтобы передавать различные тесты в главный модуль, необходимо записать эти тесты в файл во внешней памяти и с помощью заглушки считывать их, или иметь несколько разных заглушек.

Так как после тестирования главного модуля процесс проверки может продолжаться по-разному, стараются придерживаться правил:

  1. в первую очередь к тестированию должны подключаться модули, содержащие операции ввода-вывода;
  2. критические (т.е. наиболее важные) для программы модули также должны тестироваться в первую очередь.

Основными достоинствами нисходящего тестирования являются: получение на ранней стадии тестирования работающий вариант разрабатываемой программы и быстрое выявление ошибок, связанных с организацией взаимодействия с пользователем. [1]

При восходящем тестировании проверку программы начинают с терминальных модулей, которые не вызывают никаких других модулей программы. Это тестирование является противоположным нисходящему, и все достоинства одного метода – это недостатки другого. В данном случае нет проблемы выбора следующего подключаемого модуля, так как учитывают лишь то, чтобы он вызывал только протестированные модули. Разработка драйвера в большинстве случаев проще, так как в отличие от заглушек драйверы не должны иметь несколько версий.