Парадигмы программирования

Заключение

Разбить на страницы
Показывать лекцию целиком

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

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

Распределенные информационные системы

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

При обсуждении РИС обычно используют сетевые модели, отражающие взаимосвязи составляющих как связи между узлами сети. При этом характерны следующие свойства РИС:

  • скрыты малосущественные различия и связи между узлами,
  • поддерживается расширение сети и массштабирование числа узлов,
  • РИС существует постоянно, хотя части РИС могут выходить из строя,
  • определен промежуточный уровень между оборудованием и приложениями.
  • Примеры:

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

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

  • прозрачность доступа к данным, их местоположения, переноса и перемещения, копирования, совместного доступа к блокам данных, отказа-восстановлений процесса обработки, оперативного хранения дублей компонент, обеспечивающих бесперебойное функционарование РИС;
  • управление степенью открытости процесса разработки РИС, протокола взаимодействия компонент РИС, пользовательского интерфейса терминальных узлов РИС, информационных сервисов и технических служб;
  • интероперабельность и переносимость, гибкость и массштабируемость компонент и комплексов, образующих РИС.
  • Естественный подход к выполнению таких требований - определение децентрализованных алгоритмов, таких что:

  • ни один узел не содержит всю полную информацию по системе,
  • решения принимаются по локальной информации,
  • сбой любого узла не нарушает ход выполнения алгоритма,
  • нет единого времени - узлы функционируют асинхронно.
  • Чаще всего РИС реализуется на базе сетевой операционной системы, обеспечивающей доступ к совместно используемым ресурсам, позволяющей скрыть сложность и неоднородность используемого обрудования. Архитектура РИС концептуально близка проблематике сетевых баз данных и трехзвенных клиетн-серверных систем, но сопряжена с рядом дополнительных условий, связанных с практикой вертикального распределения звеньев при обработке приложений на разных машинах и горизонтальной реорганизации с целью выравнивания нагрузки посредством дублирования серверов.

    Элементы РИС (ЭЛ) могут быть разделены на части Э1, Э2, размещаемые в разных логических зонах Р, связанных соответствующим протоколом П(Р).

    $$ЭЛ/Р \equiv ( Э1 \leftarrow П(Р) \to Э2 )$$

    Этим обеспечивается то, что концепция системы не зависит от физического размещения частей.

    На концептуальном уровне для РИС характерны свойства:

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

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

    Критерии успешности разработки РИС:

  • оптимальные затраты на разработку,
  • легкость расширения простым добавлением узлов или перераспределением зон,
  • наличие методов определения неисправностей и технологии быстрого их устранения.
  • По существу РИС - эволюционирующий объект, разработка которого имеет непрерывный характер и продолжается в период эксплуатации. По этой причине язык представления РИС должен поддерживать в полной мере средства для решения проблем разработки и эксплуатации программ, что приводит к парадигме КП.

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

    Ключевое направление развития парадигм программирования связано с тенденцией компонентного подхода к разработке программ, верификации свойств их компонент и межязыковой интеграции программных комплексов. Такой подход интенсивно развивается в проектах типа .Net [].

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

    Понятие "компонент" имеет глубокие корни и весьма широкое толкование в технологии разработки программ. Это и библиотечные процедуры, и раздельно компилируемые модули, и пользовательские интерфейсы, и макроопределения, и системы файлов, и документация, и шаблоны компиляции кода программ, и элементы структур данных, и наборы данных с методами их обработки, и иерархии классов объектов общего назначения, и комплекты ИС, встраиваемых в информационные комплексы.

    Реально понятие "компонент" проявляется как взаимосвязь понятий "обьекты", из которых строится текст или код программы, и "процессы", возникающие при функционировании, взаимодействии и разработке ряда ИС. С одной стороны, компонентами называют конструкции, используемые в разных программах. С другой стороны, этим же термином называют части или элементы структурированных данных, включая системы файлов и информационные комплексы. Совмещение этих сторон в общем понятии соответствует пониманию программ как разновидности данных. Разноплановость подходов к выделению компонентов подобно различиям в рассмотрении структуры материи с точки зрения физики, химии, геологии, биологии и других наук. Оно обусловлено независимостью влияния отдельных аспектов изучения, проектирования, построения и функционирования ИС на характер их применения и результативность разработки. Эта независимость фактически признана в технологии UML, поддерживающией ряд автономно создаваемых, одновременно существующих форм представления и структуризации проектируемой программы (бизнес-логика, ООП, временные диаграммы и размещение компонентов) [,].

    Простые компоненты могут быть заданы непосредственно, а сложные обычно строятся пошаговым образом. Процесс уточнения, улучшения или расширения компонентов в XP называют "рефакторинг" [,]. Начиная с некоторого первичного текста программного компонента, пошаговым образом формируется его новое частичное определение, которое в каком-то отношении лучше, чем предыдущее. Оно может полнее, точнее или эффективнее решать задачу, может стать более удобочитаемым, лучше приспособленным к отладке или сопровождению и т.д, и т.п.

    Движущие силы рефакторинга - эволюция решаемых задач, развитие информационных сетей и совершенствование технологии системного программирования. Все это требует повышения уровня организованности программ, приведения монолитных форм к дистрибутивным формам распределенных ИС. Обычно при организации ИС из компонентов требуются атрибуты, задающие их наименование, значение, конструкцию и функционирование, причем, не единственным образом. Возможны псевдонимы или синонимы наименования, примеры значений, варианты конструкций и версии функционирования. Любая часть определения компонентов может быть задана с помощью других компонентов, в свою очередь определяемых пошаговым образом. Может быть сложная реализация простых компонентов и технически простое производство содержательно сложных компонентов с помощью автоматов или генераторов. Пара из входного и выходного значений: аргумента и соответствующего ему результата - тест, может работать как вариант реализации компонента, рассматриваемого как функция.

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

    Перенос внимания с разработки программ на разработку их компонентов требует пересмотра моделей ЖЦ, охватывающих процессы разработки множества программ и их версий, в которых происходит накопление типовых компонентов и удостоверение их работоспособности. За 50 лет программирования доля изученных задач разработки ИС систематически возрастала, что и явилось основанием перехода к компонентному программированию. Функциональный подход способствует повышению уровня изученности задач, технологичное решение которых выходит за пределы стандартных парадигм программирования [].

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

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

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

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

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

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

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

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

    Производительность зависит от следующих факторов:

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

    Чтобы преодолеть усложненность анализа критических свойств РИС, нужен новый подход в контексте композируемости и повторного использования компонентного анализа при конструировании систем из компонентов. Такие свойства для систем должны выводиться из свойств подсистем или компонентов. Нужен механизм описания поведения компонентов при отказах по отношению ко всем возможным обстановкам.

    Основная идея анализа поведения РИС - вся система однородна и исходный текст ее компонентов доступен для анализа. Это не соответсвует практике применения и создания компонентов по ряду причин:

  • некоторые компоненты доступны лишь в виде двоичного кода;
  • результаты анализа компонентов представляют интерес, даже если целой программы еще не существует;
  • с точки зрения расхода времени и ресурсов многократно повторяемый анализ всех компонентов программы не всегда обоснован, (например, анализ библиотечных модулей, присоединяемых к программе);
  • рассмотрение программы как единой однородной сущности означает, что изменение любого компонента требует полного повторного анализа всей программы;
  • чтобы достичь практичного времени анализа, он должен использовать аппроксимации, которые обычно редуцируют точность и полезность/выполнимость анализируемых решений.
  • Необходим альтернативный подход - анализ на уровне компонентов, при котором на входе вместо исходного текста завершенной программы анализируется исходный код отдельных компонентов, дополненный некоторой информацией о контексте применения этих компонентов. Такая дополнительная обобщенная информация об остальных, возможно недоступных и даже еще не существующих, компонентах выполняют роль консервирующих допущений, что позволяет ввести меру консервативности частичного определения ИС. Далее ставится задача, обойти ограничения полнопрограммного анализа:

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

    Моделирование парадигм программирования

    Создание и использование коллекций изученных задач, решения которых представлены в виде готовых компонентов, накапливаемых в общей информационной среде, дают основание перехода от библиотек к языкам КП. Нужна лишь подходящая парадигма программирования, допускающая эволюцию не только области применения ИС, но и пространства реализационных решений по созданию самой ИС. Ведущие парадигмы структурированного и объектно-ориентированного программирования ограничивают такую эволюцию рамками стандартных вычислительных моделей [41]. При необходимости это ограничение преодолевают привлечением ФП, о чем свидетельствует рост рейтинга систем функционального программирования (СФП), используемых в самодеятельных проектах, доведенных до завершения. Выигрыш дает приспособленность СФП к быстрой отладке, верификации, лаконизм, гибкость и моделирующая сила. Все это позволяет рассматривать СФП как эффективную инструментально-методическую основу информационной среды обучения современному программированию [,, ,,].

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

    Современные ИТ сделали доступным для практики богатейший материал, само обилие которого является серьезной проблемой для его освоения и применения []. Этот материал является базой для оттачивания профессионального мастерства по определению ИС из готовых компонентов. Работа с компонентами подразумевает многократность использования, вариативность реализации и повторность разработки. Это влечет необходимость учета разных критериев и требований, подвергающихся непредсказуемой эволюции. Функциональный подход к компонентному программированию позволяет формализовать на метауровне особенности разных технологий программирования, что дает основания для методики активного обучения программированию и конструированию ИС из компонентов СФП.

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

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

    Материалы Интернет-Университета, дополняющие лекции курса.
    Тема лекции Авторы, название курса и URL
    1 Многоликое программирование

    Баженова И.Ю., Сухомлин В.А. Введение в программирование http://www.intuit.ru/department/pl/plintro/

    Непейвода Н.Н. Стили и методы программирования http://www.intuit.ru/department/se/progstyles/

    2 Определение языков программирования Вояковская Н.Н., Москаль А.Е., Булычев Д.Ю., Терехов А.А. Разработка компиляторов http://www.intuit.ru/department/sa/compilersdev/
    3 Ассемблер Новиков Ю.В., Скоробогатов П.К. Основы микропроцессорной техники http://www.intuit.ru/department/hardware/mpbasics/6.2.1. Ассемблер MPASM
    4 Машинно ориентированное программирование

    Галатенко В.А. Программирование в стандарте POSIX http://www.intuit.ru/department/se/pposix/

    Язык программирования C http://www.intuit.ru/department/pl/cpl/

    Якушева Н.М. Visual Basic http://www.intuit.ru/department/pl/vb/

    5 Макрообработка текстов Храмцов П.,Б., Брик С.А., Русак А.М., Сурин А.И. Введение в HTML http://www.intuit.ru/department/internet/htmlintro/
    6 Языки управления процесс

    Курячий Г.В., Маслинский К.А. Операционная система Linux http://www.intuit.ru/department/os/linux/

    Костромин В.А.Основы работы в ОС Linux http://www.intuit.ru/department/os/baselinuxwork/ Оболочка bash

    7 Функциональное программирование Городняя Л.В. Основы функционального программирования http://www.intuit.ru/department/pl/funcpl/
    8 Стандартное системное программирование

    Страуструп Бьерн Язык программирования C++ для профессионалов http://www.intuit.ru/department/pl/cpp2/

    Биллиг В.А. Основы программирования на C# http://www.intuit.ru/department/pl/csharp/

    Андреева Т.А. http://www.intuit.ru/department/pl/plpascal/ Программирование на языке Pascal

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

    Алексеев В.Е., Таланов В.А. Структуры данных и модели вычислений http://www.intuit.ru/department/algorithms/dscm/

    Шрайнер П.А. Основы программирования на языке Пролог http://www.intuit.ru/department/pl/plprolog/

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

    Мейер Бертран http://www.intuit.ru/department/se/oopbases/

    Основы объектно-ориентированного программирования http://www.intuit.ru/department/se/ooad/Основы объектно-ориентированного проектирования

    11 Языки параллельного программирования. Барский А.Б. Параллельное программирование http://www.intuit.ru/department/se/parallprog/
    12 Функции высших порядков

    Сузи Р.А. http://www.intuit.ru/department/pl/python/ Язык программирования Python

    Верещагин Н.К., Шень А.Х. Языки и исчисления http://www.intuit.ru/department/calculate/lancalc/

    13 Оптимизация программ. Чеповский А.М., Макаров А.В. Скоробогатов С.Ю. Common Intermediate Language и системное программирование в Microsoft .NET http://www.intuit.ru/department/pl/cil/
    14 Разработка программ

    Терехов А.Н. Введение в технологию программирования http://www.intuit.ru/department/se/introprogteach/

    Леоненков А.В. Нотация и семантика языка UML http://www.intuit.ru/department/pl/umlbasics/

    Котляров В.П. http://www.intuit.ru/department/se/testing/ Основы тестирования программного обеспечения

    15 Перспективы парадигм программирования Кулямин В.В. Компонентный подход в программировании http://www.intuit.ru/department/se/compprog/
    Страницы:

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

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

    Распределенные информационные системы

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

    При обсуждении РИС обычно используют сетевые модели, отражающие взаимосвязи составляющих как связи между узлами сети. При этом характерны следующие свойства РИС:

  • скрыты малосущественные различия и связи между узлами,
  • поддерживается расширение сети и массштабирование числа узлов,
  • РИС существует постоянно, хотя части РИС могут выходить из строя,
  • определен промежуточный уровень между оборудованием и приложениями.
  • Примеры:

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

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

  • прозрачность доступа к данным, их местоположения, переноса и перемещения, копирования, совместного доступа к блокам данных, отказа-восстановлений процесса обработки, оперативного хранения дублей компонент, обеспечивающих бесперебойное функционарование РИС;
  • управление степенью открытости процесса разработки РИС, протокола взаимодействия компонент РИС, пользовательского интерфейса терминальных узлов РИС, информационных сервисов и технических служб;
  • интероперабельность и переносимость, гибкость и массштабируемость компонент и комплексов, образующих РИС.
  • Естественный подход к выполнению таких требований - определение децентрализованных алгоритмов, таких что:

  • ни один узел не содержит всю полную информацию по системе,
  • решения принимаются по локальной информации,
  • сбой любого узла не нарушает ход выполнения алгоритма,
  • нет единого времени - узлы функционируют асинхронно.
  • Чаще всего РИС реализуется на базе сетевой операционной системы, обеспечивающей доступ к совместно используемым ресурсам, позволяющей скрыть сложность и неоднородность используемого обрудования. Архитектура РИС концептуально близка проблематике сетевых баз данных и трехзвенных клиетн-серверных систем, но сопряжена с рядом дополнительных условий, связанных с практикой вертикального распределения звеньев при обработке приложений на разных машинах и горизонтальной реорганизации с целью выравнивания нагрузки посредством дублирования серверов.

    Элементы РИС (ЭЛ) могут быть разделены на части Э1, Э2, размещаемые в разных логических зонах Р, связанных соответствующим протоколом П(Р).

    $$ЭЛ/Р \equiv ( Э1 \leftarrow П(Р) \to Э2 )$$

    Этим обеспечивается то, что концепция системы не зависит от физического размещения частей.

    На концептуальном уровне для РИС характерны свойства:

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

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

    Критерии успешности разработки РИС:

  • оптимальные затраты на разработку,
  • легкость расширения простым добавлением узлов или перераспределением зон,
  • наличие методов определения неисправностей и технологии быстрого их устранения.
  • По существу РИС - эволюционирующий объект, разработка которого имеет непрерывный характер и продолжается в период эксплуатации. По этой причине язык представления РИС должен поддерживать в полной мере средства для решения проблем разработки и эксплуатации программ, что приводит к парадигме КП.

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

    Ключевое направление развития парадигм программирования связано с тенденцией компонентного подхода к разработке программ, верификации свойств их компонент и межязыковой интеграции программных комплексов. Такой подход интенсивно развивается в проектах типа .Net [].

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

    Понятие "компонент" имеет глубокие корни и весьма широкое толкование в технологии разработки программ. Это и библиотечные процедуры, и раздельно компилируемые модули, и пользовательские интерфейсы, и макроопределения, и системы файлов, и документация, и шаблоны компиляции кода программ, и элементы структур данных, и наборы данных с методами их обработки, и иерархии классов объектов общего назначения, и комплекты ИС, встраиваемых в информационные комплексы.

    Реально понятие "компонент" проявляется как взаимосвязь понятий "обьекты", из которых строится текст или код программы, и "процессы", возникающие при функционировании, взаимодействии и разработке ряда ИС. С одной стороны, компонентами называют конструкции, используемые в разных программах. С другой стороны, этим же термином называют части или элементы структурированных данных, включая системы файлов и информационные комплексы. Совмещение этих сторон в общем понятии соответствует пониманию программ как разновидности данных. Разноплановость подходов к выделению компонентов подобно различиям в рассмотрении структуры материи с точки зрения физики, химии, геологии, биологии и других наук. Оно обусловлено независимостью влияния отдельных аспектов изучения, проектирования, построения и функционирования ИС на характер их применения и результативность разработки. Эта независимость фактически признана в технологии UML, поддерживающией ряд автономно создаваемых, одновременно существующих форм представления и структуризации проектируемой программы (бизнес-логика, ООП, временные диаграммы и размещение компонентов) [,].

    Простые компоненты могут быть заданы непосредственно, а сложные обычно строятся пошаговым образом. Процесс уточнения, улучшения или расширения компонентов в XP называют "рефакторинг" [,]. Начиная с некоторого первичного текста программного компонента, пошаговым образом формируется его новое частичное определение, которое в каком-то отношении лучше, чем предыдущее. Оно может полнее, точнее или эффективнее решать задачу, может стать более удобочитаемым, лучше приспособленным к отладке или сопровождению и т.д, и т.п.

    Движущие силы рефакторинга - эволюция решаемых задач, развитие информационных сетей и совершенствование технологии системного программирования. Все это требует повышения уровня организованности программ, приведения монолитных форм к дистрибутивным формам распределенных ИС. Обычно при организации ИС из компонентов требуются атрибуты, задающие их наименование, значение, конструкцию и функционирование, причем, не единственным образом. Возможны псевдонимы или синонимы наименования, примеры значений, варианты конструкций и версии функционирования. Любая часть определения компонентов может быть задана с помощью других компонентов, в свою очередь определяемых пошаговым образом. Может быть сложная реализация простых компонентов и технически простое производство содержательно сложных компонентов с помощью автоматов или генераторов. Пара из входного и выходного значений: аргумента и соответствующего ему результата - тест, может работать как вариант реализации компонента, рассматриваемого как функция.

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

    Перенос внимания с разработки программ на разработку их компонентов требует пересмотра моделей ЖЦ, охватывающих процессы разработки множества программ и их версий, в которых происходит накопление типовых компонентов и удостоверение их работоспособности. За 50 лет программирования доля изученных задач разработки ИС систематически возрастала, что и явилось основанием перехода к компонентному программированию. Функциональный подход способствует повышению уровня изученности задач, технологичное решение которых выходит за пределы стандартных парадигм программирования [].

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

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

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

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

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

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

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

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

    Производительность зависит от следующих факторов:

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

    Чтобы преодолеть усложненность анализа критических свойств РИС, нужен новый подход в контексте композируемости и повторного использования компонентного анализа при конструировании систем из компонентов. Такие свойства для систем должны выводиться из свойств подсистем или компонентов. Нужен механизм описания поведения компонентов при отказах по отношению ко всем возможным обстановкам.

    Основная идея анализа поведения РИС - вся система однородна и исходный текст ее компонентов доступен для анализа. Это не соответсвует практике применения и создания компонентов по ряду причин:

  • некоторые компоненты доступны лишь в виде двоичного кода;
  • результаты анализа компонентов представляют интерес, даже если целой программы еще не существует;
  • с точки зрения расхода времени и ресурсов многократно повторяемый анализ всех компонентов программы не всегда обоснован, (например, анализ библиотечных модулей, присоединяемых к программе);
  • рассмотрение программы как единой однородной сущности означает, что изменение любого компонента требует полного повторного анализа всей программы;
  • чтобы достичь практичного времени анализа, он должен использовать аппроксимации, которые обычно редуцируют точность и полезность/выполнимость анализируемых решений.
  • Необходим альтернативный подход - анализ на уровне компонентов, при котором на входе вместо исходного текста завершенной программы анализируется исходный код отдельных компонентов, дополненный некоторой информацией о контексте применения этих компонентов. Такая дополнительная обобщенная информация об остальных, возможно недоступных и даже еще не существующих, компонентах выполняют роль консервирующих допущений, что позволяет ввести меру консервативности частичного определения ИС. Далее ставится задача, обойти ограничения полнопрограммного анализа:

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

    Моделирование парадигм программирования

    Создание и использование коллекций изученных задач, решения которых представлены в виде готовых компонентов, накапливаемых в общей информационной среде, дают основание перехода от библиотек к языкам КП. Нужна лишь подходящая парадигма программирования, допускающая эволюцию не только области применения ИС, но и пространства реализационных решений по созданию самой ИС. Ведущие парадигмы структурированного и объектно-ориентированного программирования ограничивают такую эволюцию рамками стандартных вычислительных моделей [41]. При необходимости это ограничение преодолевают привлечением ФП, о чем свидетельствует рост рейтинга систем функционального программирования (СФП), используемых в самодеятельных проектах, доведенных до завершения. Выигрыш дает приспособленность СФП к быстрой отладке, верификации, лаконизм, гибкость и моделирующая сила. Все это позволяет рассматривать СФП как эффективную инструментально-методическую основу информационной среды обучения современному программированию [,, ,,].

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

    Современные ИТ сделали доступным для практики богатейший материал, само обилие которого является серьезной проблемой для его освоения и применения []. Этот материал является базой для оттачивания профессионального мастерства по определению ИС из готовых компонентов. Работа с компонентами подразумевает многократность использования, вариативность реализации и повторность разработки. Это влечет необходимость учета разных критериев и требований, подвергающихся непредсказуемой эволюции. Функциональный подход к компонентному программированию позволяет формализовать на метауровне особенности разных технологий программирования, что дает основания для методики активного обучения программированию и конструированию ИС из компонентов СФП.

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

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

    Материалы Интернет-Университета, дополняющие лекции курса.
    Тема лекции Авторы, название курса и URL
    1 Многоликое программирование

    Баженова И.Ю., Сухомлин В.А. Введение в программирование http://www.intuit.ru/department/pl/plintro/

    Непейвода Н.Н. Стили и методы программирования http://www.intuit.ru/department/se/progstyles/

    2 Определение языков программирования Вояковская Н.Н., Москаль А.Е., Булычев Д.Ю., Терехов А.А. Разработка компиляторов http://www.intuit.ru/department/sa/compilersdev/
    3 Ассемблер Новиков Ю.В., Скоробогатов П.К. Основы микропроцессорной техники http://www.intuit.ru/department/hardware/mpbasics/6.2.1. Ассемблер MPASM
    4 Машинно ориентированное программирование

    Галатенко В.А. Программирование в стандарте POSIX http://www.intuit.ru/department/se/pposix/

    Язык программирования C http://www.intuit.ru/department/pl/cpl/

    Якушева Н.М. Visual Basic http://www.intuit.ru/department/pl/vb/

    5 Макрообработка текстов Храмцов П.,Б., Брик С.А., Русак А.М., Сурин А.И. Введение в HTML http://www.intuit.ru/department/internet/htmlintro/
    6 Языки управления процесс

    Курячий Г.В., Маслинский К.А. Операционная система Linux http://www.intuit.ru/department/os/linux/

    Костромин В.А.Основы работы в ОС Linux http://www.intuit.ru/department/os/baselinuxwork/ Оболочка bash

    7 Функциональное программирование Городняя Л.В. Основы функционального программирования http://www.intuit.ru/department/pl/funcpl/
    8 Стандартное системное программирование

    Страуструп Бьерн Язык программирования C++ для профессионалов http://www.intuit.ru/department/pl/cpp2/

    Биллиг В.А. Основы программирования на C# http://www.intuit.ru/department/pl/csharp/

    Андреева Т.А. http://www.intuit.ru/department/pl/plpascal/ Программирование на языке Pascal

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

    Алексеев В.Е., Таланов В.А. Структуры данных и модели вычислений http://www.intuit.ru/department/algorithms/dscm/

    Шрайнер П.А. Основы программирования на языке Пролог http://www.intuit.ru/department/pl/plprolog/

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

    Мейер Бертран http://www.intuit.ru/department/se/oopbases/

    Основы объектно-ориентированного программирования http://www.intuit.ru/department/se/ooad/Основы объектно-ориентированного проектирования

    11 Языки параллельного программирования. Барский А.Б. Параллельное программирование http://www.intuit.ru/department/se/parallprog/
    12 Функции высших порядков

    Сузи Р.А. http://www.intuit.ru/department/pl/python/ Язык программирования Python

    Верещагин Н.К., Шень А.Х. Языки и исчисления http://www.intuit.ru/department/calculate/lancalc/

    13 Оптимизация программ. Чеповский А.М., Макаров А.В. Скоробогатов С.Ю. Common Intermediate Language и системное программирование в Microsoft .NET http://www.intuit.ru/department/pl/cil/
    14 Разработка программ

    Терехов А.Н. Введение в технологию программирования http://www.intuit.ru/department/se/introprogteach/

    Леоненков А.В. Нотация и семантика языка UML http://www.intuit.ru/department/pl/umlbasics/

    Котляров В.П. http://www.intuit.ru/department/se/testing/ Основы тестирования программного обеспечения

    15 Перспективы парадигм программирования Кулямин В.В. Компонентный подход в программировании http://www.intuit.ru/department/se/compprog/
    Вернуться к учебному плану