2009-11-04 10 views
18

Warum hat COBOL SECTION und PARAGRAPH?Warum hat COBOL sowohl `SECTION` als auch` PARAGRAPH`?

Kann jemand erklären, warum die Designer von COBOL sowohl SECTION s als auch PARAGRAPH s kreierten? Diese gibt es seit der ersten Veröffentlichung von COBOL, daher vermute ich, dass der wahre Grund für ihre Existenz längst weg ist (ähnlich wie Dinge wie NEXT SENTENCE, die aus Gründen der Abwärtskompatibilität immer noch in der Sprachspezifikation sind, aber seit der Einführung des expliziten Bereichs nicht mehr benötigt werden) Terminatoren).

Meine Vermutung ist, dass SECTION möglicherweise eingeführt wurden, um Programm-Overlays zu unterstützen. SECTION verfügt über eine optionale PRIORITY-Nummer, die das Programm-Overlay identifiziert, zu dem es gehört. Die meisten modernen Implementierungen von COBOL ignorieren oder haben jedoch PRIORITY-Nummern (und Overlays) fallen gelassen.

Derzeit sehe ich, dass SECTION s immer noch im DECLARATIVE Teil der PROCEDURE DIVISION erforderlich sind, kann aber keine Rechtfertigung dafür finden. Ich sehe keinen semantischen Unterschied zwischen SECTION und PARAGRAPH anders als PARAGRAPH ist SECTION untergeordnet.

Einige COBOL Geschäfte verbieten die Verwendung von SECTION zugunsten PARAGRAPH (scheint in Nordamerika üblich). Andere verbieten PARAGRAPH zugunsten SECTION (scheint in Europa üblich). Wieder andere haben Richtlinien, wann jeder angemessen ist. All das erscheint mir höchst willkürlich - und das wirft die Frage auf: Warum wurden sie überhaupt in die Sprachspezifikation aufgenommen? Und haben sie heute Relevanz?

Wenn Sie diese Frage beantworten, wäre es großartig, wenn Sie auch auf eine Referenz verweisen könnten, um Ihre Antwort zu unterstützen.

Dank

Antwort

5

Keine Hinweise dazu, da ich es von einem der Oldtimer in meinem Laden gehört habe, aber ...

In den alten COBOL Compilern, zumindest für IBM und Unisys, konnten Abschnitte einzeln in den Speicher geladen werden. In der guten alten Zeit, als Speicher knapp war, konnte ein Programm, das zu groß war, um es gleichzeitig in den Speicher zu laden, für die Speichernutzung mit Hilfe von Sektionen modularisiert werden. Mit beiden Abschnitten und Absätzen konnte der Programmierer entscheiden, welche Codeteile zusammen in den Speicher geladen wurden, wenn sie nicht alle gleichzeitig geladen werden konnten - Sie sollten zwei Teile des gleichen Perform-Loops aus Gründen der Effizienz zusammen laden. Heutzutage ist es mehr oder weniger strittig.

Mein Shop verwendet nur Absätze, verbietet GOTO und erfordert Absätze, so dass alle unsere PERFORMEN PERFORM 100-PARAGRAPH THRU 100-EXIT oder etwas ähnliches sind - was die Absätze für mich eher wie Abschnitte erscheinen lässt. Aber ich denke nicht, dass es jetzt wirklich einen Unterschied macht.

+0

Bah, ich sehe, dass Colemanj die gleiche Antwort hatte wie ich. Ich scrollte einfach den ersten Antworteintrag hinunter. Ich kann die Antworten anderer nicht kommentieren, also werde ich das als etwas erweiterte Erklärung dessen, was colemanj sagte, hinterlassen. –

+0

Ich denke, Sie und Colemanj haben die richtige Antwort, aber Ihre Antwort ist deutlicher. Programmsegmentierung war der "State of the art" -Mechanismus zum Verwalten "großer" Programme in einem kleinen Adressraum. Zum Glück virtuellen Speicher machte diese Funktion veraltet (Ich habe lange genug um haben die "Freude" des Schreibens segmentierten Programme erlebt). Alles, was ich sehe, ist ist eine mögliche "Namen Abstand" Verwendung und eine unerklärliche Anforderung, dass Deklaratives Abschnitte im Gegensatz zu Paragraphen verweisen (wie von Tim Sylvester hingewiesen). – NealB

1

Zum einen Absatz Namen eindeutig sein müssen, wenn sie in separaten Abschnitten sind, so Abschnitte für „Namespacing“ der Absätze ermöglichen.

