Теорема о структурированной программе
Теорема о структурированной программе , также называемая теоремой Бема–Якопини , [1] [2] является результатом теории языков программирования . В нем говорится, что класс графов потока управления (исторически называемых блок-схемами в этом контексте) может вычислить любую вычислимую функцию , если он объединяет подпрограммы только тремя конкретными способами ( структурами управления ). Это
- Выполнение одной подпрограммы, а затем другой подпрограммы (последовательности)
- Выполнение одной из двух подпрограмм в соответствии со значением логического выражения (выбор)
- Повторное выполнение подпрограммы, пока логическое выражение истинно (итерация)
Структурированная диаграмма, на которую распространяются эти ограничения, особенно ограничение цикла, подразумевающее единственный выход (как описано ниже в этой статье), может, однако, использовать дополнительные переменные в форме битов (хранящиеся в дополнительной целочисленной переменной в исходном доказательстве), чтобы отслеживать информацию, которую представляет исходная программа, по местоположению программы. Конструкция была основана на языке программирования Бема P′′ .
Теорема лежит в основе структурного программирования , парадигмы программирования, которая избегает команд перехода и использует исключительно подпрограммы, последовательности, выбор и итерацию.

Происхождение и варианты [ править ]
Теорему обычно приписывают [3] : 381 к статье Коррадо Бема и Джузеппе Якопини 1966 года . [4] Дэвид Харел писал в 1980 году, что статья Бема-Якопини пользовалась «всеобщей популярностью». [3] : 381 особенно со сторонниками структурированного программирования. Харель также отметил, что «из-за довольно технического стиля [статья Бема-Якопини 1966 года], очевидно, чаще цитируется, чем подробно читается» [3] : 381 и после обзора большого количества статей, опубликованных до 1980 года, Харель утверждал, что содержание доказательства Бема-Якопини обычно искажалось как народная теорема , которая, по сути, содержит более простой результат, результат, который сам по себе можно отнести к зарождению современная теория вычислений в работах фон Неймана [5] и Клини . [3] : 383
Харель также пишет, что более общее название было предложено Х.Д. Миллсом как «Структурная теорема» в начале 1970-х годов. [3] : 381
одним циклом с версия теоремы Народная
Эта версия теоремы заменяет весь поток управления исходной программы одним глобальным while
цикл, который имитирует программный счетчик, просматривающий все возможные метки (блоки блок-схемы) в исходной неструктурированной программе. Харел проследил происхождение этой народной теоремы до двух статей, положивших начало вычислительной технике. Одним из них является описание архитектуры фон Неймана в 1946 году , в котором объясняется, как работает счетчик программ с точки зрения цикла while. Харель отмечает, что одиночный цикл, используемый в народной версии теоремы о структурном программировании, по сути просто обеспечивает операционную семантику для выполнения блок-схемы на компьютере фон Неймана. [3] : 383 Другой, еще более древний источник, из которого Харел нашел народную версию теоремы, — это теорема Стивена Клини о нормальной форме 1936 года. [3] : 383
Дональд Кнут раскритиковал эту форму доказательства, которая приводит к псевдокоду, подобному приведенному ниже, указав, что структура исходной программы полностью теряется при этом преобразовании. [6] : 274 Точно так же Брюс Ян Миллс писал об этом подходе: «Дух блочной структуры — это стиль, а не язык. Моделируя машину фон Неймана, мы можем воспроизвести поведение любого спагетти-кода в рамках языка с блочной структурой. Это не мешает ему быть спагетти». [7]
p := 1
while p > 0 do
if p = 1 then
perform step 1 from the flowchart
p := resulting successor step number of step 1 from the flowchart (0 if no successor)
end if
if p = 2 then
perform step 2 from the flowchart
p := resulting successor step number of step 2 from the flowchart (0 if no successor)
end if
...
if p = n then
perform step n from the flowchart
p := resulting successor step number of step n from the flowchart (0 if no successor)
end if
end while
Якопини Доказательство и Бема
![]() | Этот раздел нуждается в расширении . Вы можете помочь, добавив к нему . ( июль 2014 г. ) |
Доказательство в статье Бема и Якопини проводится путем индукции по структуре блок-схемы. [3] : 381 использовало сопоставление с образцом в графах Поскольку доказательство Бема и Якопини , оно не было действительно практичным в качестве алгоритма преобразования программы и, таким образом, открыло дверь для дополнительных исследований в этом направлении. [8]
Двусторонняя версия [ править ]
Теорема об обратимой структурированной программе [9] является важной концепцией в области обратимых вычислений . Он утверждает, что любые вычисления, достижимые с помощью обратимой программы, также могут быть выполнены с помощью обратимой программы, используя только структурированную комбинацию конструкций потока управления, таких как последовательности, выборки и итерации. Любое вычисление, достижимое с помощью традиционной необратимой программы, также может быть выполнено с помощью обратимой программы, но с дополнительным ограничением, заключающимся в том, что каждый шаг должен быть обратимым и с некоторым дополнительным выходом. [10] Более того, любую обратимую неструктурированную программу можно реализовать с помощью структурированной обратимой программы, выполнив всего одну итерацию без каких-либо дополнительных выходных данных. Эта теорема закладывает основополагающие принципы построения обратимых алгоритмов в рамках структурного программирования.
Согласно теореме о структурированной программе, как локальные, так и локальные [11] и глобальный [12] методы доказательства известны. Однако для его обратимой версии, несмотря на признание глобального метода доказательства, используется локальный подход, аналогичный тому, который применялся Бёмом и Якопини. [11] еще не известно. Это различие является примером, который подчеркивает проблемы и нюансы в создании основ обратимых вычислений по сравнению с традиционными вычислительными парадигмами.
Последствия и уточнения [ править ]
Доказательство Бема-Якопини не решило вопроса о том, следует ли использовать структурное программирование для разработки программного обеспечения, отчасти потому, что такая конструкция скорее затеняла программу, чем улучшала ее. Напротив, это сигнализировало о начале дебатов. Эдсгера Дейкстры В 1968 году последовало знаменитое письмо « Перейти к заявлению, считающемуся вредным ». [13]
Некоторые ученые придерживались пуристского подхода к результату Бема-Якопини и утверждали, что даже такие инструкции, как break
и return
из середины циклов является плохой практикой, поскольку они не нужны в доказательстве Бема – Якопини, и поэтому они выступали за то, чтобы все циклы имели одну точку выхода. Этот пуристский подход воплощен в языке программирования Паскаль (разработанном в 1968–1969 годах), который до середины 1990-х годов был предпочтительным инструментом для преподавания вводных классов программирования в академических кругах. [14]
Эдвард Юрдон отмечает, что в 1970-е годы существовало даже философское противодействие преобразованию неструктурированных программ в структурированные автоматизированными средствами, основанное на аргументе, что нужно с самого начала мыслить в стиле структурированного программирования. Прагматичным контрапунктом было то, что такие преобразования принесли пользу большому количеству существующих программ. [15] Среди первых предложений по автоматизированной трансформации была статья 1971 года Эдварда Эшкрофта и Зохара Манны . [16]
Прямое применение теоремы Бема-Якопини может привести к введению дополнительных локальных переменных в структурированную диаграмму, а также к некоторому дублированию кода . [17] Последняя проблема в этом контексте называется проблемой полутора циклов . [18] Паскаль подвержен обеим этим проблемам, и согласно эмпирическим исследованиям, на которые ссылается Эрик С. Робертс , студентам-программистам было трудно сформулировать правильные решения в Паскале для нескольких простых задач, включая написание функции для поиска элемента в массиве. Исследование Генри Шапиро 1980 года, цитируемое Робертсом, показало, что при использовании только структур управления, предоставляемых Паскалем, правильное решение было дано только 20% испытуемых, в то время как ни один испытуемый не написал неправильный код для этой задачи, если ему было разрешено написать возврат из середина петли. [14]
В 1973 году С. Рао Косараджу доказал, что в структурном программировании можно избежать добавления дополнительных переменных, если разрешены многоуровневые выходы из циклов произвольной глубины. [1] [19] Более того, Косараджу доказал, что существует строгая иерархия программ, ныне называемая иерархией Косараджу , в которой для каждого целого числа n существует программа, содержащая многоуровневый разрыв глубины n , который нельзя переписать как программу с многоуровневыми разрывами глубины n. глубина меньше n (без введения дополнительных переменных). [1] Косараджу ссылается на конструкцию многоуровневого разрыва в языке программирования BLISS . Многоуровневые разрывы в виде leave label
ключевые слова были фактически введены в версию этого языка BLISS-11; в оригинальном BLISS были только одноуровневые перерывы. Семейство языков BLISS не обеспечивает неограниченного перехода. Язык программирования Java позже также будет следовать этому подходу. [20] : 960–965
Более простой результат из статьи Косараджу заключается в том, что программа сводится к структурированной программе (без добавления переменных) тогда и только тогда, когда она не содержит цикла с двумя различными выходами. Сводимость была определена Косараджу, грубо говоря, как вычисление той же функции и использование тех же «примитивных действий» и предикатов, что и исходная программа, но, возможно, с использованием других структур потока управления. (Это более узкое понятие сводимости, чем то, которое использовал Бём-Якопини.) Вдохновленный этим результатом, в разделе VI своей широко цитируемой статьи, в которой было введено понятие цикломатической сложности , Томас Дж. Маккейб описал аналог теоремы Куратовского для графы потока управления (CFG) неструктурированных программ, то есть минимальные подграфы , которые делают CFG программы неструктурированной. Эти подграфы имеют очень хорошее описание на естественном языке. Они есть:
- выход из цикла (кроме теста цикла цикла)
- разветвление в цикл
- разветвление на решение (т.е. на «ветвь if»)
- выход из решения
Маккейб фактически обнаружил, что эти четыре графа не являются независимыми, когда они появляются в виде подграфов, а это означает, что необходимым и достаточным условием для того, чтобы программа была неструктурированной, является наличие в ее CFG в качестве подграфа одного из любого подмножества трех из этих четырех графов. Он также обнаружил, что если неструктурированная программа содержит один из этих четырех подграфов, она должна содержать еще один, отличный от набора из четырех. Этот последний результат помогает объяснить, как поток управления неструктурированной программой запутывается в том, что обычно называют « спагетти-кодом ». Маккейб также разработал числовую меру, которая для произвольной программы определяет, насколько она далека от идеала структурированной программы; Маккейб назвал свою меру существенной сложностью . [21]
Данную Маккейбом характеристику запрещенных графов для структурного программирования можно считать неполной, по крайней мере, если D-структуры Дейкстры считаются строительными блоками. [22] : 274–275 [ нужны разъяснения ]
Вплоть до 1990 года было предложено довольно много методов исключения gotos из существующих программ с сохранением большей части их структуры. Различные подходы к этой проблеме также предлагали несколько понятий эквивалентности, которые более строгие, чем просто эквивалентность Тьюринга, чтобы избежать вывода, подобного народной теореме, обсуждавшейся выше. Строгость выбранного понятия эквивалентности диктует минимальный набор необходимых структур потока управления. 1988 года Статья Лайла Рэмшоу в JACM исследует область до этого момента, а также предлагает свой собственный метод. [23] Алгоритм Рамшоу использовался, например, в некоторых декомпиляторах Java , поскольку код виртуальной машины Java имеет инструкции ветвления с целями, выраженными как смещения, но язык Java высокого уровня имеет только многоуровневые инструкции. break
и continue
заявления. [24] [25] [26] Аммаргуеллат (1992) предложил метод трансформации, основанный на обеспечении единого выхода. [8]
Приложение к Коболу [ править ]
Этот раздел нуждается в дополнительных цитатах для проверки . ( Август 2013 г. ) |
В 1980-х годах IBM исследователь Харлан Миллс курировал разработку COBOL Structuring Facility , которая применяла алгоритм структурирования к коду COBOL . Преобразование Миллса включало следующие шаги для каждой процедуры.
- Определите основные блоки процедуры.
- Назначьте уникальную метку пути входа в каждый блок и пометьте пути выхода каждого блока метками путей входа, к которым они подключаются. Используйте 0 для возврата из процедуры и 1 для пути входа в процедуру.
- Разбейте процедуру на базовые блоки.
- Для каждого блока, который является местом назначения только одного пути выхода, повторно подключите этот блок к этому пути выхода.
- Объявите в процедуре новую переменную (для справки назовите ее L).
- На каждом оставшемся несвязанном пути выхода добавьте оператор, который устанавливает L в значение метки на этом пути.
- Объедините полученные программы в оператор выбора, который выполняет программу с меткой пути входа, указанной L.
- Создайте цикл, который выполняет этот оператор выбора, пока L не равно 0.
- Создайте последовательность, которая инициализирует L значением 1 и выполняет цикл.
Эту конструкцию можно улучшить, преобразовав некоторые случаи оператора выбора в подпроцедуры.
См. также [ править ]
Ссылки [ править ]
- ^ Jump up to: Перейти обратно: а б с Декстер Козен и Вэй-Лунг Дастин Ценг (2008). «Теорема Бема – Якопини ложна с теоретической точки зрения». Математика построения программ (PDF) . Конспекты лекций по информатике. Том. 5133. стр. 177–192. CiteSeerX 10.1.1.218.9241 . дои : 10.1007/978-3-540-70594-9_11 . ISBN 978-3-540-70593-2 .
{{cite book}}
:|journal=
игнорируется ( помогите ) - ^ «CSE 111, осень 2004 г., ТЕОРЕМА БЁМА-ЯКОПИНИ» . Cse.buffalo.edu. 22 ноября 2004 г. Проверено 24 августа 2013 г.
- ^ Jump up to: Перейти обратно: а б с д и ж г час Харель, Дэвид (1980). «О народных теоремах» (PDF) . Коммуникации АКМ . 23 (7): 379–389. дои : 10.1145/358886.358892 . S2CID 16300625 .
- ^ Бом, Коррадо; Джузеппе Якопини (май 1966 г.). «Блок-схемы, машины Тьюринга и языки только с двумя правилами формирования». Коммуникации АКМ . 9 (5): 366–371. CiteSeerX 10.1.1.119.9119 . дои : 10.1145/355592.365646 . S2CID 10236439 .
- ^ Беркс, Артур В .; Голдстайн, Герман ; фон Нейман, Джон (1947), Предварительное обсуждение логического проектирования электронного вычислительного прибора , Принстон, Нью-Джерси: Институт перспективных исследований.
- ^ Дональд Кнут (1974). «Структурное программирование с переходом к операторам». Вычислительные опросы . 6 (4): 261–301. CiteSeerX 10.1.1.103.6084 . дои : 10.1145/356635.356640 . S2CID 207630080 .
- ^ Брюс Ян Миллс (2005). Теоретическое введение в программирование . Спрингер. п. 279. ИСБН 978-1-84628-263-8 .
- ^ Jump up to: Перейти обратно: а б Аммаргуэллат, З. (1992). «Алгоритм нормализации потока управления и его сложность». Транзакции IEEE по разработке программного обеспечения . 18 (3): 237–251. дои : 10.1109/32.126773 .
- ^ Ёкояма, Тецуо; Аксельсен, Хольгер Бок; Глюк, Роберт (январь 2016 г.). «Основы обратимых языков блок-схем» . Теоретическая информатика . 611 : 87–115. дои : 10.1016/j.tcs.2015.07.046 .
- ^ Беннетт, Швейцария (ноябрь 1973 г.). «Логическая обратимость вычислений». Журнал исследований и разработок IBM . 17 (6): 525–532. дои : 10.1147/rd.176.0525 .
- ^ Jump up to: Перейти обратно: а б Бём, Коррадо; Якопини, Джузеппе (май 1966 г.). «Блок-схемы, машины Тьюринга и языки только с двумя правилами формирования». Коммуникации АКМ . 9 (5): 366–371. дои : 10.1145/355592.365646 .
- ^ Купер, Дэвид К. (август 1967 г.). «Сокращение блок-схем Бёмом и Якопини». Коммуникации АКМ . 10 (8): 463. дои : 10.1145/363534.363539 .
- ^ Дейкстра, Эдсгер (1968). «Перейти к заявлению, которое считается вредным» . Коммуникации АКМ . 11 (3): 147–148. дои : 10.1145/362929.362947 . S2CID 17469809 .
- ^ Jump up to: Перейти обратно: а б Робертс, Э. [1995] « Выходы из цикла и структурированное программирование: возобновление дебатов », Бюллетень ACM SIGCSE, (27)1: 268–272.
- ^ Э. Н. Юрдон (1979). Классика программной инженерии . Юрдон Пресс. стр. 49–50 . ISBN 978-0-917072-14-7 .
- ^ Эшкрофт, Эдвард; Зоар Манна (1971). «Перевод go to program в программы while». Материалы Конгресса ИФИП . Статья, которую трудно получить в первоначальных материалах конференции из-за ее ограниченного распространения, была переиздана в книге Юрдона 1979 года, стр. 51–65.
- ^ Дэвид Энтони Ватт; Уильям Финдли (2004). Концепции проектирования языков программирования . Джон Уайли и сыновья. п. 228 . ISBN 978-0-470-85320-7 .
- ^ Кеннет С. Лауден; Кеннет А. Ламберт (2011). Языки программирования: принципы и практика (3-е изд.). Cengage Обучение. стр. 422–423 . ISBN 978-1-111-52941-3 .
- ^ КОСАРАЮ, С. РАО. «Анализ структурированных программ», Учеб. Пятый ежегодный сироп ACM. Теория вычислений (май 1973 г.), 240–252; также Косараджу, С. Рао (1974). «Анализ структурированных программ». Журнал компьютерных и системных наук . 9 (3): 232–255. дои : 10.1016/S0022-0000(74)80043-7 . цитируется Дональд Кнут (1974). «Структурное программирование с переходом к операторам». Вычислительные опросы . 6 (4): 261–301. CiteSeerX 10.1.1.103.6084 . дои : 10.1145/356635.356640 . S2CID 207630080 .
- ^ Брендер, Рональд Ф. (2002). «Язык программирования BLISS: история» (PDF) . Программное обеспечение: практика и опыт . 32 (10): 955–981. дои : 10.1002/спе.470 . S2CID 45466625 .
- ^ Оригинальная статья Томас Дж. Маккейб (декабрь 1976 г.). «Мера сложности» . Транзакции IEEE по разработке программного обеспечения . СЭ-2 (4): 315–318. дои : 10.1109/tse.1976.233837 . S2CID 9116234 . Дополнительную экспозицию см. Пол К. Йоргенсен (2002). Тестирование программного обеспечения: подход мастера, второе издание (2-е изд.). ЦРК Пресс. стр. 150–153. ISBN 978-0-8493-0809-3 .
- ^ Уильямс, Миннесота (1983). «Блок-схемы и проблема номенклатуры» . Компьютерный журнал . 26 (3): 270–276. дои : 10.1093/comjnl/26.3.270 .
- ^ Рамшоу, Л. (1988). «Устранение переходов при сохранении структуры программы» . Журнал АКМ . 35 (4): 893–920. дои : 10.1145/48014.48021 . S2CID 31001665 .
- ^ Годфри Нолан (2004). Декомпиляция Java . Апресс. п. 142. ИСБН 978-1-4302-0739-9 .
- ^ https://www.usenix.org/legacy/publications/library/proceedings/coots97/full_papers/proebsting2/proebsting2.pdf [ только URL-адрес PDF ]
- ^ http://www.openjit.org/publications/pro1999-06/decompiler-pro-199906.pdf . [ только URL-адрес PDF ]
Дальнейшее чтение [ править ]
Материал, еще не рассмотренный выше:
- ДеМилло, Ричард А. (1980). «Пространственно-временные компромиссы в структурированном программировании: улучшенная теорема комбинаторного вложения» . Журнал АКМ . 27 (1): 123–127. дои : 10.1145/322169.322180 . S2CID 15669719 .
- Девьен, Филипп (1994). «Одного двоичного предложения достаточно». Стакс 94 . Конспекты лекций по информатике. Том. 775. стр. 19–32. CiteSeerX 10.1.1.14.537 . дои : 10.1007/3-540-57785-8_128 . ISBN 978-3-540-57785-0 .