Почему COBOL имеет как `SECTION`, так и` PARAGRAPH`?

Почему COBOL имеет как SECTION, так и PARAGRAPH?

Может кто-нибудь объяснить, почему дизайнеры COBOL создали как SECTION, так и PARAGRAPH s? Они были со времен первоначального выпуска COBOL, поэтому я подозреваю, что настоящая причина их существования давно исчезла (аналогично вещам типа NEXT SENTENCE, которые все еще находятся в спецификации языка для обратной совместимости, но больше не требуются с момента введения явные терминаторы возможностей).

Я предполагаю, что SECTION может быть введен для поддержки наложений программ. SECTION имеет необязательный номер PRIORITY, связанный с ним, чтобы идентифицировать оверлей программы, частью которых является. Однако большинство современных реализаций COBOL игнорируют или отбрасывают числа ПРИОРИТЕТНОСТИ (и наложения).

В настоящее время я вижу, что SECTION все еще требуется в DECLARATIVE части PROCEDURE DIVISION, но не может найти оправдания для этого. Я не вижу, чтобы семантическая разница между SECTION и PARAGRAPH, кроме PARAGRAPH, была подчинена SECTION.

Некоторые магазины COBOL запрещают использование SECTION в пользу PARAGRAPH (кажется распространенным в Северной Америке). Другие запрещают PARAGRAPH в пользу SECTION (кажется распространенным в Европе). У других есть рекомендации относительно того, когда каждый из них подходит. Все это кажется мне совершенно произвольным - и это ставит вопрос: почему в первую очередь они были включены в спецификацию языка? И есть ли у них какое-либо отношение сегодня?

Если вы ответите на этот вопрос, было бы здорово, если бы вы также указали ссылку на поддержку своего ответа.

Спасибо

Ответы

Ответ 1

Нет ссылок на это, так как я слышал, как это передавалось мне от одного из старых таймеров в моем магазине, но...

В старых компиляторах COBOL, по крайней мере для IBM и Unisys, разделы могли загружаться в память по одному за раз. Назад в старые добрые времена, когда памяти было мало, программа, которая была слишком большой для загрузки в память сразу, смогла быть модульной для использования памяти с использованием разделов. Наличие обоих разделов и абзацев позволило программисту решить, какие части кода были загружены в память вместе, если они не могут быть загружены сразу - вы хотите, чтобы две части одного и того же цикла выполнения были загружены вместе для повышения эффективности. В настоящее время более или менее спорный вопрос.

Мой магазин использует только абзацы, запрещает GOTO и требует пунктов выхода, поэтому все наши ПЕРФОРМЫ PERFORM 100-PARAGRAPH THRU 100-EXIT или что-то похожее, что, кажется, делает абзацы больше похожими на разделы. Но я не думаю, что сейчас действительно большая разница.

Ответ 2

Я изучил COBOL около 1978 года на ICL 2903. У меня неопределенная память о том, что заголовкам SECTION можно присвоить диапазон номеров, а это значит, что эти заголовки SECTION могут быть заменены и выведены из памяти, когда программа была слишком большой для памяти.

Ответ 3

Ну, самая простая причина в том, что SECTION s предоставляет вам "модульность" - как функции на C - необходимость в "структурированных" программах. Вы заметили бы, что код, написанный с использованием СЕКЦИЙ, выглядит гораздо читабельнее, чем код, написанный только в параграфах, так как каждый раздел должен иметь "EXIT" - единственную и очень явную точку выхода из СЕКЦИИ (точка выхода парагрпаха далеко более неопределенным и неявным, т.е. до тех пор, пока не будет найдено новое объявление абзаца). Рассмотрим этот пример, и у вас может возникнуть соблазн использовать разделы в вашем коде:

*==================
 MAINLINE SECTION.
*==================
     PERFORM SEC-A
     PERFORM SEC-B
     PERFORM SEC-C
     GOBACK.
*==================
 MAINLINE-EXIT.
*==================
    EXIT.

*==================
 SEC-A SECTION.
*==================

.....
.....
.....
.....

    IF <cond>
       go to A-EXIT
    end-if

..... 
.....
.....
.....

.

*==================
 A-EXIT.
*==================
    EXIT.