Wenn ich mich recht erinnere, ist der einzige Grund, warum Sie müssen verwenden ein SECTION für DECLARATIVES ist. Abgesehen davon sind sie optional und in erster Linie nützlich zum Gruppieren von Absätzen. Ich denke, es ist üblich (relativ gesehen sowieso), dass PERFORM nur für Absätze verwendet werden darf, wenn sie sich im selben Abschnitt befinden.

+0

ich über das vergessen hatte‚Namespacing‘-Funktion, dass' SECTION's bieten über 'PARAGRAPH's, war aber, dass die Begründung der Sprachdesigner verwendet Wenn man sich diese Konstrukte vorstellt, hat J.Sammet vor einiger Zeit einen interessanten Artikel über die Frühgeschichte von COBOL geschrieben, in dem einige Einsichten darüber gegeben wurden, warum bestimmte Sprachmerkmale so sind, wie sie sind, aber keinen Einblick darüber lieferten, warum beide SECTION "und" PARAGRAPH "wurden integriert. Ich verstehe es einfach nicht - aber diese Leute waren keine Dummies, also stelle ich mir vor, dass es gute Gründe dafür gegeben hat, sie zu haben. Danke, Neal – NealB

6

Ich lernte COBOL um 1978 auf einer ICL 2903. Ich habe eine vage Erinnerung, dass die SECTION-Header einen Nummernbereich zugewiesen werden konnten, was bedeutete, dass diese SECTION-Header innerhalb und außerhalb des Speichers ausgetauscht werden konnten, wenn das Programm war zu groß für die Erinnerung.

+1

Ja, das waren PRIORITY Nummern, und Ich wette, du könntest mir ein paar Horrorgeschichten erzählen, dass ich sie auch benutzen muss. Ich glaube, dass ein Programm in echte Schwierigkeiten geraten könnte, wenn Sie jemals ein unabhängiges Segment (Prioritätszahl> = 50) auf ein anderes unabhängiges Segment verweisen lassen würden. Glücklicherweise sind diese Tage jetzt ziemlich hinter uns ... – NealB

1

Ein Abschnitt kann mehrere Absätze enthalten. Wenn Sie einen Abschnitt ausführen, führt es alle die Abschnitte in dem Abschnitt aus. Innerhalb des Abschnitts können Sie mit PERFORM oder GOTO zu den Absätzen innerhalb des Abschnitts verzweigen.

+0

Daher die EXIT-Anweisung als Ziel für GO-TOs. Heute ist EXIT nur ein Ort, um einen Absatznamen zu "hängen". Ich denke, einige frühe Compiler benötigten EXIT, um die einzige Aussage im letzten Abschnitt eines ausgeführten Bereichs von SEKTIONEN/PARAGRAPHEN zu sein. Es war erforderlich, Code zu generieren, der die Rückkehr aus einem PERFORMed-Bereich implementiert. Da PARAGRAPH dem SECTION untergeordnet ist, kann man erwarten, dass PERFORMING a SECTION alle enthaltenen Absätze ausführt. Eine Reihe von Absätzen kann unter Verwendung von PERFORM para-1 THROUGH para-n ausgeführt werden, so dass die gleiche Funktionalität nur unter Verwendung von Absätzen erreicht werden kann. – NealB

-1

Wir verwenden COBOL SECTION Codierung in allen unseren 37K MVS Batch COBOL-Programme. Wir verwenden diese Technik, um viel schnellere Laufzeiten zu erhalten und den CPU-Overhead deutlich zu reduzieren. Diese COBOL-Codiertechnik ist dem Hochleistungs-Batch-Assembler sehr ähnlich.

Nennen Sie es High Performance Funktionell Structured COBOL Programmierung

Sobald ein Abschnitt definiert ist, alle PERFORM xxxxx bei der nächsten codierten Abschnitt nicht der nächste Absatz im Abschnitt zurück. Wenn Absätze vor dem ersten ABSCHNITT codiert sind, können sie normal ausgeführt werden. (Aber wir dies nicht zulassen)

einen Abschnitts Verwendung hat eine höheren Aufwand als bei der Verwendung und PERFORM ing nur Ziffern - SOFERN - Sie GOTO Logik in dem Bypass-Code verwenden, sollte bedingt ausgeführt. Unsere Regel ist, dass ein GOTO nur auf einen Tag-Line im selben SECTION verweisen kann. (ein Absatz) Alle Absätze in einem ABSCHNITT müssen eine Unterfunktion der Funktion SEKTION sein. Die Anweisung EXIT ist eine Assembler-NOP-Anweisung. Es kann ein Tag-Line vor dem nächsten SECTION platziert werden - ein schneller Ausgang/Rückkehr.

