Глава 36. ВИЗУАЛЬНЫЙ СТРУКТУРНЫЙ ПОДХОД К АЛГОРИТМАМ И ПРОГРАММАМ (ШАМПУР-МЕТОД) Удобнее читать здесь§1. ВВЕДЕНИЕ Напомним, что книга посвящена алгоритмам. Вопросы программирования в ней не рассматриваются. Данная глава является исключением. Глава посвящена исследованию и развитию фундаментального понятия «структурное программирование». Мы будем использовать это понятие в первую очередь применительно к алгоритмам. И лишь иногда – к программам.
§2. ТЕРМИНОЛОГИЯ Введем понятие «визуальный структурный подход к алгоритмам и программам». Определим его как набор правил, совпадающий с визуальным синтаксисом языка ДРАКОН. В концентрированном виде эти правила изложены в главе 33. Данный подход предназначен для решения двух задач:
• создания наглядных, понятных и удобных для человеческого восприятия алгоритмов и программ;
• автоматического доказательства правильности шампур-схем (то есть графической части дракон-схем).
Наряду с термином «визуальный структурный подход к алгоритмам и программам» мы будем для краткости (в качестве синонима) использовать термин «шампур-метод».
Можно сказать, что данная книга – это подробное описание шампур-метода.
§3. ДВА СТРУКТУРНЫХ ПОДХОДА Как показано в работе [1], следует различать два структурных подхода:
• одномерный (текстовый) подход;
• двумерный (визуальный) подход.
Первый подход создан основоположниками компьютерной науки и уточнен их последователями. Одномерный структурный подход известен под названием «структурное программирование». Он широко используется в мировой практике программирования.
Второй подход разработан автором, изложен в этой книге и других работах (см. раздел «Основная литература по языку ДРАКОН»).
§4. ПОСТАНОВКА ПРОБЛЕМЫ
Размышляя над проблемой, автор пришел к следующим предварительным выводам или, лучше сказать, предположениям.
• Несмотря на наличие целого ряда общих признаков, текстовое и визуальное структурное программирование – существенно разные вещи.
• Традиционный (текстовый) структурный подход является, по-видимому, наилучшим решением соответствующей задачи для традиционного (текстового) структурного программирования
• Для визуального подхода подобное утверждение неправомерно. Можно, конечно, тупо перенести правила текстового структурного программирования на визуальный случай. Но это не будет хорошим решением.
• Чтобы разработать эффективный метод структуризации для визуального варианта, необходимо, взяв за основу правила текстового структурного программирования, значительно модифицировать их.
• Принципы структуризации, положенные в основу визуального синтаксиса языка ДРАКОН, являются искомым решением. В данной главе сделана попытка обосновать заявленные выводы.
§5. СТРУКТУРНОЕ ПРОГРАММИРОВАНИЕ Понятие «структурное программирование» во многом связано с именем Эдсгера Дейкстры. Данное понятие охватывает две темы:
• доказательство правильности программ (program correctness proof);
• метод структуризации программ.
Ниже рассмотрены обе темы. Первая тема изложена в §§6 и 7. Вторая описана, начиная с §8.
§6. СТРУКТУРНОЕ ПРОГРАММИРОВАНИЕ КАК ДОКАЗАТЕЛЬСТВО ПРАВИЛЬНОСТИ ПРОГРАММ В середине ХХ века появились компьютеры и компьютерные программы. В ту раннюю эпоху теория программирования еще не существовала.
Разработка программ велась методом проб и ошибок. И выглядела примерно так: «написать код программы – проверить код на компьютере (протестировать) – найти ошибки – исправить код – снова протестировать – снова найти ошибки – снова исправить и т. д.».
Эдсгер Дейкстра осудил подобную практику и указал, что господствующий в компьютерной индустрии подход к программированию как к процессу достижения результата методом проб и ошибок порочен, поскольку стимулирует программистов не думать над задачей, а сразу писать код.
Чтобы исправить положение, Дейкстра предложил использовать математический подход к программированию. Такой подход, в частности, подразумевает формальное доказательство правильности выбранного алгоритма и последующую реализацию алгоритма в виде структурной программы, правильность которой должна быть формально доказана.
В «Заметках по структурному программированию» Дейкстра пишет:
Цитата:
«… необходимость продуманной структурной организации прог раммы представляется как следствие требования о доказуемости правильности программы» [2, с. 52].
В толковом словаре читаем:
Цитата:
«Основным назначением общего метода структурного программирования, разработанного в значительной степени Э. Дейкстрой, является обеспечение доказательства правильности программы… (program correctness proof)» [3, с. 463].
Таким образом, согласно Дейкстре, структурное программирование подразумевает доказательство правильности программ.
§7. ЧЕМ РАЗЛИЧАЮТСЯ НАШ ПОДХОД К ДОКАЗАТЕЛЬСТВУ ПРАВИЛЬНОСТИ И ПОДХОД ДЕЙКСТРЫ? Мы используем идею Дейкстры о доказательстве правильности программ, развивая ее и перенося на абстрактные дракон-схемы (шампур-схемы).
В главе 34 мы разработали логическое исчисление икон, которое определяет порядок работы дракон-конструктора. Благодаря этому дракон-конструктор осуществляет автоматическое доказательство правильности шампур-схем.
В чем отличие от подхода Дейкстры? Во-первых, мы говорим не о полном, а о частичном доказательстве правильности.
Во-вторых, Дейкстра предлагает программистам доказывать правильность программ не автоматически, а вручную с помощью разработанных им математических методов (преобразование предикатов и др.) [4].
Мы же предлагаем доказывать правильность не вручную, а автоматически.
В главе 34 мы доказали, что исчисление икон истинно. Отсюда вытекает, что если дракон-конструктор спроектирован правильно (то есть, если он точно реализует исчисление икон), то любая дракон-схема, созданная пользователем с помощью дракон-конструктора, будет гарантированно иметь правильную графическую часть.
Таким образом, однократное доказательство истинности исчисления икон влечет за собой тот факт, что десятки и сотни тысяч дракон-схем, (созданных с помощью дракон-конструктора) будут иметь автоматически доказанную правильную графику.
Нет никакой необходимости многократно повторять доказательство, то есть доказывать правильность графической части для каждой из десятков или сотен тысяч дракон-схем.
Частичное доказательство правильности алгоритма с помощью дракон-конструктора осуществляется без какого-либо участия человека и достигается совершенно бесплатно, так как дополнительные затраты труда, времени и ресурсов не требуются. Так что полученный результат (безошибочное автоматическое проектирование графики алгоритмов) следует признать заметным шагом вперед.
§8. СТРУКТУРНОЕ ПРОГРАММИРОВАНИЕ КАК МЕТОД СТРУКТУРИЗАЦИИ ПРОГРАММ Основные положения метода общеизвестны:
• Алгоритм (программа) строится из частей (базовых управляющих структур).
• Каждая базовая управляющая структура имеет один вход и один выход.
• Для передачи управления используются три базовые управляющие структуры: последовательность, выбор, цикл.
§9. РАЗВИТИЕ КОНЦЕПЦИИ СТРУКТУРНОГО ПРОГРАММИРОВАНИЯ Работы основоположников структурного программирования послужили исходной идеей для разработки шампур-метода и языка ДРАКОН. Предлагаемый нами двумерный структурный подход – это непосредственное развитие классического одномерного структурного программирования.
Почему возникла необходимость в таком развитии, то есть в существенной доработке классических идей?
• Идеи структурного программирования разрабатывались, когда компьютерная графика фактически еще не существовала и основным инструментом программиста был одномерный (линейный или ступенчатый) текст.
• Создатели структурного программирования недооценили потенциальные возможности блок-схем (flow-charts). И не сумели дать блок-схемам строгое математическое обоснование, пригодное для трансляции блок-схем в объектные коды.
• Авторы структурного программирования не были знакомы с когнитивной эргономикой и не смогли превратить блок-схемы одновременно и в эргономичный, и в математический объект. Впрочем, они и не ставили перед собой такой задачи.
§10. ПЕРЕХОД ОТ ОДНОМЕРНОГО ТЕКСТА К ДВУМЕРНОЙ ГРАФИКЕ РОЖДАЕТ НОВЫЕ ВОЗМОЖНОСТИ Текстовые структурные управляющие конструкции сыграли позитивную роль. Они позволили улучшить структуру и удобочитаемость программ, уменьшить число ошибок и т. д. В сочетании с другими средствами они помогли, как иногда говорят, «превратить программирование из шаманства в науку».
Но у медали есть и другая сторона. Слабое место текста заключается в недостатке выразительных средств. Следствием являются ограничения и запреты. Эти ограничения и запреты вытекают из природы текста, из природы текстового структурного программирования.
Недостаток выразительных средств, проявляющийся через ограничения и запреты, тормозит повышение производительности труда алгоритмистов и программистов.
В рамках одномерного текста устранить эти ограничения и запреты невозможно. Но это вовсе не значит, что ситуацию в принципе нельзя улучшить. Чтобы добиться улучшения, надо перейти от текста к графике.
Точнее, перейти от одномерного текстового структурного программирования к двумерному визуальному структурному программированию.
Задача состоит в том, чтобы значительно уменьшить число запретов и ограничений. То есть предоставить алгоритмистам и программистам дополнительную свободу действий.
Эту задачу и решает язык ДРАКОН. Следуя по мудрому пути, начертанному основоположниками структуризации, визуальный язык ДРАКОН устраняет ненужные барьеры и препятствия. И позволяет совершить прыжок из царства необходимости в царство свободы.
Каким образом? Благодаря замене одномерного (текстового) структурного подхода на двумерный (визуальный) структурный подход. Последний, разумеется, также является системой правил. Но в «двумерной» системе правил значительная часть запретов снимается. То, что раньше было нельзя, теперь можно.
Многие запреты (неизбежные при текстовом структурном программировании) «перегибают палку». Они противоречат здравому смыслу и затрудняют понимание алгоритмов и программ.
§11. УПРАВЛЯЮЩИЕ СТРУКТУРЫ, КОТОРЫЕ ЗАПРЕЩЕНЫ В ТЕКСТОВОМ СТРУКТУРНОМ ПРОГРАММИРОВАНИИ И РАЗРЕШЕНЫ В ВИЗУАЛЬНОМ В книге приведено большое количество примеров таких структур. Здесь нет необходимости их повторять. Поэтому мы приведем только один пример. Рассмотрим схему на рис. 260.
В классическом структурном программировании управляющая структура на рис. 260 и многие другие запрещены. Они считаются неструктурными. Но такие алгоритмы часто встречаются на практике.
Что отсюда следует?
Наш ответ таков: текстовые управляющие структуры играли важную роль в эпоху текстового программирования. В ту пору они были единственно возможным решением. Но сегодня, в эпоху компьютерной графики и визуальной алгоритмизации (визуального программирования) подобные ограничения и запреты следует признать устаревшими. Потому что во многих случаях (хотя и не всегда) они искажают нормальный ход человеческой мысли.
Недопустимо запрещать правильный процесс мышления. Его надо разрешить. И ДРАКОН разрешает.
Подчеркнем еще раз. Наши предложения стали возможными благодаря предыдущим достижениям. Благодаря усилиям выдающихся ученых, создавших метод структурного программирования. Они опираются на фундамент, разработанный в эпоху текстового программирования. Поэтому наши предложения нельзя считать полностью новыми. Они лишь развивают разработанные классиками идеи и снимают ограничения, которые в ту эпоху (которая, кстати, еще не закончилась) были неизбежными.
§12. НОВАЯ ФИЛОСОФИЯ ПРОЦЕДУРНОГО ПРОГРАММИРОВАНИЯ В рамках философии языка ДРАКОН ключевые слова управляющих конструкций становятся ненужными. Они рассматриваются как лишние и даже вредные. В самом деле, глядя на дракон-схему, нельзя обнаружить эти ключевые слова даже под микроскопом. Почему? Потому что в языке ДРАКОН применяется совершенно другой понятийный аппарат (атомы, валентные точки и т. д.) – см. главы 32 и 33.
Смена понятийного аппарата – это переход к новому пониманию глубинной сущности вещей. То есть к новому мировоззрению в области императивного, процедурного программирования.
ДРАКОН – это не просто новый язык (новое семейство языков). Это новый взгляд на процедурное программирование. Если угодно – новое мировоззрение.
§13. ЗАМЕНИТЕЛИ GOTO Согласно классической теореме Бома и Джакопини, всякий реальный алгоритм (программа) может быть построена из функциональных блоков (операций) и двух конструкций: цикла и дихотомического выбора (развилки) [5]. Эдсгер Дейкстра обогатил и усилил эту идею, предложив отказаться от оператора безусловного перехода goto и ограничиться тремя управляющими конструкциями: последовательность, выбор, цикл [2, с. 25–28].
Дональд Кнут подверг критике тезис Дейкстры о полном исключении goto, продемонстрировав случаи, где goto полезен [6]. В итоге возникла плодотворная дискуссия, в ходе которой выявились четыре варианта мнений (табл. 1).
Таблица 1
Вариант 1 описывает ортодоксальную позицию Дейкстры, согласно которой оператор goto имеет «гибельные последствия» и поэтому «должен быть исключен из всех языков программирования высокого уровня». Исходя из этого, были разработаны языки без goto: Джава, Питон, Tcl, Модула-2, Оберон и др.
Вариант 2 отражает мнение ранних критиков Дейкстры, позиция которых выражается словами:
Цитата:
«использование оператора goto может оказаться уместным в лучших структурированных программах» [7];
Цитата:
«всегда были примеры программ, которые не содержат goto и аккуратно расположены лесенкой в соответствии с уровнем вложенности операторов, но совершенно непонятны, и были другие программы, содержащие goto, и все же совершенно понятные» [8, с. 134].
Цитата:
Нужно «избегать использования goto всюду, где это возможно, но не ценой ясности программы» [8, c. 137–138].
Как известно, полемика по goto «растревожила осиное гнездо» и всколыхнула «весь программистский мир». Варианты 1 и 2 выражают крайние позиции участников дискуссии, между которыми, как казалось вначале, компромисс невозможен.
Однако ситуация изменилась с изобретением и широким распространением заменителей goto, примерами которых являются:
• в языке Си – операторы break, continue, return и функция еxit ( );
• в языке Модула-2 – операторы RETURN, EXIT, процедура HALT и т. д.
Заменители – особый инструмент, который существенно отличается как от трех структурных управляющих конструкций, так и от goto. Они обладают двумя важными преимуществами по сравнению с goto:
1) не требуя меток, заменители исключают ошибки, вызванные путаницей с метками;
2) каждый заменитель может передать управление не куда угодно (как goto), а в одну-единственную точку, однозначно определяемую ключевым словом заменителя и его местом в тексте. В результате множество точек, куда разрешен переход, сокращается на порядок, что также предотвращает ошибки.
Вариант 3 описывает языки Си, Дельфи, Ада, и др., где имеются заменители и на всякий случай сохраняется goto.
Вариант 4 соответствует языкам Модула-2, Джава, где также есть заменители, однако goto исключен. Следует подчеркнуть, что при наличии заменителей сфера применения goto резко сужается. Так что удельный вес ошибок, связанных с его применением, заметно уменьшается. Поэтому вопрос об исключении goto, по-видимому, теряет прежнюю остроту.
Идея структуризации оказала большое влияние на разработку алгоритмов и программ. Практически во все процедурные языки (точнее, во все процедурные фрагменты языков) были введены структурные конструкции цикла и ветвления, а также различные заменители goto.
§14. ЧЕТЫРЕ ПРИНЦИПА СТРУКТУРИЗАЦИИ БЛОК-СХЕМ, ПРЕДЛОЖЕННЫЕ Э. ДЕЙКСТРОЙ Попытаемся еще раз заглянуть в темные переулки истории и внимательно перечитаем классический труд Дейкстры «Заметки по структурному программированию» [2].
К немалому удивлению, мы обнаружим, что основной тезис о структурных управляющих конструкциях излагается с прямой апелляцией к визуальному языку блок-схем.
Непосредственный анализ первоисточника со всей очевидностью подтверждает простую мысль. Дейкстрианская «структурная революция» началась с того, что Дейкстра, использовав блок-схемы как инструмент анализа структуры программ, предложил наряду с другими важными идеями четыре принципа структуризации блок-схем! К сожалению, в дальнейшем указанные принципы были преданы забвению или получили иное, по нашему мнению, слишком вольное толкование.
Эти принципы таковы.
1. Принцип ограничения топологии блок-схем. Структурный подход
должен приводить «к ограничению топологии блок-схем по сравнению с различными блок-схемами, которые могут быть получены, если разрешить проведение стрелок из любого блока в любой другой блок. Отказавшись от большого разнообразия блок-схем и ограничившись ...тремя типами операторов управления, мы следуем тем самым некоей последовательностной дисциплине» [2, с. 28].
2. Принцип вертикальной ориентации входов и выходов блок-схемы. Имея в виду шесть типовых блок-схем (if-do, if-then-else, case-of, while-do, repеat-until, а также «действие»), Дейкстра пишет:
Цитата:
«Общее свойство всех этих блок-схем состоит в том, что у каждой из них один вход вверху и один выход внизу» [2, с. 27].
1 Принцип единой вертикали. Вход и выход каждой типовой блок-схемы должны лежать на одной вертикали.
2 Принцип нанизывания типовых блок-схем на единую вертикаль. При последовательном соединении типовые блок-схемы следует соединять, не допуская изломов соединительных линий, чтобы выход верхней и вход нижней блок-схемы лежали на одной вертикали.
Хотя Дейкстра не дает словесной формулировки третьего и четвертого принципов, они однозначно вытекают из имеющихся в его работе иллюстраций [2, с. 25–28]. Чтобы у читателя не осталось сомнений, мы приводим точные копии подлинных рисунков Дейкстры (рис. 261, средняя и левая графа).
Таким образом, можно со всей определенностью утверждать, что две идеи (текстовый и визуальный структурный подход), подобно близнецам, появились на божий свет одновременно. Однако этих близнецов ожидала разная судьба – судьба принца и нищего.
§15. ПОЧЕМУ НАУЧНОЕ СООБЩЕСТВО НЕ ПРИНЯЛО ВИДЕОСТРУКТУРНУЮ КОНЦЕПЦИЮ Э. ДЕЙКСТРЫ? Далее события развивались довольно загадочным образом, поскольку вокруг видеоструктурной1 концепции Дейкстры образовался многолетний заговор молчания.
Неприятность в том, что изложенные выше рекомендации Дейкстры не были приняты во внимание разработчиками национальных и международных стандартов на блок-схемы (ГОСТ 19.701–90, стандарт ISO 5807–85 и т. д.). В итоге метод стандартизации, единственный метод, который мог бы улучшить массовую практику вычерчивания блок-схем, не был использован.
Вследствие этого идея Дейкстры оказалась наглухо изолированной от реальных блок-схем, используемых в реальной практике разработки. В чем причина этой более чем странной ситуации?
Здесь уместно сделать отступление. Американский историк и философ Томас Кун в книге «Структура научных революций» говорит о том, что в истории науки время от времени появляются особые периоды, когда выдвигаются «несоизмеримые» с прежними взглядами научные идеи. Последние он называет парадигмами [9].
1 В дальнейшем мы будем нередко использовать приставку «видео», трактуя ее как «относящийся к визуальному программированию».
История науки – история смены парадигм. Разные парадигмы – это разные образцы мышления ученых. Поэтому сторонникам старой парадигмы зачастую бывает сложно или даже невозможно понять сторонников новой парадигмы (новой системы идей), которая приходит на смену устоявшимся стереотипам научного мышления.
По нашему мнению, одномерный (текстовый) и двумерный (визуальный) подход – это две парадигмы. Причем нынешний этап развития программирования есть болезненный процесс ломки прежних взглядов, в ходе которого прежняя текстовая парадигма постепенно уступает место новой визуальной парадигме.
При этом – в соответствии с теорией Куна – многие, хотя и не все, видные представители прежней, отживающей парадигмы проявляют своеобразную слепоту при восприятии новой парадигмы, которая в ходе неустанной борьбы идей в конечном итоге утверждает свое господство.
Этот небольшой экскурс в область истории и методологии науки позволяет лучше понять причины поразительного невнимания научного сообщества к изложенным Дейкстрой принципам структуризации блок-схем.
Начнем по порядку. Формальная блок-схема – это двумерный чертеж. Следовательно, она является инструментом визуального программирования.
Отсюда следует, что предложенные Дейкстрой принципы структуризации блок-схем есть не что иное, как исторически первая попытка сформулировать основные (пусть далеко не полные и, возможно, нуждающиеся в улучшении) принципы визуального структурного программирования.
Однако в 1972 году, в момент публикации работы Дейкстры [2], визуальное программирование как термин, понятие и концепция фактически еще не существовало. Поэтому, что вполне естественно, суть концепции Дейкстры была воспринята сквозь призму господствовавших тогда догматов текстового программирования со всеми вытекающими последствиями.
Так родилась приписываемая Дейкстре и по праву принадлежащая ему концепция текстового структурного программирования. При этом (что также вполне естественно) в означенное время никто не обратил внимания на тот чрезвычайно важный для нашего исследования факт, что исходная формулировка концепции Дейкстры имела явно выраженную визуальную компоненту. Она представляла собой метод структуризации блок-схем, то есть была описана в терминах видеоструктурного программирования.
Подобное невнимание привело к тому, что авторы стандартов на блок-схемы посчитали, что данная идея их не касается, ибо относится исключительно к тексту программ. Они дружно проигнорировали или, скажем мягче, упустили из виду визуальную компоненту структурного метода Дейкстры.
Справедливости ради добавим, что и сам отец-основатель (Э. Дейкстра), обычно весьма настойчивый в продвижении и популяризации своих идей, отнесся к своему видеоструктурному детищу с удивительным безразличием. И ни разу не выступил с предложением о закреплении структурной идеи в стандартах на блок-схемы.
§16. ПАРАДОКС СТРУКТУРНОГО ПРОГРАММИРОВАНИЯ Мы подошли к наиболее интригующему пункту в истории структурного подхода. Чтобы выявить главное звено проблемы, зададим вопрос. Являются ли блок-схемы и структурное программирование взаимно исключающими, несовместимыми решениями? В литературе по этому вопросу наблюдается редкое единодушие. Да, они несовместимы. Вот несколько отзывов. По мнению многих авторов, блок-схемы:
Цитата:
«не согласуются со структурным программированием, поскольку в значительной степени ориентированы на использование goto» [8, с. 150].
Цитата:
Они «затемняют особенности программ, созданных по правилам структурного программирования» [3, с. 193].
Цитата:
«C появлением языков, отвечающих принципам структурного программирования, ... блок-схемы стали отмирать» [10].
Парадокс в том, что приведенные высказывания основываются на недоразумении. Чтобы логический дефект стал очевидным, сопоставим две цитаты по методу «очной ставки» (табл. 2).
Сравнивая мнение современных авторов с позицией Дейкстры, нетрудно убедиться, что описываемый критиками изъян действительно имеет место.
Но! Лишь в том случае, если правила вычерчивания блок-схем игнорируют предложенный Дейкстрой принцип ограничения топологии блок-схем. И наоборот, соблюдение указанного принципа сразу же ликвидирует недостаток.
Таблица 2
Цитата:
«Основной недостаток блок-схем заключается в том, что они не приучают к аккуратности при разработке алгоритма. Ромб можно поставить в любом месте блок-схемы, а от него повести выходы на какие угодно участки. Так можно быстро превратить программу в запутанный лабиринт, разобраться в котором через некоторое время не сможет даже сам ее автор» [10].
Цитата:
Структуризация блок-схем с неизбежностью приводит «к ограничению топологии блок-схем по сравнению с различными блок-схемами, которые могут быть получены, если разрешить проведение стрелок из любого блока в любой другой блок. Отказавшись от большого разнообразия блок-схем и ограничившись... тремя операторами управления, мы следуем тем самым некоей последовательностной дисциплине» [2, с. 28]
§17. ПЛОХИЕ БЛОК-СХЕМЫ ИЛИ ПЛОХИЕ СТАНДАРТЫ? Проведенный анализ позволяет сделать несколько замечаний.
• Обвинения, выдвигаемые противниками блок-схем, неправомерны, потому что ставят проблему с ног на голову. Дело не в том, что блок-схемы по своей природе противоречат принципам структуризации. А в том, что при разработке стандартов на блок-схемы указанные принципы не были учтены. На них просто не обратили внимания, поскольку в ту пору – именно в силу парадигмальной слепоты – считалось, что на практике структурный подход следует применять к текстам программ, а отнюдь не к блок-схемам.
• Чтобы сделать блок-схемы пригодными для структуризации, необходимо, в частности, ограничить и регламентировать их топологию с учетом видеоструктурных принципов Дейкстры.
• Видеоструктурная концепция Дейкстры – это фундаментальная идея, высказанная более тридцати лет назад и оказавшаяся невостребованной, поскольку она значительно опередила свое время.
• Эту задачу решает предлагаемый нами шампур-метод, понимаемый как метод формализации блок-схем, который развивает видеоструктурную концепцию Дейкстры. С помощью шампур-метода разработана новая топология блок-схем (дракон-схемы), регламентация которой произведена на основе принципа когнитивной формализации знаний.
Наибольшую трудность в течение длительного времени представляли математика и эргономика блок-схем. Нужно было создать математически строгий метод формализации блок-схем, учитывающий правила эргономики и позволяющий превратить блок-схемы в программу, пригодную для ввода в компьютер и трансляции в объектный модуль программы.
Язык ДРАКОН позволил эффективно решить эту задачу. Одновременно была решена задача эргономизации блок-схем, то есть задача приспособления блок-схем для наиболее удобного человеческого восприятия и понимания.
§18. ВИЗУАЛЬНОЕ И ТЕКСТОВОЕ СТРУКТУРНОЕ ПРОГРАММИРОВАНИЕ Можно предложить ряд правил, устанавливающих соответствие между понятиями двумерного (визуального) и одномерного (текстового) структурного подхода.
1. Макроикона «развилка» (рис. 242), в которую произведен ввод функционального атома в левую или обе критические точки, эк-вивалентна конструкциям if-then и if-then-else соответственно [11, с. 120, 121]. См. также две верхние графы на рис. 261.
2. Макроикона «обычный цикл» (рис. 242), в которую произведен ввод функционального атома в одну или обе критические точки, эквивалентна конструкциям do-until, while-do, do-while-do соответственно [11, с. 120, 121]. См. также две нижние графы на рис. 261.
3. Непустая макроикона «переключатель» (рис. 242), в которую введено нужное число икон «вариант» с помощью операции «добавление варианта», эквивалентна конструкции case [2, с. 27]. См. также рис. 261.
4. Непустая макроикона «цикл ДЛЯ» (рис. 242) эквивалентна циклу for языка Си.
5. Непустая макроикона «переключающий цикл» (рис. 242), в которую введено нужное число икон «вариант», эквивалентна циклу с вложенным оператором саse, используемым, например, при построении рекурсивных структурированных программ по методу Ашкрофта-Манны [11, с. 141, 142].
6. Шампур-блок – видеоструктурный эквивалент понятия «простая программа» [11, с. 102].
7. Атом – общее понятие для основных составляющих блоков, необходимых для построения программы согласно структурной теореме Бома и Джакопини [5]. Оно охватывает также все элементарные конструкции структурного подхода, кроме последовательности [11, с. 119–121]. (Последняя в визуальном структурном подходе считается неэлементарной структурой).
8. Операция «ввод атома» позволяет смоделировать две операции:
• построить последовательность из двух и более атомов;
• методом заполнения критических точек осуществить многократное вложение составных операторов друг в друга.
Благодаря этому единственный функциональный блок «постепенно раскрывается в сложную структуру основных элементов».
§19. СТРУКТУРНЫЕ, ЛИАННЫЕ И АДРЕСНЫЕ БЛОКИ Введем понятие «базовые операции» для обозначения операций «ввод атома», «добавление варианта» и «боковое присоединение» (см. главу 33). Применяя к заготовке-примитив базовые операции любое число раз, мы всегда получим структурную дракон-схему в традиционном смысле слова (рис. 262).
Введем три понятия.
Шампур-метод позволяет строить как структурные, так и лианные конструкции. Выше мы выяснили, что базовые операции моделируют классический структурный подход.
Чтобы смоделировать полезные функции оператора goto, в шампур-методе предусмотрены операции «пересадка лианы» и «заземление лианы».
§20. СИЛУЭТ КАК КОНЕЧНЫЙ АВТОМАТ И ДИАГРАММА СОСТОЯНИЙ Силуэт на рис. 265 можно интерпретировать как детерминированный конечный автомат (рис. 266). Каждую ветку при желании можно характеризовать как состояние автомата. Переход с ветки на ветку означает переход из одного состояния в другое.
Силуэт можно также рассматривать как диаграмму состояний (state machine diagram).
§21. АНАЛОГИ ДРАКОН-СХЕМ Аналогом дракон-схем являются диаграммы поведения (behaviour diagrams) языка UML, в частности, диаграмма деятельности (activity diagram), диаграмма состояний (UML state machine diagram) и некоторые
диаграммы взаимодействия (interaction diagrams), например, диаграмма синхронизации (timing diagram).
Другая группа аналогов дракон-схем охватывает блок-схемы алгоритмов по ГОСТ 19.701–90, диаграмму Насси-Шнейдермана, псевдокод (язык описания алгоритмов) и др.
§22. ОПЕРАЦИИ С ЛИАНОЙ И ОПЕРАТОР GOTO Операции с лианой моделируют все без исключения функции заменителей goto (например, досрочный выход из цикла), а также некоторые функции goto, которые невозможно реализовать с помощью заменителей. Однако они не приводят к хаосу, вызванному бесконтрольным использованием goto.
С эргономической точки зрения, действия с лианой на порядок эффективнее и удобнее, чем goto и заменители. Кроме того, они весьма эффективно корректируют недостатки классического (текстового) структурного программирования.
Приведем пример. В главе 7 мы рассмотрели эргономические преимущества схемы на рис. 62 по сравнению с рис. 61. Показано, что улучшение эргономичности достигнуто за счет использования равносильных преобразований алгоритмов: вертикального и горизонтального объединения. При этом за кадром осталась важная проблема – проблема синтаксиса.
Как построить указанные схемы? Теперь мы имеем возможность осветить этот вопрос. Схема на рис. 61 представляет собой структурный блок, полученный с помощью операции «ввод атома». В отличие от нее схема на рис. 62 – это лианный блок, построенный методом пересадки лианы.
Уместно вспомнить предостережение Гленфорда Майерса:
Цитата:
«Правила структурного программирования часто предписывают повторять одинаковые фрагменты программы в разных участках модуля, чтобы избавиться от употребления операторов goto. В этом случае лекарство хуже болезни. Дублирование резко увеличивает возможность внесения ошибок при изменении модуля в будущем» [8, с. 138].
Как видно на рис. 53, 56, 62 пересадка лианы позволяет элегантно и без потерь решить эту непростую проблему, одновременно улучшая наглядность и понятность алгоритма, обеспечивая более эффективное топологическое упорядочивание маршрутов.
Пересадка лианы узаконивает лишь некоторые, отнюдь не любые передачи управления, поскольку определение операции «пересадка лианы» (см. главу 33, тезис 28) содержит ряд ограничений. Запрет на образование нового цикла вызван тем, что переход на оператор, расположенный выше (раньше) в тексте программы, считается
«наихудшим применением оператора goto [8, с. 135]. Указанный запрет вводится, чтобы выполнить требование: использовать goto только для передачи управления вперед по программе, которое считается более приемлемым.
Запрет на образование второго входа в цикл соответствует требованию структурного программирования, согласно которому цикл, как и любая простая программа, должен иметь не более одного входа.
Лишь третий запрет является оригинальной особенностью шампур-метода: он запрещает передачи управления, изображение которых с помощью лианы ведет к пересечению линий.
Таким образом, пересадка лианы разрешает только те переходы вниз по дракон-алгоритму, которые образуют связи с валентными точками и изображаются легко прослеживаемыми маршрутами, то есть не пересекающимися линиями.
В визуальном структурном подходе аналогом goto и заменителей служат формальные операции «пересадка лианы» и «заземление лианы».
§23. ПОЧЕМУ САМОЛЕТ НЕ МАШЕТ КРЫЛЬЯМИ? Говоря о будущем шампур-метода, необходимо осознать, что одномерный (текстовый) и двумерный (визуальный) подходы опираются на разные системы понятий, которые по-разному расчленяют действительность.
Поэтому визуальный подход нельзя рассматривать как результат механического перевода устоявшихся понятий классического текстового структурного программирования на новый язык.
Поясним. При визуальном структурном подходе программист работает только с чертежом программы, не обращаясь к ее тексту. Точно так же программист, работающий, скажем, на Дельфи, не обращается к ассемблеру и машинному коду – они для него просто не существуют!
Это значит, что столь тщательно обоснованная Дейкстрой и его коллегами коллекция ключевых слов структурного программирования (if, then, else, case, of, while, do, repeat, until, begin, end [2, с. 22, 26, 27]) при переходе к визуальному подходу становится ненужной. Для программиста она просто перестает существовать!
В равной степени становятся лишними и отмирают и другие ключевые слова, используемые оппонентами Дейкстры в различных вариантах расширения структурного подхода: goto, continue, break, exit и т. д.
Поскольку в визуальном варианте структурного подхода ключевое слово goto не используется, теряют смысл и все споры относительно законности или незаконности, опасности или безопасности его применения. Становится ненужной обширная литература, посвященная обсуждению этого, некогда казавшегося столь актуальным вопроса.
Предвижу возражения: хотя названные ключевые слова действительно исчезают, однако выражаемые ими понятия сохраняют силу и для визуального случая. Например, два визуальных алгоритма на рис. 60, 62 можно построить с помощью понятий if-then-else и goto.
Данное возражение нельзя принять, поскольку произошла подмена предмета обсуждения. С помощью указанных понятий можно построить не визуальные алгоритмы, а текстовые алгоритмы, эквивалентные алгоритмам на рис. 60, 62.
Что касается собственно визуальных программ, то они, будучи «выполнимой графикой», строятся из «выполняемых» икон и «выполняемых» соединительных линий. Подчеркнем еще раз: при построении алгоритма (программы) с помощью дракон-конструктора пользователь не применяет понятия if-then-else и goto, ибо в этом нет никакой необходимости.
Нельзя путать задачу и систему понятий, на которую опирается метод ее решения. В обоих случаях – и при текстовом, и при визуальном структурном подходе – ставится одна и та же задача: улучшить понятность программ и обеспечить более эффективный интеллектуальный контроль за передачами управления.
Однако система понятий коренным образом меняется. Ту функцию, которую в текстовой программе выполняют ключевые слова, в визуальной программе реализуют совершенно другие понятия: иконы, макроиконы, соединительные линии, шампур, главная вертикаль шампур-блока, лиана, атом, пересадка лианы, запрет пересечения линий и т. д.
Очевидно, что использование понятий, выражаемых ключевыми словами текстового структурного программирования, не является самоцелью. Оно служит для того, чтобы «делать наши программы разумными, понятными и разумно управляемыми» [4, с. 272]. Указанные понятия решают эту задачу не во всех случаях, а только в рамках текстового программирования.
При переходе к визуальному подходу задача решается по-другому, с помощью другого набора понятий. Отказ от старого набора понятий и замена его на новый позволяет добиться новой постановки задачи и более эффективного ее решения.
Поэтому высказываемое иногда критическое замечание: «недостаток шампур-метода в том, что он не удовлетворяет требованиям структурного программирования» является логически неправомерным. Нельзя упрекать самолет за то, что он не машет крыльями.
§24. ВЫВОДЫ 1. Императивная (процедурная) часть языка ДРАКОН опирается на новый метод – двумерное структурное программирование. Или, что одно и то же, шампур-метод.
2. Правила двумерного структурного программирования существенно отличаются от традиционного одномерного (текстового) структурного программирования.
3. Идеи структурного программирования разрабатывались, когда компьютерная графика фактически еще не существовала и основным инструментом алгоритмиста и программиста был одномерный (линейный или ступенчатый) текст.
4. До появления компьютерной графики методология текстового структурного программирования была наилучшим решением.
5. С появлением компьютерной графики ситуация изменилась. Появилась возможность заменить текстовые управляющие структуры на управляющую графику, то есть использовать двумерное структурное программирование.
6. Слабое место традиционного структурного программирования и текстового представления алгоритмов и программ заключается в недостатке выразительных средств. Следствием являются ограничения и запреты. Эти ограничения и запреты вытекают из природы текста, из природы текстового представления управляющих структур.
7. Недостаток выразительных средств, проявляющийся через ограничения и запреты, тормозит повышение производительности труда алгоритмистов и программистов.
8. В рамках текстового представления управляющих структур устранить эти ограничения и запреты невозможно. Чтобы добиться улучшения, надо перейти от одномерного текстового структурного программирования к двумерному визуальному структурному программированию.
9. Многие ограничения и запреты, неизбежные при текстовом структурном программировании, во многих случаях противоречат здравому смыслу, затрудняют понимание алгоритмов и программ, искажают нормальный ход человеческой мысли.
10. Недопустимо запрещать правильный процесс мышления. Его надо разрешить. Шампур-метод и язык ДРАКОН устраняют этот недостаток.
11. При использовании шампур-метода набор управляющих ключевых слов текстового структурного программирования становится ненужным.
12. При визуальном структурном подходе программист работает только с чертежом программы (дракон-схемой), не обращаясь к ее текстовому представлению. Точно так же программист, работающий, скажем, на Дельфи, не обращается к ассемблеру и машинному коду – они для него просто не существуют.
13. Во многих случаях (список которых еще предстоит уточнить) желательно отказаться от текстовых управляющих структур, заменив их управляющей графикой.
14. ДРАКОН – это не просто новый язык (новое семейство языков). Это новый взгляд на процедурное программирование. Если угодно – новое мировоззрение.
15. Наибольшую трудность в течение длительного времени представляли математика и эргономика блок-схем. Нужно было создать математически строгий метод формализации блок-схем, позволяющий превратить блок-схемы в программу, пригодную для ввода в компьютер и трансляции в объектный модуль программы.
16. Язык ДРАКОН позволил эффективно решить эту задачу.
17. Одно временно была решена задача эргономизации блок-схем, то есть задача приспособления блок-схем для наиболее удобного человеческого восприятия и понимания.