Не думайте, что у вас будет такая возможность при написании ваших кодов в параграфах. Возможно, вам пришлось написать огромное выражение ELSE, чтобы скрыть заявления, которые вы не хотели выполнять, когда было достигнуто определенное условие (подумайте, что набор операторов работает на 2-3 страницах... еще один набор IF/ELSE будет судороги для углубления). Разумеется, вам нужно будет использовать "GO TO" для достижения этого, но вы всегда можете направить своих профессионалов не использовать GO TO, за исключением Exiting, что справедливо, я думаю.

Итак, хотя я также согласен с тем, что все, что может быть написано с помощью SECTION, также может быть написано с использованием параграфов (с небольшими или никакими хитростями), моим личным выбором было бы пойти на реализацию, которая может сделать работу моих разработчиков немного легче в будущем!

Ответ 4

Я знаю, что это старый вопрос, но OP запросил документацию об исходном обосновании использования SECTION, а также PARAGRAPH в COBOL.

Вы не можете получить гораздо больше "оригинала", чем документация журнала CODASYL.

в разделе 8 спецификации журнала для языка,

"Сегментация COBOL - это средство, которое обеспечивает средство, с помощью которого пользователь может связываться с компилятором для указания объектной программы требования о перекрытии"

(стр. 331, раздел 8.1 "Сегментация - общее описание" )

"Хотя это необязательно, Отдел процедур для источника программа обычно записывается как последовательная группа разделов, каждая из которых который состоит из серии тесно связанных операций, которые предназначенные для коллективной работы определенной функции. Однако, когда сегментация, весь Отдел процедур должен находиться в разделы. Кроме того, каждый раздел должен классифицироваться как принадлежность либо к фиксированной части, либо к одному из независимых сегментов объектной программы. Сегментация никоим образом не влияет на квалификация имен процедур для обеспечения уникальности".

(p 331, раздел 8.1.2.1 "Сегменты программ" )

В своей книге о сравнительных языках программирования ( "Языки программирования: история и основы", 1969) Жан Саммет (который сидел в комитете CODASYL, представляя Sylvania Electric), утверждает:

".. Распределение памяти автоматически обрабатывается компилятором. Основным блоком для назначения исполняемого кода является группа разделов называемый сегментом. Программист объединяет разделы, указывающие номер приоритета с именем каждого раздела.... Требуется компилятор чтобы убедиться, что предусмотрены надлежащие передачи контроля, чтобы контроль между сегментами, которые не сохраняются одновременно, могут иметь место...."

(p 369 - 371 V.3 COBOL)

Ответ 5

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

Если я правильно помню, единственная причина, по которой вы должны использовать SECTION, - это DECLARATIVES. Кроме того, они являются необязательными и в первую очередь полезны для группировки абзацев. Я думаю, что это общепринято (условно говоря, так или иначе), чтобы потребовать, чтобы PERFORM использовался в абзацах только тогда, когда они находятся в одном разделе.

Ответ 6

Раздел может содержать несколько абзацев. Когда вы выполняете раздел, он выполняет все абзацы в разделе. В разделе вы можете использовать PERFORM или GOTO для перехода к параграфам раздела.

Ответ 7

Cobol был разработан в середине 50-х годов. Как следует из полного названия, он был разработан для бизнес-программирования как язык, более соответствующий бизнес-целям, чем существующие "научные" или "технические" языки (в любом случае было очень мало "языков", а "машинный код" (конкретный, конечно, к определенной архитектуре (я почти сказал "конкретный чип", прежде чем думать о вакуумных лампах)), которые, возможно, придется устанавливать через физические переключатели/циферблаты на некоторых машинах), и если повезет с "Ассемблером". Cobol был очень продвинут в течение своего дня, с его целью.

Предполагалось, что программы, написанные на Cobol, будут намного больше похожи на английский язык, чем просто набор "кодов", которые означают что-то для инициированного.

Если вы посмотрите на некоторую номенклатуру, относящуюся к формулировке - параграф, предложение, глагол, - преднамеренно следуют шаблонам, приписываемым английскому языку.

SECTION не совсем вписывается в это, пока вы не свяжете вещи с официальным бизнес-документом.

И РАЗДЕЛЫ, и абзацы также появляются вне ПРОЦЕДУРНОГО ОТДЕЛЕНИЯ. Как и в письменном английском, абзацы могут существовать сами по себе или могут быть частью СЕКЦИИ.