Ausführen eines PERFORM xxxx THRU yyyy mehr CPU-Overhead als die Ausführung eines SECTION ohne die GOTO s hat.

WARNUNG: Die Ausführung eines PERFORM xxxx Tag-Line in einem SECTION wird durch den gesamten Code im SECTION fallen, bis der nächste SECTION gefunden wird. A GOTOTag-Line außerhalb des aktuellen SECTION wird durch den gesamten Code in der neuen Landing SECTION fallen, bis der nächste SECTION gefunden wird.

+0

Interessant ... Haben Sie Benchmark-Tests durchgeführt, um diese Leistungsunterschiede zwischen zu demonstrieren? Ich hatte den Eindruck, dass der in IBM-Compilern verwendete Mechanismus * exakt * der gleiche war, wenn PERFORMING SECTIONS und PARAGRAPHS ausgeführt wurden. Der Kontrollmechanismus, der in IBM COBOL Compilern verwendet wird, um die Rückkehr von einem PERFORM zu implementieren, wird in [diesem Papier] beschrieben (http://portal.acm.org/citation.cfm?id=381788.316163) Ich würde keinen Unterschied erwarten bei der Durchführung eines Abschnitts oder eines Absatzes. – NealB

+1

Ich weiß, das ist "alt", aber ... Es gibt viele Widersprüche und Missverständnisse hier. Sie mögen aus schlechtem Wortlaut geboren sein, aber sie sind da. "Coder Vorsicht". Die "Warnung" macht insbesondere keinen Sinn - der erste Teil ist nicht wahr, der zweite Teil muss nicht wahr sein. Es gibt nur einen Sinn, in dem die Durchführung einer SEKTION mit mehreren Absätzen "schneller" ist als die Ausführung der einzelnen Absätzen (außerhalb einer SEKTION wäre es absurd, wenn sie * innerhalb * einer SEKTION sind): PERFORM A-SECTION (enthält B-PARA und C-PARA) PERFORM B-PARA PERFORM C-PARA Die erste ist weniger Code. –

+0

Als COBOL-Compiler-Schriftsteller zu sprechen, ist dies eine Menge Unsinn. Die Verwendung eines ABSCHNITTES unterscheidet sich nicht wesentlich von der Verwendung von Absätzen. Es gibt keinen Grund zu erwarten, dass es schneller oder langsamer wird, je nachdem, was Sie behaupten. Ich weiß nicht, warum Sie den Nicht-COBOL-Begriff 'Tag-Line' verwenden, wenn PARAGRAPH bereits existiert. Die von Ihnen beschriebene Codierungstechnik hat überhaupt nichts mit "Hochleistungs-Batch-Assembler" zu tun. GOTO zu verwenden, um bedingte Logik zu umgehen, ist der Verwendung von ELSE nicht vorzuziehen. EXIT ist kein Assembler-NOP: Es ist eine bedingte Rückgabe. Es gibt keine GOTOs in PERFORM xxx THRU yyy. @ BillWoodger ++ – EJP

2

Nun, der einfachste der Gründe ist, dass SECTION s Ihnen die "Modularität" bietet - genauso wie Funktionen in C - eine Notwendigkeit in den "strukturierten" Programmen. Sie würden bemerken, dass Code, der mit SECTIONs geschrieben wurde, viel lesbarer ist als der Code, der nur in Paragraphen geschrieben wird, denn jeder Abschnitt muss einen "EXIT" haben - einen einzigen und sehr expliziten Ausgangspunkt von einem SECTION (Ausgangspunkt eines Paragrapah ist weit) vage und implizit, dh bis eine neue Absatzdeklaration gefunden wird). Betrachten Sie dieses Beispiel und Sie können versucht sein, Abschnitte in Ihrem Code zu verwenden:

*================== 
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. 

Denken Sie nicht, Sie diese Art von einem privlege haben würde, wenn die Codes in den Absätzen zu schreiben. Möglicherweise mussten Sie eine riesige ELSE-Anweisung schreiben, um die Anweisungen zu verdecken, die Sie nicht ausführen wollten, wenn eine bestimmte Bedingung erreicht wurde (bedenken Sie, dass die Anweisungen auf 2-3 Seiten laufen ... eine weitere Gruppe von IFs)/ELSE würde dich zum Einrücken verkrampfen). Natürlich müssen Sie "GO TO" verwenden, um dies zu erreichen, aber Sie können Ihre Fachleute immer darauf hinweisen, GO TOs nicht zu verwenden, außer während Exitting, was ein fairer Deal ist, denke ich.

Also, während ich auch zustimme, dass alles, was mit SECTIONs geschrieben werden kann, auch mit Absätzen geschrieben werden kann (mit wenig oder keinen Tweaks), wäre meine persönliche Entscheidung für eine Implementierung, die die Arbeit meiner Entwickler machen kann ein bisschen einfacher in der Zukunft!

+1

+1 für das interessante Feedback. Sie beschreiben einen bestimmten Codierungsstil unter Verwendung von SECTION/PARAGRAPH anstatt , um die Sprachentwicklungskriterien zu identifizieren, die zur Aufnahme von SECTION und PARAGRAPH in die COBOL-Sprachspezifikation führten. Beachten Sie in Ihrem Beispiel, wenn SECTION-Header gelöscht werden, sie in PARAGRAPHs, und "PERFORM SEC-A" wird durch "PERFORM SEC-A THRU A-EXIT" usw. Sie haben ein funktionell gleichwertiges Programm mit nur PARAGRAPH. BTW '' '' ''' ''' '' '' '' '' vor '' GOBACK '' setzen, sonst 'GEHE ZU MAINLINE-EXIT 'wird die meisten sicherlich zu Problemen führen! – NealB

+0

Diejenigen, die auf "GO TO" als "erste Antwort" auf einen Programmentwurfsfehler zurückgreifen :-) neigen dazu, sich vorzustellen, dass diejenigen, die nicht tief verschachtelte IF/EVALUATE stattdessen programmieren müssen. Das muss nicht wahr sein, obwohl es passiert. –

1

Cobol wurde Mitte der 50er Jahre entwickelt. Wie der vollständige Name andeutet, wurde es für die geschäftliche Programmierung entwickelt, da es sich um eine für geschäftliche Zwecke relevantere Sprache als die bestehenden "wissenschaftlichen" oder "technischen" Sprachen handelt (es gab sowieso sehr wenige "Sprachen" und "Maschinencode") natürlich zu einer bestimmten Architektur (ich habe fast "speziellen Chip" gesagt, bevor ich an Vakuumröhren dachte), die bei einigen Maschinen durch physische Schalter/Zifferblätter eingestellt werden müssen) und wenn Sie Glück haben mit einem "Assembler". Cobol war für seinen Zweck sehr fortschrittlich.

Die Absicht war für Programme, die in Cobol geschrieben wurden, viel mehr wie Englisch zu sein als nur eine Reihe von "Codes", die etwas für die Initiierten bedeuten.

Wenn Sie sich die Nomenklatur in Bezug auf die Sprache ansehen - Absatz, Satz, Verb, Klausel - folgt sie bewusst den Mustern, die der englischen Sprache zugeschrieben werden.

SECTION passt nicht so gut, bis Sie die Dinge auf ein formelles Geschäftsdokument beziehen.

Beide Abschnitte und Absätze erscheinen auch außerhalb der PROCEDURE DIVISION. Wie im geschriebenen Englisch können Absätze selbstständig existieren oder Teil eines ABSCHNITTES sein.

Sektionen können eine Prioritätsnummer haben, die sich auf die "Segmentierungsfunktion" bezieht. Dies beinhaltete das "Überlagern" von SECTIONs, um eine primitive Speicherverwaltung zu ermöglichen. Dies ist ein "Computer-Featuer" und kein englischsprachiger :-) Die "Segmentierungsfunktion" hat etwas von einem verbleibenden Effekt, aber ich habe es nie wirklich benutzt gesehen.

Ohne DECLARATIVES (die ich nicht verwende, und habe gerade bemerkt, dass das Handbuch unklar zu sein), dann ist es "Wahl", ob Sektionen oder Absätze für PERFORM verwendet werden.

Wenn GO TO verwendet wird, kann rational "Äquivalenz" mit PERFORM ... TRHU ... erreicht werden. Wenn nicht, und es gibt keine unnötige Verwendung von PERFORM ... THRU ..., dann gibt es Gleichwertigkeit bereits.

