Страницы

Показаны сообщения с ярлыком структурный код. Показать все сообщения
Показаны сообщения с ярлыком структурный код. Показать все сообщения

Пустили EXIT в Oberon

Многие из немногих, программирующих на диалектах языка Oberon, полагают, что циклы FOR, WHILE и REPEAT не содержат иного способа досрочно прервать их выполнение кроме как через выход из процедуры с помощью неструктурного RETURN, и только специальный цикл LOOP по EXIT позволяет неструктурно покинуть его, не покидая саму процедуру.

Как же легко людей обмануть. В Oberon, Oberon-2, Component Pascal, Active Oberon всегда можно было написать, например, так:

FOR i := 0 TO LEN(a) - 1 DO
  IF a[i] = b THEN
    EXIT
  END
END;

Структурное программирование не про запрет GOTO

Смотрит на вас как на GOTO.

Теорема Бёма — Якопини, которую часто называют теоремой про структурное программирование, на самом деле доказывает прямо противоположное тому, что ей приписывается. Она не доказывает достаточности структурного программирования, а наоборот, доказывает, что с помощью структурных операторов управления можно идеально воспроизводить любой неструктурный код, но сохраняя таким образом и все его отрицательные для человека свойства. Более подходящим названием для теоремы было бы «теорема про неструктурное программирование в структурных операторах».

Рассмотрим дикий бессмысленный пример неструктурного кода:

L0: Call0; IF Pred0 GOTO L2;
L1: Call1; IF Pred1 GOTO L3;
L2: Call2; IF Pred2 GOTO L3 ELSE GOTO L0;
L3: Call3; IF Pred3 GOTO L4 ELSE GOTO L1;

Накладные расходы на структурное программирование

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