СЕКЦИИ могут иметь номер приоритета, который относится к "функции сегментации". Это использовалось для включения "наложения" СЕКЦИЙ, чтобы обеспечить примитивный уровень управления памятью. Это "компьютерный помощник", а не англоязычный:-) "Функция сегментации" имеет что-то вроде остаточного влияния, но я никогда не видел, чтобы оно действительно использовалось.

Без ДЕКЛАРАТИВОВ (который я не использую, и только что заметил, что руководство неясно), то это "выбор" относительно того, используются ли СЕКЦИИ или абзацы для PERFORM.

Если GO GO используется, рационально, "эквивалентность" может быть достигнута с помощью PERFORM... TRHU.... Если нет, и нет безвозмездного использования PERFORM... THRU..., то есть эквивалентность уже.

Сравнение с "структурированным" кодом и современными языками "чтение истории назад" или просто определение конкретной "практики". Из репутации, достигнутой "кодом спагетти" и ALTER... ПРОИЗОШЛО... возможно, что в течение 20 лет было "общим" не делать ничего с PERFORM, если вам не нужно "управление памятью", но я не имеют никаких ссылок или знаний, чтобы поддержать это.

РАЗДЕЛЫ позволяют дублировать имена абзацев, иначе имена абзацев должны быть уникальными.

Я не могу накладывать определенный палец на один над другим все время.

Если вы используете GO TO, я бы использовал СЕКЦИИ. Если нет, параграфы. С ДЕКЛАРАЦИЯМИ я бы использовал РАЗДЕЛЫ. Если вы используете РАЗДЕЛЫ, я бы начал ОТЧЕТ ПРОЦЕДУРЫ с РАЗДЕЛЕМ, чтобы избежать диагностического сообщения.

Местные стандарты могут диктовать, но не обязательно на "современной" (или даже "рациональной" основе). Многое "известно", но на самом деле неправильно понимает СЕКЦИИ и параграфы, по моему опыту.

Для производительности (когда массивы данных обрабатываются, и я имею в виду массы), то ПРОДВИЖЕНИЕ одной СЕКЦИИ, а не нескольких отдельных абзацев, увидит улучшения. Эффект будет таким же, как и для PERFORM... THRU..., но я предпочитаю не рекомендовать его. GO TO вне диапазона PERFORM 1) плохой 2) может проиграть "оптимизацию". Не должно быть проблем * кроме "когда GO TO abend/exception и не ожидает какого-либо логического возврата. Если использование этого ощущается обязательно" немедленно ", то это лучше сделать с PERFORM, несмотря на" контринтуитивный "аспект (так документируйте его).

Ответ 8

Мы используем COBOL СЕКЦИЯ для всех наших программ COBOL 37K MVS. Мы используем эту технику, чтобы значительно ускорить время работы и значительно сократить расходы на процессор. Этот метод кодирования COBOL очень похож на высокопроизводительный серийный ассемблер.

Назовите его Высокопроизводительное функционально структурированное COBOL программирование

После определения СЕКЦИИ все PERFORM xxxxx вернутся в следующий закодированный РАЗДЕЛ, а не в следующий параграф в РАЗДЕЛЕ. Если параграфы кодируются перед первой СЕКЦИЕЙ, они могут выполняться в обычном режиме. (Но мы этого не допускаем)

Использование SECTION имеет более высокие накладные расходы, чем при использовании, и PERFORM только абзацы - БЕСПЛАТНО - вы используете логику GOTO для обхода кода, который должен быть условно выполненным. Наше правило состоит в том, что GOTO может указывать только на Tag-Line в той же СЕКЦИИ. (абзац) Все параграфы в СЕКЦИИ должны быть подфункцией функции СЕКЦИИ. Инструкция EXIT представляет собой инструкцию NOP ассемблера. Он позволяет размещать Tag-Line до следующей SECTION - быстрый выход/возврат.

Выполнение PERFORM xxxx THRU У yyyy больше накладных расходов процессора, чем выполнение СЕКЦИИ без GOTO.

ПРЕДУПРЕЖДЕНИЕ: Выполнение PERFORM xxxx Tag-Line в СЕКЦИИ будет проходить через весь код в СЕКЦИИ до тех пор, пока не появится следующая СЕКЦИЯ. A GOTO Tag-Line вне текущей СЕКЦИИ будет проходить через весь код в новой площадке СЕКЦИИ до тех пор, пока не будет обнаружена следующая СЕКЦИЯ. (Но мы этого не допускаем)