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

Вид материалаПрограмма

Содержание


Декларативная программа
Директивная программа
Декларативное программирование
Функциональная программа
Пример На входе
Директивное программирование
Структурное программирование
Объектно-ориентированное программирование
Point = object
Procedure Point.Show
NewPoint = object(point)
Визуально-ориентированное программирование
Уровни языков программирования
Этапы разработки программы
анализ требований к программе; постановка задачи; проектирование программы; программирование
Постановка задачи в программировании - точная формулировка решения задачи на компьютере с описанием входной и выходной информаци
Отладка программы
Тестирование программы
Виды тестирования
Ручное тестирование
...
Полное содержание
Подобный материал:

ПАРАДИГМЫ ПРОГРАММИРОВАНИЯ. ЯЗЫКИ ПРОГРАММИРОВАНИЯ


Парадигма программирования - это некоторый цельный набор идей и рекомендаций, определяющих стиль написания программ. Парадигма программирования представляет (и определяет) то, как программист видит выполнение программы. Например, в объектно-ориентированном программировании программист рассматривает программу как набор взаимодействующих объектов, тогда как в функциональном программировании программа представляется в виде цепочки вычисления функций.

Язык программирования (Programming Language) - это алфавит, грамматика и синтаксис, используемые для построения набора инструкций, заставляющих компьютер выполнять те или иные действия.

Можно выделить две большие группы языков программирования, отражающих разные парадигмы программирования:
  • директивные (directive), называемые также процедурными (procedural) или императивными (imperative),
  • декларативные (declarative) языки.

Главное различие между этими группами языков заключается в следующем: декларативная программа заявляет (декларирует), что должно быть достигнуто в качестве цели, а директивная предписывает, как ее достичь.

Поясним это на следующем примере. Предположим, вам надо пройти в городе из пункта А в пункт Б. ^ Декларативная программа - это план города, в котором указаны оба пункта, плюс правила уличного движения. Руководствуясь этими правилами и планом города, курьер сам найдет путь от пункта А к пункту Б.

^ Директивная программа - это список команд примерно такого рода: от пункта А по ул. Садовой на север до площади Славы, оттуда по ул. Пушкина два квартала, потом повернуть направо и идти до Театрального переулка, по этому переулку налево по правой стороне до дома 20, который и есть пункт Б.

В директивной программе действия задаются явными командами, подготовленными ее составителем. Исполнитель же (компьютер) просто им следует. Хотя команды в различных языках директивного программирования и выглядят по-разному, все они сводятся либо к присваиванию какой-нибудь переменной некоторого значения, либо к выбору следующей команды, которая должна будет выполняться. Присваиванию может предшествовать выполнение ряда арифметических и иных операций, вычисляющих требуемое значение, а команды выбора реализуются в виде условных операторов и операторов повторения (циклов).

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

На практике языки программирования не являются чисто императивными или декларативными, а содержат в себе черты языков различных парадигм. На процедурном языке часто можно написать функциональную программу или ее часть и наоборот.
^

Декларативное программирование


Наиболее существенными классами декларативных языков являются функциональные (functional) языки, например, Lisp (Лисп), и логические (logic) языки, например, Prolog (Пролог).

^ Функциональная программа состоит из совокупности определений функций, которые в свою очередь представляют собой вызовы других функций и предложений, управляющих последовательностью вызовов. При этом функции часто либо прямо, либо опосредованно вызывают сами себя (рекурсия). Каждая функция возвращает некоторое значение в вызвавшую его функцию, вычисление которой после этого продолжается; этот процесс повторяется до тех пор, пока начавшая процесс вычислений функция не вернет конечный результат пользователю.

"Чистое" функциональное программирование не содержит оператора присваивания, в нем вычисление любой функции не приводит ни к каким побочным эффектам, отличным от собственно вычисления ее значения. Отсутствие оператора присваивания делает переменные, используемые в функциональных языках программирования, очень похожими на переменные в математике - получив однажды свои значения, они больше никогда их не меняют.

