КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Методы синтеза программ
Методы ведения библиотек Методы управления проектами Общее определение метода управления проектом таково: способы определения метрик и нормативов логического программирования, обнаружения узких мест, планирование материальных, людских и вычислительных ресурсов и сроков выполнения работ по проекту. Способы предназначены для определения путей повышения эффективности работ и оценки деятельности коллектива проектантов над проектом и его реализации. Главный принцип методов состоит в обеспечении максимального копирования человеческого поведения в библиотеке и ведения библиотеки книг и документов, собранных в библиотеке. Вводится понятие картотеки и форм карточек, определяется метод доступа к содержимому библиотеки, ее поддержания, чистки и защиты от несанкционированного доступа. В указанных руководствах подробно описаны все макро и микро действия по вводу документов в библиотеку и сопровождению их по времени. В библиотеке находят приют описания языков и проектов, программные модули, программы общего назначения, системные программы, БЗ, БД, отчеты о работах и др. документация. Накопление разделов данных, знаний или систем способствует сохранению отлаженных (точных) знаний и атрибутов их использования. Кроме этого библиотека снабжается средством просмотра списка всех картотек (каталогов) библиотеки. Главная ориентация в работе со знаниями (в том числе с алгоритмическими знаниями) состоит в применении логических методов и подходов. Такая ориентация исторически родилась из проблем построения доказательств правильности программ. В решении этих проблем получены хорошие теоретические результаты, но практическое воплощение оказалось весьма трудным делом. Минуя эти проблемы можно достичь больших практических результатов после внедрения методов и средств синтеза программ автоматическими методами. После реализации методов синтеза программ отпадает необходимость в доказательстве правильности программ, но правильность алгоритмов остается. Автоматический синтез обеспечивает (гарантирует) построение правильных программ, но не правильных алгоритмов, если в задании допущена ошибка. Имеется другая сторона проблемы синтеза - проблема соответствия алгоритма и программы физической сущности решаемой задачи. И тогда возникает проблема установления правильности постановки задачи. Технически эта проблема несколько проще проблемы доказательства правильности программы. А теоретически проблема исследования правильности постановки задачи находится в начальной стадии ее формулировки. Сущность синтеза программ состоит в следующем. Если знания не полны, то решение задачи не может быть получено. Чаще других причин существует причина отсутствия варьируемых исходных данных. Тогда строят программу по «сырому» решению и через запуск программы с вводимыми исходными данными осуществляется проверка истины для всего задания (задачи). Если истина не определяется, то выдаются условия для получения истины. Выводимые условия окончательно определяют решение задачи. Решение при этом выглядит как альтернативы совместных фактов. Каждый факт - имя и полученное значение для понятия с этим именем или имя и выражение, если знания об операциях не полны. Итак, программа реализует динамическое «вычисление» истины (или лжи) или условия, при которых задание будет истинным. Программы продолжает поиск решения задания, но с изменяющимися исходными данными. Результаты работы программ могут использоваться далее с каким-либо назначением, например, для их анализа. Анализ результатов производится для установления соответствия между физической сущностью проблемы и программной моделью. Анализ может быть связан просто с поиском ошибок в задании. МЕТОДЫ ПРОГРАММИРОВАНИЯ: 1. Процедурное (императивное) программирование. 2. Структурное программирование. 3. Автоматное программирование. 4. Функциональное программирование. 5. Логическое программирование. 6. Объектно-ориентированное программирование. 7. Прототипное программирование. 8. Аспектно-ориентированное программирование. 9. Модульное программирование. Процедурное (императивное) программирование является отражением архитектуры традиционных ЭВМ, которая была предложена фон Нейманом в 40-х годах. Теоретической моделью процедурного программирования служит алгоритмическая система под названием «машина Тьюринга». Программа на процедурном языке программирования состоит из последовательности операторов (инструкций), задающих процедуру решения задачи. Основным является оператор присваивания, служащий для изменения содержимого областей памяти. Концепция памяти как хранилища значений, содержимое которого может обновляться операторами программы, является фундаментальной в императивном программировании Выполнение программы сводится к последовательному выполнению операторов с целью преобразования исходного состояния памяти, то есть значений исходных данных, в заключительное, то есть в результаты. Таким образом, с точки зрения программиста имеются программа и память, причем первая последовательно обновляет содержимое последней. Языки императивного программирования: Ада (язык общего назначения), Бейсик (начиная с версии Quick Basic и до появления Visual Basic), Си, ДРАКОН, КОБОЛ, ФОРТРАН, Модула-2, Паскаль, ПЛ/1, Рапира, REXX. Структурное программирование — методология разработки и проектирования программного обеспечения, в основе которой лежит представление и структуризация программы в виде иерархической структуры блоков. Предложена в 70-х годах XX века Э. Дейкстрой, разработана и дополнена Н. Виртом и Харланом Милзом. Технология структурного программирования и проектирования в 80-ых годах ХХ века была описана в школьных и вузовских учебниках информатики А.П.Ершова, В.А.Каймина и А.Г.Кушниренко. Структурный подход к разработке программного обеспечения имеет два подхода: 1. Использование языков структурного программирования (языки Pascal, C, Ada, Modula, Java и т.д.). 2. Структурное проектирование программ с использованием структурированных алгоритмов, записываемых на структурном псевдокоде с использованием лексики родного (русского языка) для документирования всего комплекса программ, предложенного Харланом Миллзом (IBM,1972) и В.А.Кайминым (МИЭМ,1978-1983 В соответствии с данной методологией: 1. Структурированная программа (структурированный алгоритм) представляет собой структуру, построенную из трёх типов базовых конструкций: o последовательное исполнение — однократное выполнение операций в том порядке, в котором они записаны в тексте программы (алгоритма) o альтернативное исполнение — однократное выполнение одной из двух или более операций, в зависимости от выполнения некоторых заданных условий o цикл — многократное исполнение одной и той же операции вплоть до выполнения некоторых заданных условий (условий продолжения либо завершения цикла). В современных языках программирования «ветвления» допускают несколько альтернативных операций, а в «циклах» - несколько условий выхода с различными условиями выхода из цикла. Структурный псевдокод в силу его гибкости допускает многоальтернативные ветвления и циклы, используемые в наиболее современных языках программирования, для которых В.А.Кайминым были предложены оригинальные процедуры верификации и анализа правильности алгоритмов, изложенные с самого начала в учебниках информатики. 2. В структурированных алгоритмах и программах базовые конструкции могут быть вложены друг в друга произвольным образом, но никаких других средств управления последовательностью выполнения операций не предусматривается 3. Повторяющиеся фрагменты программы (представляющие собой логически целостные вычислительные блоки) могут оформляться в виде т. н. подпрограмм (процедур, функций или модулей). В этом случае в тексте основной программы, вместо помещённого в подпрограмму фрагмента, вставляется инструкция вызова подпрограммы. При выполнении такой инструкции выполняется вызванная подпрограмма, после чего исполнение программы продолжается с инструкции, следующей за командой вызова подпрограммы. Разработка структурированных программ ведётся пошагово, методом «сверху вниз» Структурное проектирование программ означает, что сначала пишется текст основной программы, в котором, вместо каждого связного логического фрагмента текста, вставляется вызов подпрограммы, которая будет выполнять этот фрагмент. Вместо настоящих, работающих подпрограмм, в программу вставляются «заглушки», которые ничего не делают. Полученная программа проверяется и отлаживается. После того, как программист убедится, что подпрограммы вызываются в правильной последовательности (то есть общая структура программы верна), подпрограммы-заглушки последовательно заменяются на реально работающие, причём разработка каждой подпрограммы ведётся тем же методом, что и основной программы Разработка заканчивается не тогда, когда не останется ни одной «затычки», которая не была бы удалена, а когда протестирован каждый модуль, функция и подпрограмма. Тестирование и разработку программ можно вести как «сверху-вниз» так и «снизу-вверх» от автономной к комплексной отладке. Такая последовательность гарантирует, что на каждом этапе разработки программист одновременно имеет дело с обозримым и понятным ему множеством фрагментов, и может быть уверен, что общая структура всех более высоких уровней программы верна. При сопровождении и внесении изменений в программу выясняется, в какие именно процедуры нужно внести изменения, и они вносятся, не затрагивая части программы, непосредственно не связанные с ними. Это позволяет гарантировать, что при внесении изменений и исправлении ошибок не выйдет из строя какая-то часть программы, находящаяся в данный момент вне зоны внимания программиста Автоматное программирование — это парадигма программирования, при использовании которой программа или её фрагмент осмысливается как модель какого-либо формального автомата. В зависимости от конкретной задачи в автоматном программировании могут использоваться как конечные автоматы, так и автоматы более сложной структуры Определяющими для автоматного программирования являются следующие особенности: 1. Временно́й период выполнения программы разбивается на шаги автомата, каждый из которых представляет собой выполнение определённой (одной и той же для каждого шага) секции кода с единственной точкой входа; такая секция может быть оформлена, например, в виде отдельной функции и может быть разделена на подсекции, соответствующие отдельным состояниям или категориям состояний. 2. Передача информации между шагами автомата осуществляется только через явно обозначенное множество переменных, называемых состоянием автомата; между шагами автомата программа (или её часть, оформленная в автоматном стиле) не может содержать неявных элементов состояния, таких как значения локальных переменных в стеке, адреса возврата из функций, значение текущего счётчика команд и т.п.; иначе говоря, состояние программы на любые два момента входа в шаг автомата могут различаться между собой только значениями переменных, составляющих состояние автомата (причём такие переменные должны быть явно обозначены в качестве таковых). Полностью выполнение кода в автоматном стиле представляет собой цикл (возможно, неявный) шагов автомата. Название автоматное программирование оправдывается ещё и тем, что стиль мышления (восприятия процесса исполнения) при программировании в этой технике практически точно воспроизводит стиль мышления при составлении формальных автоматов (таких как машина Тьюринга, автомат Маркова и др.). Функциональное программирование — раздел дискретной математики и парадигм программирования, в которой процесс вычисления трактуется как вычисление значений функций в математическом понимании последних (в отличие от функций как подпрограмм в процедурном программировании). Противопоставляется парадигме императивного программирования, которая описывает процесс вычислений как последовательность изменения состояний (в значении, подобном таковому в теории автоматов). Функциональное программирование не предполагает изменяемость данных (в отличие от императивного, где одной из базовых концепций является переменная). На практике отличие математической функции от понятия «функции» в императивном программировании заключается в том, что императивные функции взаимодействуют и изменяют уже определенные данные. Таким образом, в императивном программировании, при вызове одной и той же функции с одинаковыми параметрами можно получить разные данные на выходе, из-за влияния на функцию внешних факторов. А в функциональном языке при вызове функции с одними и теми же аргументами мы всегда получим одинаковый результат в обоих случаях, входные данные не могут измениться, выходные данные зависят только от них λ-исчисления являются основой для функционального программирования, многие функциональные языки можно рассматривать как «надстройку» над ними Наиболее известными языками функционального программирования являются: o Haskell – чистый функциональный. Назван в честь Хаскелла Карри; o LISP (Джон МакКарти, 1958); o ML (Робин Милнер, 1979); o Miranda (Дэвид Тёрнер, 1985), впоследствии дал развитие языку Haskell o Erlang (Джой Армстронг, 1986), функциональный язык с поддержкой процессов o Nemerle – гибридный функционально/императивный язык Еще не полностью функциональные изначальные версии и Lisp и APL внесли особый вклад в создание и развитие функционального программирования. Более поздние версии Lisp, такие как Scheme, а так же различные варианты APL поддерживали все свойства и концепции функционального языка Как правило, интерес к функциональным языкам программирования, особенно чисто функциональным, был сугубо научный, нежели коммерческий. Однако, таким примечательным языкам как Erlang, OCaml, Haskell, Scheme (после 1986) а так же специфическим R (статистика), Mathematica (символическая математика), J и K (финансовый анализ), и XSLT (XML) находили применение в индустрии коммерческого программирования. Такие широко распространенные декларативные языки как SQL и Lex/Yacc содержат некоторые элементы функционального программирования, они остерегаются использовать переменные. Языки работы с электронными таблицами также можно рассматривать как функциональные. Многие нефункциональные языки, такие как C, C++ и C# могут вести себя как функциональные при использовании указателей на функцию, в соответствие с библиотекой <functional> и λ-исчислениями. Логическое программирование — парадигма программирования, основанная на автоматическом доказательстве теорем, а также раздел дискретной математики, изучающий принципы логического вывода информации на основе заданных фактов и правил вывода. Логическое программирование основано на теории и аппарате математической логики с использованием математических принципов резолюций. Самым известным языком логического программирования является Prolog, являющийся по своей сути универсальной машиной логического вывода, работающей в предположении замкнутости мира фактов и используемой для логического подхода к решению проблем искусственного интеллекта. Язык Пролог, принципы и законы логического вывода, элементы математической логики, а также принципы проектирования баз знаний и экспертных систем были включены в первые школьные и вузовские учебники информатики В. А. Каймина. В этих целях интерпретаторы Пролога были реализованы на ряде отечественных школьных ЭВМ. Первым языком логического программирования был язык Planner, в котором была заложена возможность автоматического вывода результата из данных и заданных правил перебора вариантов (совокупность которых называлась планом). Planner использовался для того, чтобы понизить требования к вычислительным ресурсам (с помощью метода backtracking) и обеспечить возможность вывода фактов, без активного использования стека. Затем был разработан язык Prolog, который не требовал плана перебора вариантов и был, в этом смысле, упрощением языка Planner. От языка Planner также произошли логические языки программирования QA-4, Popler, Conniver и QLISP. Языки программирования Mercury, Visual Prolog, Oz и Fril произошли уже от языка Prolog. На базе языка Planner было разработано также несколько альтернативных языков логического программирования, не основанных на методе backtracking, например, Ether. Объектно-ориентированное программирование (ООП) — парадигма программирования, в которой основными концепциями являются понятия объектов и классов (либо, в менее известном варианте языков с прототипированием — прототипов). Класс — это тип, описывающий устройство объектов. Понятие «класс» подразумевает некоторое поведение и способ представления. Понятие «объект» подразумевает нечто, что обладает определённым поведением и способом представления. Говорят, что объект — это экземпляр класса. Класс можно сравнить с чертежом, согласно которому создаются объекты. Обычно классы разрабатывают таким образом, чтобы их объекты соответствовали объектам предметной области. Класс является описываемой на языке терминологии (пространства имён) исходного кода моделью ещё не существующей сущности, т. н. объекта. Объект — сущность в адресном пространстве вычислительной системы, появляющаяся при создании экземпляра класса (например, после запуска результатов компиляции (и линковки) исходного кода на выполнение). Прототип — это объект-образец, по образу и подобию которого создаются другие объекты. Прототипное программирование — стиль объектно-ориентированного программирования, при котором отсутствует понятие класса, а повторное использование (наследование) производится путём клонирования существующего экземпляра объекта — прототипа. Каноническим примером прототип-ориентированного языка является язык Self. В дальнейшем этот стиль программирования начал обретать популярность и был положен в основу таких языков программирования, как JavaScript, Cecil, NewtonScript, Io, Slate, MOO, REBOL, Kevo и др Аспектно-ориентированное программирование (АОП) — парадигма программирования, основанная на идее разделения функциональности, особенно сквозной функциональности, для улучшения разбиения программы на модули. Методология аспектно-ориентированного программирования была предложена группой инженеров исследовательского центра Xerox PARC под руководством Грегора Кикзалеса (Gregor Kiczales). Ими же был разработан первый, и наиболее успешный до сих пор, контекстно-ориентированный язык программирования AspectJ. Существующие парадигмы программирования, такие как процедурное программирование и объектно-ориентированное программирование, предоставляют некоторые способы для разделения и выделения функциональности, например, функции, объекты, классы, пакеты, но некоторую функциональность с помощью предложенных методов невозможно выделить в отдельные сущности. Такую функциональность называют сквозной, так как её реализация разбросана по различным модулям программы. Сквозная функциональность приводит к рассредоточенному и запутанному коду. Запутанным называется такой код, в котором одновременно реализована различная функциональность. Трассировка — типичный пример сквозной функциональности. Другие примеры: контрактное программирование, в частности проверка пред- и пост-условий, обработка ошибок, реализация систем безопасности. Если рассматривать программу написанную с помощью ООП, то любая функциональность, по которой не происходила декомпозиция программы, является сквозной. Все языки АОП предоставляют способы для выделения сквозной функциональности в отдельную сущность. Различие между ними заключается в удобстве, безопасности и области применения средств, которые они предоставляют. Наиболее популярный на данный момент язык АОП — AspectJ. Используемые в нем понятия распространились на большинство языков АОП. Основные понятия AspectJ: Точка выполнения (англ. JoinPoint) — определенная точка выполнения программы; Срез (англ. PointCut) — набор точек выполнения программы. Применение (англ. Advice) — состоит из условий применения и реализации функциональности. Условия применения определяют до, после или вместо какого среза надо вставить требуемую функциональность Аспект (англ. Aspect) — модуль AspectJ. Представление (англ. Introduction) — метод изменения структуры класса путем введения новых полей и методов, а также изменения иерархии наследования
Дата добавления: 2014-01-05; Просмотров: 1249; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |