Средства программирования

Вид материалаДокументы

Содержание


Любая программа представляет собой структуру, построенную из трёх типов базовых конструкций
Повторяющиеся фрагменты программы
Разработка программы ведётся пошагово, методом «сверху вниз».
LISP (Джон МакКарти
Робин Милнер
Прототипное программирование
Реализационный подход
Концептуальный подход
Критика ООП
Кристофер Дэйт
Фредерик Брукс
Патрик Киллелиа
Объектно-ориентированные языки
Сравнение с класс-ориентированным подходом
Конструирование объектов
Abcl/1, abcl/r
Точка выполнения
Таблица развития языков программирования
Алгол – 58
Алгол – 60
...
Полное содержание
Подобный материал:
  1   2   3   4   5   6   7   8   9   ...   12

Средства программирования.

На протяжении всех лет существования практика программирования требовала совершенствования технологических приемов и создания на их основе таких средств программирования, которые упростили бы процесс разработки программ, позволяя создавать все более сложные программные системы. Первые программы были организованы очень просто. Они состояли из собственно программы на машинном языке и обрабатываемых данных. Сложность программ ограничивалась способностью программиста одновременно мысленно отслеживать последовательность выполняемых операций и местонахождение большого количества данных. Создание сначала ассемблеров, а затем и языков высокого уровня сделало программу более обозримой за счет снижения уровня детализации и естественно позволило увеличить ее сложность. Появление в языках средств, позволяющих оперировать подпрограммами, существенно снизило трудоемкость разработки программ. Подпрограммы можно было сохранять и использовать в других программах. В результате были накоплены огромные библиотеки расчетных и служебных подпрограмм, которые по мере надобности которые по мере надобности вызывались из разрабатываемой программы. Типичная программа того времени состояла из основной программы, области глобальных данных и набора подпрограмм, выполняющих обработку всех данных или их части.Слабым местом такой архитектуры было то, что при увеличении количества подпрограмм возрастала вероятность искажения части глобальных данных какой-либо подпрограммой. Например, обычно подпрограмма поиска корней уравнения на заданном интервале по методу деления отрезка пополам меняет величину интервала. Если при выходе из подпрограммы не предусмотреть восстановления первоначального интервала, то в глобальной области окажется неверное значение интервала, полученное при последнем делении отрезка в ходе работы подпрограммы. Необходимость исключения таких ошибок привела к идее использования в подпрограммах локальных данных.И вновь сложность разрабатываемого программного обеспечения стала ограничиваться возможностью программиста отслеживать процессы обработки данных уже на новом уровне. К этому добавились проблемы согласования интерфейса при ведении разработки несколькими программистами. В результате встал вопрос создания технологии разработки сложных программных продуктов, снижающей вероятность появления ошибок. Усилиями многих авторов такая технология была создана и получила название «структурное программирование». Структурное программирование представляет собой совокупность рекомендуемых технологических приемов, охватывающих выполнение всех этапов разработки программного обеспечения. Были сформулированы основные принципы выполнения разработки:

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

•собственно структурное программирование, рекомендующее деленные структуры алгоритмов и стиль программирования (чем нагляднее текст программы, тем меньше вероятность ошибки);

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

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

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

- последовательности подзадач (например, ввод данных, преобразование данных, вывод данных),

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

- повторения подзадачи (например, циклически повторяемая обработка данных);

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

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



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

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

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

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

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

История

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

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

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

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

Перечислим некоторые достоинства структурного программирования:
  1. Структурное программирование позволяет значительно сократить число вариантов построения программы по одной и той же спецификации, что значительно снижает сложность программы и, что ещё важнее, облегчает понимание её другими разработчиками.
  2. В структурированных программах логически связанные операторы находятся визуально ближе, а слабо связанные — дальше, что позволяет обходиться без ссылка скрыта и других графических форм изображения алгоритмов (по сути, сама программа является собственной блок-схемой).
  3. Сильно упрощается процесс ссылка скрыта и ссылка скрыта структурированных программ.

Функциональное программирование

Функциона́льное программи́рование — раздел ссылка скрыта и ссылка скрыта, в которой процесс ссылка скрыта трактуется как вычисление значений ссылка скрыта в математическом понимании последних. Противопоставляется парадигме ссылка скрыта

Основные принципы

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

Существенной особенностью чистого функционального программирования является использование только «чистых» функций, то есть тех, чей единственный результат работы заключается в возвращаемом значении, или другими словами, вычисление которых не имеет ссылка скрыта. Единственными способами передачи значения в функциональной программе является получение его как результата вызова функции и передача его функции в качестве параметра. Чистая функциональная программа не использует переменных.

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

Функциональное программирование основано на теориях ссылка скрыта (ссылка скрыта, ссылка скрыта) и ссылка скрыта (ссылка скрыта и ссылка скрыта).

Наиболее известными ссылка скрыта являются:

Концепции

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

Функции высших порядков

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

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

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

Рекурсия

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

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

Схожие парадигмы

Одной из близких парадигм программирования является ссылка скрыта, в котором программа представляет собой множество пар (логическое условие, новые факты). В логическом программировании, также как и в функциональном программировании, программист остается в неведении о методах, применяемых при вычислении, и последовательности исполнения элементарных действий. Большая часть ответственности за эффективность вычислений в логическом и функциональном программировании перекладывается на «плечи» транслятора используемого ссылка скрыта.

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

Особенности

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

Сильные стороны

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

Недостатки

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

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

Процедурное программирование

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

Процедурное программирование — это лучший выбор, чем просто последовательное или ссылка скрыта во многих ситуациях, которые вызываются умеренной сложностью, или тех, которые требуют значительного упрощения поддержки. Возможные выгоды:
  • Возможность ссылка скрыта одного и того же кода из нескольких мест программы без его копирования.
  • Легче отследить поток выполнения программы, чем в случае использования инструкций GOTO или JUMP, которые могут сделать из большой, сложной программы так называемый ссылка скрыта.
  • Возможность поддержки модульности и ссылка скрыта.

Процедурные языки программирования

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

Объе́ктно-ориенти́рованное программи́рование (ООП) — ссылка скрыта, в которой основными концепциями являются понятия ссылка скрыта и ссылка скрыта (либо, в менее известном варианте языков с прототипированием — ссылка скрыта).

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

Прототип — это образцовый объект, по образу и подобию которого создаются другие объекты.

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

Объектно-ориентированное программирование в настоящее время является абсолютным лидером в области прикладного программирования (языки Java, C#, C++, JavaScript, ActionScript и др.). В то же время в области системного программирования до сих пор лидирует парадигма процедурного программирования, и основным языком программирования является язык C. Хотя при взаимодействии системного и прикладного уровней операционных систем заметное влияние стали оказывать языки объектно-ориентированного программирования. Например, мультиплатформенным стандартом стала система Qt, написанная на языке C++.

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

Главные понятия и разновидности

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

Такое объединение называется ссылка скрыта.

Наличие инкапсуляции достаточно для объектности языка программирования, но ещё не означает его объектной ориентированности — для этого требуется наличие ссылка скрыта.

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

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

Основные понятия

ссылка скрыта 

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

ссылка скрыта 

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

ссылка скрыта 

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

ссылка скрыта 

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

Основные концепции
  • Система состоит из объектов
  • Объекты некоторым образом взаимодействуют между собой
  • Каждый объект характеризуется своим состоянием и поведением
  • Состояние объекта задаётся значением полей данных
  • Поведение объекта задаётся методами

Традиционный подход

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

Обмен сообщениями

Этот подход предложен Аланом Кэйем в языке ссылка скрыта.
  • Управление объектами (вызов методов) производится не напрямую, как это принято в современных языках объектного программирования, а через посылку объектов-сообщений.
  • В литературе, посвящённой объектному программированию (особенно C++) вместо правильного термина вызов метода до сих пор иногда встречается неправильный термин посылка сообщения (заимствованный из ссылка скрыта, где он совершенно правилен) .

Прототипное программирование


Примерами языков программирования, где используется прототипное программирование, являются ссылка скрыта и ссылка скрыта.
  • Создание новых объектов через клонирование прототипов.
  • Повторное использование кода достигается не через наследование, а с помощью ссылка скрыта.