Vergleiche mit "strukturiertem" Code und modernen Sprachen sind "Geschichte rückwärts lesen" oder nur eine bestimmte "Praxis" umreißen. Von dem Ruf, den "Spaghetti-Code" und ALTER ... bis zu ... erreichen, mag es gut sein, dass es 20 Jahre lang üblich war, nicht viel mit PERFORM zu tun, außer man brauchte das "Speichermanagement", aber ich habe keine Referenzen oder Kenntnisse, um dies zu untermauern.

SECTIONs erlauben doppelte Absatznamen, ansonsten müssen Absatznamen eindeutig sein.

Ich kann nicht die ganze Zeit einen bestimmten Finger auf den anderen legen.

Wenn ich GO TO verwende, würde ich SECTIONs verwenden.Wenn nicht, Absätze. Mit DECLARATIVES würde ich SECTIONs verwenden. Bei Verwendung von SECTIONs würde ich PROCEDURE DIVISION mit einem SECTION starten, um eine Diagnosemeldung zu vermeiden.

Lokale Standards können diktieren, aber nicht unbedingt auf einer "modernen" (oder sogar "rationalen") Grundlage. Es ist vieles "bekannt", aber nach meiner Erfahrung missverstanden zu SEKTIONEN und Paragraphen.

Für die Leistung (wo Massen von Daten verarbeitet werden, und ich meine Massen) dann würde eine PERFORM von einem ABSCHNITT anstatt mehrere einzelne Absätze Verbesserungen sehen. Der Effekt wäre der gleiche mit PERFORM ... THRU ..., aber ich bevorzuge es nicht zu empfehlen. GO TO außerhalb der Reichweite eines PERFORM ist 1) schlecht 2) kann auf "Optimierung" verlieren. Sollte kein Problem sein * außer "wenn ABO ABEND/Exception und keine logische Rückkehr erwarten. Wenn die Verwendung dieser als notwendig" sofort "empfunden wird, dann ist es besser mit einem PERFORM trotz der" Counter-Intuitive "Aspekt (so sie dokumentieren).

2

ich weiß, das ist eine alte Frage, aber die OP über Dokumentation auf der ursprünglichen Begründung der Verwendung von SECTION sowie Absatz in COBOL angefordert.

können Sie nicht bekommen viel mehr "original" als die CODASYL Journal Dokumentation.

in Abschnitt 8 von der Spezifikation des Journal für die Sprache,

„COBOL Segmentierung ist eine Einrichtung, die ein Mittel, durch das liefert die Benutzer mit dem Compiler kommunizieren kann Objektprogramm overlay Anforderungen zu spezifizieren“

(Seite 331, Kapitel 8.1 „Segmentation - Allgemeine Beschreibung“)

„Obwohl es nicht zwingend vorgeschrieben ist das Verfahren der Division, für eine Quelle Programm in der Regel als eine aufeinanderfolgende Gruppe von Abschnitten, die jeweils geschrieben ist, die aus einer Reihe von eng verwandten Operationen, die eine zusammengesetzt ist, Re entworfen, um eine bestimmte Funktion gemeinsam durchzuführen. Wenn jedoch die Segmentierung verwendet wird, muss sich die gesamte Prozedurdivision in den Abschnitten befinden. Außerdem muss jeder Abschnitt als zu dem festen Abschnitt gehörend oder zu einem der unabhängigen Segmente gehörenden Objektprogramm klassifiziert werden. Die Segmentierung in keiner Weise beeinflusst die Notwendigkeit Qualifizierung von Verfahren-Namen Eindeutigkeit zu gewährleisten.“

(S. 331, Abschnitt 8.1.2.1‚Programmsegmente‘)

In ihrem Buch über vergleichende Programmiersprachen ("Programmiersprachen: Geschichte und Grundlagen", 1969) Jean Sammet (die auf dem CODASYL Komitee saß, was Sylvania Electric) heißt es:

“.. die Speicherzuweisung wird automatisch vom Compiler behandelt. Die Haupteinheit zum Zuweisen von ausführbarem Code ist eine Gruppe von Abschnitten , die als -Segment bezeichnet wird. Der Programmierer kombiniert Abschnitte, die eine Prioritätsnummer mit dem Namen jedes Abschnitts angeben. ... Der Compiler ist erforderlich , um zu sehen, dass die richtigen Steuerelement Transfers zur Verfügung gestellt werden, so dass die Kontrolle unter den Segmenten, die nicht gleichzeitig gespeichert sind stattfinden kann. ..."

(S. 369-371 V.3 COBOL)

Verwandte Themen