ывап. Курс лекций новосибирск 2015
Скачать 1.73 Mb.
|
Что? Что должно получиться в результате решения задачи? Каковы исходные данные, обработку которых будет выполнять программа? В каком виде будет представлен результат обработки данных? Как? Как будет устроена программа обработки? Каков алгоритм обработки данных? Из каких действий выстраивается функционирование программы? Кто? Кто сумеет выполнить разработку? Какой должна быть его квалификация? Сможет ли он довести программирование до нужного уровня работоспособности программы на имеющемся оборудовании в заданный срок? При разнообразии ответов на эти и многие другие сопутствующие вопросы возникли основания для выделения в ЖЦП возможных дополнительных фаз, существенных для зрелого долгоживущего производства, подразумевающего модернизацию программ и эволюцию требований к программе. По мере расширения классов решаемых задач и областей приложения их решений сложилась каскадная схема ЖЦП, в которой задаются критерии завершения фаз, позволяющие управлять качеством разработки. Т а б л и ц а 1 Условия завершения фазы ЖЦП № фазы Название фазы Условие завершения фазы 0 постановка задачи удостоверена достаточность средств управления качеством разрабатываемой программы; 1 определение требований признана готовность документа, 21 представляющего обзор желаемых результатов работы программы; 2 спецификация требований выполнен выбор средств для подтверждения результатов программы; 3 проектирование определены методы верификации правильности проекта; 4 реализация программы проведено тестирование компонент программы на полном комплекте выбранных средств; 5 тестирование выполнена интеграция/сборка программы из ранее готовых и разработанных компонентов; 6 сопровождение проведена аттестация программы, показавшая фактические границы еѐ работоспособности; 7 развитие проверено соответствие функционирования программы пользовательским требованиям к решению задачи. Расширение класса задач, методы решения которого находятся на уровне предварительного исследования, привели к табличному представлению совмещения фаз по времени выполнения разработки подобно диаграммам Г. Гантера. Шаги процесса разработки структурированы на фазы и технологические функции, образующие двумерное пространство с разметкой контрольных точек и возможных фазовых возвратов. Фазы: 1) исследование; 2) анализ осуществимости; 3) конструирование возможных решений; 4) программирование; 5) оценка свойств программы; 6) использование программы. Функции: 1) планирование; 2) разработка; 3) обслуживание; 4) документирование; 22 5) испытание; 6) поддержка; 7) сопровождение. При создании такой таблицы рекомендовано учитывать следующие явления: – программы подвержены итеративному развитию; – существуют стабильные сценарии применения программы; – неизбежно наращивание комплекса программируемых и выполняемых функций; – ничто в разработке на делается однократно – раз и навсегда; – не исключено размножение числа фаз. Проявление зависимости трудоѐмкости программирования от степени изученности/новизны решаемых задач наряду с высокой технологичностью программирования, допускающей перевод любых изученных задач в ранг готовых библиотечных модулей, привело к понятию «полный жизненный цикл программы» (ПЖЦП). Отличие от ЖЦП заключается в представлении схем, отражающих стадии созревания постановки задачи и допускающих развитие пространства реализуемых решений по мере продвижения от первых демонстрационных версий, прототипов, макетных образцов программы к готовому программному продукту, пригодному к полноценному функционированию без участия программиста. С физической точки зрения программа не имеет износа. Неожиданности в ее функционировании могут быть связаны не столько с незамеченными при разработке недочѐтами, но и с появлением несоответствия принятых решений новым возможностям оборудования, изменению квалификации пользователей, развитию методов программирования. Поэтому программы подвержены моральному устареванию, которое влечѐт за собой продолжение разработки программ с ранее завершенным ЖЦП, что приводит к уточнению перечня этапов разработки программы. Схемы ПЖЦП выделяют стадии жизни программы, учитывающие разные степени изученности решаемых задач, что позволяет объективно оценивать число необходимых повторов в производстве программ. Минимизацию повторов обеспечивают созданием специальных промышленных технологий программирования, противоречиво наследующих преимущества каскадной схемы ЖЦП и управления качеством по таблицам Гантера: – форсированное принятие решений – сразу и как можно больше; 23 – управление качеством и профилактика необоснованных преждевременных решений. Контрольные точки, используемые при управлении качеством, содержательно перекликаются с определениями критериев завершения фазы в каскадной схеме. Для больших систем собственно программирование сводится к реализации или выбору модулей, сборке программ из модулей и документированию полученных результатов. Следует отметить, что реализация модулей обладает существенно большей (в 3–9 раз) трудоѐмкостью, чем разработка функционально эквивалентных автономных программ. Сборка программ из готовых модулей имеет дополнительную нагрузку на ответственное изучение их устройства и функционирования. Известно, что развитие постановок задач по степени изученности не обладает монотонностью изменения трудоѐмкости реализации текущей версии программы. А именно, после небольших трудозатрат на разработку макетного образца, где главная цель – показать достоинства идеи, создание экспериментального полигона требует принципиально значительных трудозатрат на полноту исследования и разработки средств и методов решения задачи и определения границ практичности еѐ реализации. Интуитивная оценка трудоѐмкости реализации практичной версии в ранге производственного компромисса существенно меньше, что обычно провоцирует экономию на предварительных исследованиях в надежде угадать границы практичности, но обычно приводит к необходимости многократного версифицирования решения задачи. Следует обратить внимание, что за понятием ПЖЦП стоит понятие «жизненный цикл новой задачи, решаемой методом разработки долго живущей программы». Можно сказать, что каждая стадия, этап, фаза заключается в том, что происходит уточнение информации о постановке решаемой задачи в изменяющихся условиях применения еѐ решения. В практике программирования встречается целый ряд схем ЖЦП, отличающихся по стилю мышления при постановке задач и подходам к методам решения задачи. Выбор ПП не только влияет на трудоѐмкость, но и в заметной степени определяет работоспособность и живучесть разрабатываемой программы. 1.4. Развитие парадигм программирования Знакомое из философии и лингвистики слово «парадигма» имеет в информатике и программировании узкопрофессиональный смысл. Парадигма программирования как исходная концептуальная схема 24 постановки проблем и их решения является инструментом грамматического описания фактов, событий, явлений и процессов, возможно, не существующих одновременно, но интуитивно объединяемых в общее понятие. Наиболее распространѐнная практика прикладного программирования на основе императивного управления и процедурно-операторного стиля построения программ получила популярность более пятидесяти лет назад в сфере узкопрофессиональной деятельности специалистов по организации вычислительных и информационных процессов. Специалисты в области теоретического и экспериментального программирования исследовали значимость и фундаментальность формальных моделей в программировании и эффективных средств их реализации. Последние десятилетия резко расширили географию информатики, распространив ее на сферу массового общения и досуга. Это меняет критерии оценки информационных систем и предпочтения в выборе средств и методов обработки информации. Прикладное программирование подчинено проблемной направленности, отражающей компьютеризацию информационных и вычислительных процессов численной обработки, исследованных задолго до появления ЭВМ. Именно здесь быстро проявился явный практический результат. Естественно, в таких областях программирование мало чем отличается от кодирования: для него, как правило, достаточно операторного стиля представления действий. В практике прикладного программирования принято доверять проверенным шаблонам и библиотекам процедур, избегать рискованных экспериментов. Ценится точность и устойчивость научных расчетов. Язык Fortran – ветеран прикладного программирования, постепенно стал несколько уступать в этой области языкам Pascal и C, а на суперкомпьютерах – языкам параллельного программирования, таким как Sisal. Теперь к ним присоединяются нововведения в Java, C#, Scala. Теоретическое программирование нацелено на наглядность и сопоставимость представимых в публикациях результатов научных экспериментов в области программирования и информатики. Формальные модели унаследовали основные черты родственных математических понятий и утвердились как алгоритмический подход в информатике. Стремление к доказательности построений и оценка их эффективности, правдоподобия, правильности, корректности и других формализуемых отношений на схемах и текстах программ послужили основой структурного программирования и других методик достижения надежности процесса разработки программ, например, предложенное Д. Кнутом «грамотное 25 программирование». Стандартные подмножества Алгола и Паскаля, послужившие рабочим материалом для теории программирования, сменились более удобными для экспериментирования аппликативными языками, такими как ML, Miranda, Scheme, Haskell, Real, C-light и другие. Экспериментальное программирование сформировалось при исследовании задач системного программирования, искусственного интеллекта и освоения новых горизонтов в информатике. Абстрактный подход к представлению информации, лаконичный, универсальный стиль построения функций, ясность обстановки исполнения для разных категорий функций, свобода рекурсивных построений, доверие интуиции математика и исследователя, уклонение от бремени преждевременного решения непринципиальных проблем распределения памяти, отказ от необоснованных ограничений на область действия определений – все это увязано Джоном Маккарти в идее универсального языка Lisp. Продуманность и методическая обоснованность первых реализаций Lisp-а позволила быстро накопить опыт решения новых задач, подготовить их для прикладного и теоретического программирования, что привело к кристаллизации идей функционального программирования (ФП). В настоящее время существуют сотни функциональных языков программирования, ориентированных на разные классы задач и виды технических средств. В наши дни признают в качестве основных парадигм программирования: ИП, ФП, логическое программирование (ЛП) и объектно-ориентированное программирование (ООП) – и отмечают образовательное значение таких базовых парадигм программирования как ФП, параллельное программирование, ИП, рассматривая ЛП и ООП как расширения базовых парадигм. Важно отметить, что основные ПП по-разному проявляют себя на разных классах задач, и выбор ПП влияет на трудоѐмкость программирования, успешность технологии программирования и надѐжность применения программ. 1.5. Эксплуатационная прагматика Отметим ключевые положения эксплуатационной прагматики: – критерии качества программ могут изменяться в процессе программирования, что возможно повлечѐт существенный пересмотр многих ранее принятых решений; 26 – развитие систем представления знаний сводится к чередованию фаз восходящего и нисходящего уточнения информации, что влияет на выбор технологии программирования; – степень изученности решаемых задач – ведущий фактор прогноза трудоѐмкости достижения работоспособной программы, пригодной для неавторского применения; – технологии программирования обеспечивают гарантированное получение результата разработки при условии соответствия технологическим требованиям; – тестирование и отладка программы требуют специального обустройства, средства которого за редким исключением не представлены в ЯП, но могут содержаться в СП; – сходимость ЖЦП обеспечивается грамотным выбором соответствия степени изученности решаемой задачи и схемы ЖЦП, допускающей при подходящей технологии выполнение отладки программы, удовлетворяющей заданному критерию качества; – ранг работоспособности реализованных решений зависит от полноты и универсальности программных компонент, созданных при разработке программы. Выводы 1. Выбор ПП влияет на успех ТП и трудоѐмкость ПЖЦП, а также на повышение изученности решаемой задачи, включая методы еѐ решения, на организованность, работоспособность и живучесть разрабатываемой программы. 2. ПП проявляется в удобстве уточнения постановки задачи, метода еѐ решения, декомпозиции программы на фрагменты, модули, аспекты или компоненты и представления принятых в проекте решений в терминах лексикона программирования и ЯСП, поддерживающих данную ПП. 3. Классификация ЯСП по поддерживаемым ПП требует анализа их операционной семантики и реализационной прагматики. 27 ЛЕКЦИЯ 2. ПОДДЕРЖКА ПАРАДИГМ ПРОГРАММИРОВАНИЯ Задача этой лекции – показать, каким образом определение языка программирования (ЯП) и его реализация в системе программирования (СП) поддерживают разные парадигмы программирования (ПП). Рассмотрим средства и методы, используемые при определении языков программирования и их расширение при реализации систем программирования. Для примеров используется материал языка Pure Lisp и структурного программирования на языке Pascal. Обычно определение ЯП задается раздельно на уровнях лексики, синтаксиса, семантики и прагматики. Реализация СП для определѐнной семантики ЯП может быть выполнена как интерпретатор или компилятор или и то и другое совместно. Компиляция может выполняться как для всей программы полностью, так и раздельно для указанных функций/процедур, в том числе «на лету». Лексически близкие ЯП могут привлекать удобочитаемостью на первых шагах отладки программ. Новые ЯП обычно избегают синтаксически сложно распознаваемых конструкций и сразу ориентируются на автоматическое построение распознавателей. Это способствует уменьшению числа ошибок при подготовке программ. Вариации лексики и синтаксиса влияют на удобочитаемость программ и распознавание принадлежности текста ЯП. Синтаксически подобные ЯП могут быть удобны при подготовке и преобразовании программ при их переносе на другие системы. Т а б л и ц а 2 Синтаксис бестипового учебного концентра языка Pascal 3 БНФ Пояснение ident = letter {letter | digit} Идентификатор integer = digit {digit} Целое factor = ident | integer | "(" expression ")". expression = factor [("=" | "<" | "+"|"-" | "*" | "DIV" ) factor Выражение: = < – Отношения между числами + - * DIV – Операции над числами statement = [assignment | ProcedureCall | IfStatement | WhileStatement] Оператор assignment = ident ":=" expression Присваивание StatementSequence = statement {";" statement} Последовательность исполнения 3 Понятие «тип данных» будет привлечено позднее. 28 команд IfStatement = "IF" expression "THEN" StatementSequence ["ELSE" StatementSequence] "END" Ветвление WhileStatement = "WHILE" expression "DO" StatementSequence "END" Цикл IdentList = ident {"," ident}. FormalParameters = "(" [IdentList {";" = ["VAR"] IdentList }] ")". ProcedureHeading = "PROCEDURE" ident [FormalParameters]. ProcedureBody = declarations ["BEGIN" StatementSequence] "END" ident. ProcedureDeclaration = ProcedureHeading ";" ProcedureBody. declarations = ["CONST" {ident "=" expression ";"}] ["VAR" {IdentList;"}] Определение функции ActualParameters = "(" [expression {"," expression}] ")" ProcedureCall = ident [ActualParameters] Вызов функции module = "MODULE" ident ";" declarations ["BEGIN" StatementSequence] "END" ident "." Ряд ЯП представляет программы непосредственно как структуры данных, используемые при представлении и выполнении программы. В таком случае синтаксис выглядит проще. Используется его конкретизация для семантической сопоставимости с другими ЯП. 29 Т а б л и ц а 3 Синтаксис учебного концентра языка Lisp Конкретизация синтаксиса для представления семантики Пояснение форма ::= переменная | (QUOTE S- выражение) | (COND {(форма форма)} | (функция {аргумент}) Переменная Константа Ветвление Вызов функции аргумент ::= форма переменная ::= идентификатор функция ::= название | (LAMBDA список_переменных форма) | (FUNC название функция) Имена, включая операции над списками Безымянная функция Именование функции список_переменных ::= ({переменная} ) Любое число, возможно ни одного название ::= идентификатор идентификатор ::= атом Собственно синтаксис и лексика S- выражение ::= атом | (S- выражение . S-выражение) | ({S- выражение} ) Атом Консолидация Список атом ::= БУКВА {БУКВА | ЦИФРА} Исключение «синтаксического сахара» в ЯП обеспечивает внутреннее понимание сущности реализуемого алгоритма при подготовке и отладке программы автором. Определение лексики и синтаксиса ЯП неявно связано с реализационной прагматикой (РП) той или иной ПП, поэтому без их детального рассмотрения переходим к анализу особенностей семантики и прагматики ЯП. 2.1 Семантика Проблема определения ЯП и СП наиболее тщательно проработана в Венской методике определения языков программирования. Эта методика разработана в конце 60-х годов. Основная идея – использование абстрактного синтаксиса (АС) и абстрактной машины (АМ) при определении семантики языка программирования. Конкретный синтаксис 30 (КС) языка отображается в абстрактный, а абстрактная машина может быть реализована с помощью конкретной машины (КМ), причем и отображение и реализация могут иметь небольшой объем и невысокую сложность. Диаграмма Пояснение КС ↔ АС → АМ → КМ Существует отображение конкретного синтаксиса в абстрактный и обратно. Абстрактный синтаксис отображается в абстрактную машину. Абстрактная машина реализуется с помощью конкретной машины. Рис. 1. Схема декомпозиции определения ЯП по Венской методике Любое определение анализа текста программы выглядит как перебор распознавателей, передающих управление композициям из селекторов, достаточно определить набор распознавателей, выявляющих эти понятия, и селекторов, выделяющих их характеристики. Селекторы имеют смысл лишь при истинности соответствующего распознавателя. Т а б л и ц а 4 |