Еще одной реализацией декларативного стиля является логическое программирование, основанное на логике предикатов. В логическом программировании основное внимание уделяется описанию структуры прикладной задачи, а не выработке предписаний компьютеру, что ему следует делать. Программа рассматривается как набор логических фактов и правил вывода, а выполнение программы состоит в вычислении истинности (попытке доказательства) некоторого утверждения. Prolog (от французского PROgrammation LOGique, по-русски - Пролог) - это наиболее известный язык логического программирования. Этот язык (наряду с функциональным языком Lisp) часто называют языком искусственного интеллекта - с его помощью решаются задачи создания экспертных систем и систем обработки естественных языков.

^ Пример

На входе программы:
  • все люди смертны (отношение: если человек, то он смертен)
  • Сократ – человек.

На выходе: Сократ смертен.
^

Директивное программирование


К директивным языкам относятся такие классические языки программирования, как Fortran, Basic, Pascal, C.

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

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

Те из директивных языков программирования, которые не обладают хорошо развитымым механизмом организации подпрограмм, принято называть операциональными языками (например, первые версии языка BASIC).

Одним из направлений процедурного программирования является структурное программирование.


^ Структурное программирование - методология разработки программного обеспечения, предложенная в 70-х года XX века.

В соответствии с данной методологией любая программа представляет собой структуру, построенную из трёх типов базовых конструкций:
  • последовательного исполнение (следование) — однократное выполнение операций в том порядке, в котором они записаны в тексте программы;
  • ветвление — однократное выполнение одной из двух или более операций, в зависимости от выполнения некоторого заданного условия;
  • цикл — многократное исполнение одной и той же операции до тех пор, пока выполняется некоторое заданное условие (условие продолжения цикла.

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

НЕДОПУСТИМ оператор безусловной передачи управления в любую точку программы.

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

Разработка программы ведётся пошагово, методом "сверху вниз". Сначала пишется текст основной программы, в котором вместо каждого связного логического фрагмента текста вставляется вызов подпрограммы, которая будет выполнять этот фрагмент. Вместо настоящих, работающих подпрограмм, в программу вставляются "заглушки", которые ничего не делают. Полученная программа проверяется и отлаживается. После того, как программист убедится, что подпрограммы вызываются в правильной последовательности (то есть общая структура программы верна), подпрограммы - "заглушки" последовательно заменяются на реально работающие, причём разработка каждой подпрограммы ведётся тем же методом, что и основной программы. Разработка заканчивается тогда, когда не останется ни одной "заглушки", которая не была бы удалена. Такая последовательность гарантирует, что на каждом этапе разработки программист одновременно имеет дело с обозримым и понятным ему множеством фрагментов и может быть уверен, что общая структура всех более высоких уровней программы верна.

Методология структурного программирования появилась как следствие возрастания сложности решаемых на компьютерах задач и соответственного усложнения программного обеспечения. В 70-е годы XX века объёмы и сложность программ достигли такого уровня, что "интуитивная" разработка программ, которая была нормой в более раннее время, перестала удовлетворять потребностям практики.

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

Следование принципам структурного программирования сделало тексты программ, даже довольно крупных, нормально читаемыми. Серьёзно облегчилось понимание программ, появилась возможность разработки программ в нормальном промышленном режиме, когда программу может без особых затруднений понять не только её автор, но и другие программисты.
^

Объектно-ориентированное программирование


Что главное в программе: алгоритм или данные, которые он обрабатывает? Вначале, когда компьютер умел работать только с числами, главным был алгоритм. Однако, по мере роста абстрактности данных (символы, строки, массивы, множества, звук, изображение) ошибки стали возникать из-за того, что правильный алгоритм применяли к неправильным (несоответствующим) данным. Стало ясно, что данные должны как-то храниться вместе с правильными алгоритмами для их обработки. Так возникло понятие объекта.

Объект – это комбинация из данных и процедур для работы с этими данными. Данные в этом случае называются полями или свойствами, а процедуры – методами объекта. Метод является процедурой или функцией, объявленной внутри объекта и жестко ограниченной этим объектом.

Пример

Допустим, что объект – светящаяся точка на экране, которую можно перемещать, а также включать и выключать. Описание в Паскаль - программе может быть таким:

Var
^

Point = object


X,Y; integer; {свойства}

Procedure Show; {метод «показать»}

Procedure Hide; {метод «переместить»}

End;

Методы, входящие в объект, должны быть описаны. Например,

^ Procedure Point.Show;

begin

операторы

end;

Обращение к объекту:

Point.Show;

Point.X := 100;

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

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

Пример: Например, нужно иметь возможность изменять размер точки на экране. Создадим объект NewPoint, являющийся потомком объекта Point:

^ NewPoint = object(point)

Procedure Incr; {метод «увеличить размер»}

Procedure Decr; {метод «уменьшить размер»}

End;

Поскольку NewPoint является потомком объекта Point, несмотря на то, что у него самого описано только два метода, к нему можно обращаться, используя как собственные, так и родительские методы:

NewPoint.Show;

NewPoint.Hide;

NewPoint.Incr;

NewPoint.Decr;

Наследник не может удалить родительские методы, но можно их перекрыть, т.е. выполнять каким-либо иным способом (т.е. можно заново описать какой-то из родительских методов).

Наследование как раз и позволяет выполнить какие-то стандартные процедуры немного по-другому, например, рисовать похожие, но разные окна, наследуя их от одного окна.

Третий принцип ООП – полиморфизм – возможность для каждого объекта иерархии выполнить одно и то же действие по-своему. Можно записать в программе: Point.Show, Window.Show, и т.д. Один и тот же метод в этом случае будет реализовываться разными способами и приводить к разным результатам.

Итак, в основе ООП лежат три основных понятия:
  • инкапсуляция (сокрытие данных в классе или методе);
  • наследование;
  • полиморфизм.

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

Наследование - это процесс, в результате которого один тип наследует свойства другого типа.

Полиморфизм - это концепция, позволяющая иметь различные реализации для одного и того же метода, которые будут выбираться в зависимости от типа объекта, переданного методу при вызове

ООП – очень мощный метод при разработке больших программ, резко возрастает КПД работы программиста и снижается количество ошибок. Для большинства языков были созданы большие библиотеки готовых объектов. Практически все современные языки программирования, независимо от принадлежности к тому или иному стилю (директивному или декларативному), поддерживают концепцию ООП. Среди них C++, Java, Ruby и Haskell. Существуют и версии объектно-ориентированного Пролога.

В языках С++, Delphi сменилась терминология: иерархии объектов называются классами, а сами объекты – экземплярами классов.

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




^

Визуально-ориентированное программирование


Основано на ООП. Основополагающая идея: если программа строится в основном из стандартных объектов, то нельзя ли их не описывать в программы, а просто перетаскивать из какого-то хранилища в нужное место мышкой? А система сама должна написать нужный для этого код. Так работают Delphi, C++ Builder, Visual C, Visual Basic и т. д.

Естественно, каждый объект для этого должен иметь какое-то визуальное представление (иконку), чтобы его можно было перетаскивать мышкой. В результате иногда можно сделать нужную программу, вообще не написав на строчки программного кода. Метод особенно эффективен при создании интерфейсной части приложения (диалоговых окон, командных кнопок и т.п.)

^ Уровни языков программирования

Существуют такие языки, которые отражают структуру данного класса машин, и поэтому их называют машинно-ориентированными языками или языками низкого уровня. Особенностью этих языков является жесткая ориентация на определенный тип аппаратуры. В стремлении приспособить эти языки к человеку, был разработан язык символического кодирования – язык АССЕМБЛЕР.

Для облегчения труда программистов были созданы языки программирования, которые строились на основе определенного алфавита и строгих правил построения предложений. Отличительной особенностью этих языков является их ориентация не на систему команд той или иной ЭВМ, а на систему операторов, характерных для записи определенного класса алгоритмов. Такие языки принято называть языками программирования высокого уровня. К ним относятся: Бейсик, Фортран, Паскаль, Алгол, Си и многие другие.

Так как текст, записанной программы на языках высокого уровня не понятен ПК, требуется перевести его на машинный язык. Такой перевод на язык машинных кодов называется трансляцией, а выполняется он специальными программами – трансляторами.

Существует два основных вида трансляторов: интерпретаторы и компиляторы.

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

Компиляторы преобразуют всю программу в модуль на машинном языке (после предварительного исправления всех синтаксических ошибок). Только потом программа может быть выполнена.

^ Этапы разработки программы

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

Полный цикл разработки и эксплуатации программного продукта (программы), называемый жизненным циклом программы, включает в себя следующие этапы:

  • ^
    анализ требований к программе;
  • постановка задачи;
  • проектирование программы;
  • программирование;
  • тестирование и отладка;
  • эксплуатация и сопровождение;
  • завершение эксплуатации.

Анализ требований - этап жизненного цикла программы, во время которого требования заказчика уточняются, формализуются и документируются.
^
Постановка задачи в программировании - точная формулировка решения задачи на компьютере с описанием входной и выходной информации.

Проектирование программы- этап жизненного цикла, во время которого исследуется структура и взаимосвязи элементов разрабатываемого программного продукта.

Программирование - итерационный процесс составления программы для решения поставленной задачи.

^ Отладка программы - этап разработки компьютерной программы, в процессе которого происходят обнаружение, локализация и устранение явных ошибок в программе. Обычно отладка выполняется на контрольных примерах с известными результатами.

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

^ Виды тестирования:
  1. Альфа-тестирование - тестирование готового программного продукта разработчиками этого продукта на специально созданных задачах.
  2. Бета-тестирование - опробование программного продукта, бесплатно разосланного потенциальным пользователям, на реальных задачах. О найденных ошибках и замечаниях пользователь сообщают разработчику.
  3. ^ Ручное тестирование - тестирование, которое проводится без исполнения тестируемой программы на компьютере.
  4. Стохастическое тестирование - тестирование программ, при котором исходные тестовые данные берутся случайным образом (с использованием статистического распределения).
  5. Тестирование программы как прозрачного (белого) ящика - тестирование, подразумевающее знание исходного кода программы и полный доступ к нему.
  6. Тестирование программы как черного ящика - тестирование, при котором программа рассматривается как объект, внутренняя структура которого неизвестна.
^ Сопровождение программы - процесс модификации существующей программы, обусловленный необходимостью устранения выявленных в ней ошибок или изменения ее функциональных возможностей.



Блиц-обзор языков программирования

Существует несколько сотен языков программирования. Вот некоторые из них:

ADA - язык, разработанный с целью обеспечить создание программных систем с многолетним сроком службы и высокой степенью надежности. Создан по заказу министерства обороны США.

ALGOL - язык, ставший важной вехой в развитии языков программирования. Логичный и математически строгий, до сих пор применяется для записи алгоритмов.

BASIC - язык и среда, разработаны в 1964 г. в Дартмутском колледже. BASIC создавался как очень простой в изучении язык, который было бы легко компилировать. Авторы отводили ему роль первого шага на пути к изучению других языков.

^ VISUAL BASIC – объектно-ориентированная среда визуального программирования, внутренний язык приложений Microsoft Windows. Использует базовые конструкции языка Basic.

C - третья буква английского алфавита, название языка программирования, разработанного Деннисом Ричи в начале 70-х годов в Bell Laboratories. Использован для реализации OS Unix. Часто характеризуется как "переносимый ассемблер".

C++ -расширение языка С. В частности, С++ поддерживает объектно-ориентированное программирование. Разработан в Bell Laboratories Бьерном Страустрапом.

COBOL - один из первых языков программирования. ^ Ориентирован на разработку программ для обработки экономических данных и управления бизнесом. Широко используется до сих пор.

DELPHI - продукт Borland International. Высокопроизводительный инструмент построения приложений к базам данных в архитектуре клиент-сервер, а также для локальных машин и файл-серверной архитектуры. Это инструментарий, который включает компилятор кода, работающий в Windows, и предоставляет средства визуального программирования. В основе лежит язык - Object Pascal, который является расширением объектно-ориентированного языка Pascal.

FORTH - язык среднего уровня и интерактивная среда разработки. Нашел широкое применение в науке, робототехнике, управлении оборудованием, обработке образов и искусственном интеллекте. Позволяет создавать очень компактные и быстрые программы.

FORTRAN - первый язык программирования высокого уровня. ^ Главное применение - числовые расчеты с использованием сложных математических формул. Употребляется до сих пор.

HASKELL - "чистый" функциональный язык. Программы на HASKELL состоят исключительно из функций. Язык назван в честь логика Хаскела Кэрри, чьи работы были положены в основу языка.

JAVA - объектно-ориентированный язык, созданный в 1991 году группой разработчиков из Sun Microsystems. Основной целью этой корпорации служило создание языка независимого то платформы. Машинная независимость программ обеспечивается тем, что компилятор языка Java не генерирует родной код процессора, а создает промежуточный код, или байт-код для некой абстрактной виртуальной машины Java (Java Virtual Machine - JVM). Значит, чтобы обеспечить работу Java-программ на желаемой платформе, достаточно реализовать JVM для данной платформы. Виртуальная машина Java является ИНТЕРПРЕТАТОРОМ для байт-кода.

LISP - язык обработки списков. ^ Родной язык искусственного интеллекта. Разработан в конце 50-х Джоном Мак-Карти. В основу языка положена идея списков переменной длины и деревьев в роли основных типов данных, а также возможность интерпретации кода программы как данных и наоборот.

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

PASCAL - язык, разработанный Виртом для целей обучения программированию. PASCAL включает в себя элементы, общие для большинства языков программирования. Жесткие правила языка делают написание программ с ошибками довольно трудным делом. Поддерживает ООП.

PERL - язык, оптимизированный для просмотра текстовых файлов, извлечения из них информации и генерации соответствующих отчетов. Широко применяется для системного администрирования среды Unix.

PL/1 - язык общего назначения, который по замыслу IBM должен был вытеснить специализированные языки программирования. PL/1 предназначался не только для программирования в сферах коммерции, науки и инженерного дела, но даже для системного программирования. Попытка не удалась.

PROLOG - язык искусственного интеллекта. Реализует концепцию логического программирования. На PROLOG написаны многие экспертные системы, позволяющие делать выводы на основе имеющихся фактов и обширной базы правил, представленных в виде "если - то".
PYTHON - интерпретирующий объектно-ориентированный язык программирования. По своему назначению принадлежит к группе языков Perl, Scheme и Java. Поддерживает модули, классы, исключения и динамические типы данных.


^ Языки разметки гипертекста

HTML и XML – являются языками разметки гипертекста, используются для создания WEB-страниц. Не являются языками программирования. Язык разметки документов - это набор специальных инструкций, называемых тэгами, предназначенных для формирования в документах какой-либо структуры и определения отношений между различными элементами этой структуры. Тэги языка, или, как их иногда называют, управляющие дескрипторы, в таких документах каким-то образом кодируются, выделяются относительно основного содержимого документа и служат в качестве инструкций для программы, производящей показ содержимого документа на стороне клиента. Самый популярный на сегодняшний день язык гипертекстовой разметки – HTML, был создан специально для организации информации, распределенной в сети Интернет, и является одной из ключевых составляющих технологии WWW. HTML уже сегодня не удовлетворяет в полной мере требованиям, предъявляемым современными разработчиками к языкам подобного рода. И ему на смену был предложен новый язык гипертекстовой разметки, мощный, гибкий, и, одновременно с этим, удобный язык XML.

^ XML (Extensible Markup Language) - это язык разметки, описывающий целый класс объектов данных, называемых XML - документами. Этот язык используется в качестве средства для описания грамматики других языков и контроля за правильностью составления документов. Т.е. сам по себе XML не содержит никаких тэгов, предназначенных для разметки, он только определяет порядок их создания. У разработчиков появляется возможность определять собственные команды, позволяющие им наиболее эффективно определять данные, содержащиеся в документе. Автор документа создает его структуру, строит необходимые связи между элементами, используя те команды, которые удовлетворяют его требованиям и добивается такого типа разметки, которое необходимо ему для выполнения операций просмотра, поиска, анализа документа.