Startseite › Sprach-Frontends › COBOL Frontend › Übersicht Hilfe zum PBXB64-Compiler

PBXB64 - COBOL Language (V10)

PBXB64 supports a COBOL-85 core language that compiles to the same unified IR — and the same Windows x64 PE32+ executables — as B64, C, BASIC and PILOT. The frontend lowers COBOL source to the shared IrModule in a single pass using exact scaled fixed-point arithmetic for all numeric PIC fields — no floating-point rounding loss.

Kategorie: Übersicht

Beschreibung

PBXB64 supports a COBOL-85 core language that compiles to the same unified IR — and the same Windows x64 PE32+ executables — as B64, C, BASIC and PILOT. The frontend lowers COBOL source to the shared IrModule in a single pass using exact scaled fixed-point arithmetic for all numeric PIC fields — no floating-point rounding loss.

File extensions: .cbl, .cob, .CBL, .COB. Embedded COBOL blocks inside a host source file are recognized between the #COBOL and #COBOL END markers and execute at the directive site through a generated callable helper.

Referenzseiten

Diese Seite ist die Uebersicht zum Frontend. Die verlinkten Einzelseiten enthalten Syntax, getestete Beispiele, Status und Grenzen fuer die jeweiligen Befehle oder Sprachkonstrukte.

Command-Line Invocation

PBXB64 program.cbl -o program.exe

A standalone COBOL source file is classified by its extension and compiled and linked like any other frontend:

PBXB64 hello.cbl -o hello.exe
hello.exe

Embedded COBOL blocks within a host file (e.g. PowerBASIC) use the directive markers, analogous to the existing #FORTH mechanism:

#COBOL
       IDENTIFICATION DIVISION.
       PROGRAM-ID. EMBEDDED.
       PROCEDURE DIVISION.
           DISPLAY "From embedded COBOL".
           STOP RUN.
#COBOL END

In a host source file, the embedded COBOL block does not create a competing standalone main entry. PBXB64 lowers the block as an internal helper and emits a host-side call where the #COBOL directive appears.

Program Structure (Divisions)

A COBOL program consists of up to four divisions, which must appear in this order:

DivisionRoleSupport
IDENTIFICATION DIVISIONProgram name and metadata (PROGRAM-ID)Read, then skipped
ENVIRONMENT DIVISIONKonfiguration und line-sequential I/O-ZuweisungenSELECT ... ASSIGN wird fuer unterstuetzte Datei-I/O erkannt
DATA DIVISIONDatendefinitionen (WORKING-STORAGE und unterstuetzte FILE SECTION-Datensaetze)Unterstuetzte Teilmenge
PROCEDURE DIVISIONExecutable statements and paragraphsFully supported
       IDENTIFICATION DIVISION.
       PROGRAM-ID. MY-PROGRAM.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  WS-VALUE   PIC 9(4)  VALUE 0.
       PROCEDURE DIVISION.
       MAIN-PARA.
           MOVE 42 TO WS-VALUE.
           DISPLAY WS-VALUE.
           STOP RUN.
Source form: The frontend is free-form tolerant. Leading whitespace, fixed-column layout (Area A/B), sequence columns, fixed-form comment lines, basic continuation lines, and simple source-local COPY copybooks are accepted.

DATA DIVISION (Data Definitions)

PIC Symbols

SymbolMeaning
9Numeric digit (0–9)
XAlphanumeric character
AAlphabetic character
SSign (leading, signed)
VImplied decimal point
ZZero suppression
PScaling position
(n)Repetition factor, e.g. 9(5) = five digits

Examples

01  WS-COUNT     PIC 9(3)       VALUE 0.
01  WS-AMOUNT    PIC 9(7)V99    VALUE 1234.50.
01  WS-STOCK     PIC S9(6)      VALUE -100.
01  WS-NAME      PIC X(20)      VALUE "unknown".
01  WS-FILLER    PIC X(10)      VALUE SPACES.
01  WS-TABLE     PIC 9(3)       OCCURS 5 TIMES.
01  WS-CURR      PIC 9          VALUE 3.
01  WS-VAR-TBL.
    05 WS-VAR-ITEM PIC X(2)     OCCURS 1 TO 5 TIMES
                                DEPENDING ON WS-CURR
                                INDEXED BY WS-IX.

External Data Symbols

EXTERNAL and GLOBAL on WORKING-STORAGE items export the item as an object symbol with the exact COBOL source spelling:

01  SHARED-COUNT PIC S9(9) VALUE 41 EXTERNAL.

Das Objektsymbol ist SHARED-COUNT. Eine BASIC-Hauptquelle kann ein COBOL-eigenes numerisches External mit BRIDGE IMPORT name AS QUAD ALIAS "SHARED-COUNT" binden; die fokussierte Regression tests/pb/test_bridge_cobol_import_numeric.pb beweist, dass BASIC ein COBOL-Feld PIC S9(9) EXTERNAL lesen und schreiben kann. BASIC kann auch festen COBOL-Byte-Speicher mit BRIDGE IMPORT name AS STRINGZ * n ALIAS "COBOL-TEXT" binden; tests/pb/test_bridge_cobol_import_picx.pb beweist exakte Byte-Lesezugriffe ueber PEEK$ und Schreibzugriffe ueber den festen BASIC-Pufferpfad. Wenn COBOL die Hauptquelle ist, veroeffentlichen skalare numerische und feste PIC X/PIC A-EXTERNAL/GLOBAL-Elemente Bridge-Metadaten und erzeugen dieselbe C-Bridge-Header-Oberflaeche wie BASIC-Bridge-Builds. Dieser Bridge-Slice umfasst jetzt getestete numerische Export-Formen fuer DISPLAY, BINARY/COMP, COMP-3 und COMP-5; tests/cobol/bridge_cobol_primary_usage.cbl beweist, dass C-Consumer gepackten und nativen Binaerspeicher ueber die generierten Aliase aendern koennen. Der naechste Bridge-Slice deckt jetzt feste OCCURS-Arrays fuer dieselben Skalarformen ab: tests/cobol/bridge_cobol_primary_occurs_numeric.cbl beweist, dass C-Consumer einen numerischen OCCURS 3 TIMES-Export ueber den generierten Alias und die ausgegebenen PB_BRIDGE_*_COUNT/PB_BRIDGE_*_ELEMENT_SIZE-Metadaten lesen und schreiben koennen, und tests/cobol/bridge_cobol_primary_occurs_picx.cbl beweist dasselbe fuer festen PIC X(5) OCCURS 2 TIMES-Speicher. Ein-Level verschachtelte Gruppen mit festen Elementarfeldern werden ebenfalls als Bridge-Structs mit flachgezogenen, alias-sicheren Feldnamen und Offset-Metadaten ausgegeben: tests/cobol/bridge_cobol_group_nested_export.cbl beweist, dass C-Consumer verschachtelte Felder ueber die generierten Aliase aendern koennen, waehrend das exakte COBOL-Objektsymbol intakt bleibt. COBOL-Namen mit Bindestrich behalten ihr exaktes Objektsymbol und erhalten zusaetzlich einen C-sicheren Alias, zum Beispiel COBOL_COUNT fuer COBOL-COUNT; tests/cobol/bridge_cobol_primary_numeric.cbl, tests/cobol/bridge_cobol_primary_picx.cbl und die neuen OCCURS-Regressionen beweisen, dass C-Consumer numerischen und festen Byte-Speicher von COBOL ueber diese generierten Aliase aendern koennen. In der anderen Besitzrichtung beweist tests/pb/test_bridge_basic_cobol_export_picx.pb, dass ein BASIC-eigener BRIDGE EXPORT ... AS STRINGZ * 8 ALIAS "BASIC-TEXT" von COBOL als 01 BASIC-TEXT PIC X(8) EXTERNAL importiert werden kann; abweichende PIC X-Breiten werden abgelehnt. Doppelte COBOL-EXTERNAL/GLOBAL-Datensymbole, generierte Alias-Kollisionen und nicht unterstuetzte Aggregate oder OCCURS-Bridge-Exports werden zur Compile-Zeit abgelehnt. Die neuen OCCURS-Mismatch-Regressionen lehnen sowohl falsche Consumer-Array-Groessen als auch falsche Elementbreiten zur Compile-Zeit ab. Eingebettetes #COBOL USING-Hostvariablen-Binding ist fuer ganzzahlige BASIC-Skalarvariablen und feste STRINGZ * n-Puffer getestet: COBOL sieht Integer-Hosts als numerische 8-Byte-Felder, kann sie anzeigen oder aendern, und sieht feste Puffer als PIC X(n)-Speicher, der exakte Bytes round-tripped. Unbekannte Hostnamen, mehr als acht Hostvariablen, unsized STRINGZ, dynamische Strings, Gleitkommavariablen, Arrays, Strukturen, Objekte, Varianten und PICFIELD-Handles werden zur Compile-Zeit abgelehnt, bis sie einen eigenen typisierten Bridge-Vertrag haben.

Numeric Storage Accuracy

Every numeric field is stored as a scaled 64-bit integer (value × 10^scale). Arithmetic uses only native integer operations and is exact for all COBOL-85 fields up to 18 digits — no floating-point rounding loss. When storing into a field, the full COBOL-85 rules are enforced:

RuleBehaviour
High-order digit truncationMOVE 1234 TO 9(3) stores 234
Sign with unsigned PIC 9 (no S)Absolute value forced: MOVE -55 TO 9(4)55
Sign with PIC S9Sign preserved: MOVE -55 TO S9(4)-55

PROCEDURE DIVISION (Statements)

Executable code is organized into paragraphs. A paragraph header is an identifier followed by a period. Forward references to paragraphs (e.g. in PERFORM) are supported.

Supported Statements

StatementDescription
DISPLAYOutputs operands (literals and fields) to the console, followed by a newline
ACCEPTReads a value from the console into a field
MOVETransfers a value into a field (numeric with scaling/conversion, alphanumeric with padding)
ADDAdds operands to receivers: ADD a TO b or ADD a b GIVING c
SUBTRACTSubtracts: SUBTRACT a FROM b or SUBTRACT a FROM b GIVING c
MULTIPLYMultiplies: MULTIPLY a BY b (result in b) or MULTIPLY a BY b GIVING c
DIVIDEDivides: DIVIDE a INTO b, DIVIDE a BY b GIVING c
COMPUTEBerechnet einen Ausdruck unter Erhalt der natuerlichen Skalierung der Teilausdruecke; ROUNDED und ON SIZE ERROR werden unterstuetzt
IF / ELSE / END-IFConditional branching
PERFORMFuehrt Paragraphen und getestete Schleifen aus: einfach, THRU, UNTIL, VARYING und n TIMES
GO TOSpringt zu einem Paragraphen, einschliesslich berechnetem GO TO ... DEPENDING ON
STOP RUNTerminates the program with return code 0
CONTINUENo operation
EVALUATEMehrfachverzweigung mit WHEN, mehreren Werten und WHEN OTHER
GOBACKKehrt aus dem aktuellen COBOL-Programm oder Hilfsprogramm zurueck
EXIT PERFORMBricht die naechstgelegene inline PERFORM-Schleife ab
STRING / UNSTRINGBaut und teilt Festfeld-Strings in der implementierten Begrenzer-Teilmenge
INSPECTZaehlen, Ersetzen und Konvertieren mit getesteten Einbyte- und Mehrbyte-Operanden
INITIALIZEFuellt numerische Felder mit null und alphanumerische Felder mit Leerzeichen
SETSetzt getestete 88-Level-Bedingungsnamen auf TRUE
CALLRuft externe Symbole mit getesteten USING-, BY VALUE- und GIVING-Formen auf
OPEN / READ / WRITE / CLOSELine-sequential Datei-I/O in der getesteten Datensatz-Teilmenge
SEARCHLineare Suche ueber feste OCCURS-Tabellen mit VARYING, AT END, WHEN und END-SEARCH

ROUNDED Clause

The optional ROUNDED clause rounds the arithmetic result half-away-from-zero before storage, while the default truncates:

       MULTIPLY 1.0055 BY WS-VALUE ROUNDED.   *> 10.055 -> 10.06
       MULTIPLY 1.0055 BY WS-VALUE.            *> 10.055 -> 10.05 (truncated)

Conditions (Comparisons)

Relational operators are supported both as symbols and in word form:

OperatorWord formMeaning
=EQUALequal
<>NOT EQUALnot equal
<LESSless than
<=less than or equal
>GREATERgreater than
>=greater than or equal

Conditions can be combined with AND, OR, NOT and grouped with parentheses:

       IF WS-AGE >= 18 AND WS-COUNTRY = "US"
           DISPLAY "Adult in the US".

Bedingungsnamen (88-Ebene)

Ein 88-Eintrag bindet einen benannten Bedingungsnamen an den Wert des übergeordneten Elementarfelds. SET weist dem Elternfeld den aufgezeichneten Wert zu; der bloße Bedingungsname prüft auf Gleichheit damit.

       01  WS-STATUS PIC 9(1) VALUE 0.
           88  IS-OK    VALUE 1.
           88  IS-ERROR VALUE 2.
       ...
           SET IS-OK TO TRUE.            *> WS-STATUS = 1
           IF IS-OK DISPLAY "ok" END-IF. *> WS-STATUS = 1 ?

EVALUATE (Mehrfachverzweigung)

EVALUATE wühlt eine WHEN-Klausel durch Gleichheit mit dem Subjekt aus; WHEN OTHER ist der Standardfall.

       EVALUATE WS-DAY
           WHEN 1 DISPLAY "MONDAY"
           WHEN 2 DISPLAY "TUESDAY"
           WHEN OTHER DISPLAY "OTHER"
       END-EVALUATE.

STRING / INSPECT / INITIALIZE / SET

       STRING "HELLO" " " "WORLD" DELIMITED BY SIZE INTO WS-OUT.
       INSPECT WS-BUF REPLACING ALL "A" BY "X".
       INSPECT WS-BUF CONVERTING "a" TO "A".
       INITIALIZE WS-NUM WS-TXT.
       SET IS-OK TO TRUE.

MOVE CORRESPONDING / qualifizierte Namen

MOVE CORRESPONDING übertrügt gleichnamige Elementarfelder zwischen zwei Gruppen. Namen dürfen mit OF oder IN qualifiziert werden.

       MOVE CORRESPONDING REC-A TO REC-B.
       MOVE FLD-X OF REC-A TO WS-OUT.

USAGE / REDEFINES / GOBACK / EXIT PERFORM

USAGE-Klauseln (COMP, COMP-3, BINARY, PACKED-DECIMAL, DISPLAY ...) werden akzeptiert; alle Zahlen werden als skaliertes int64 gespeichert. REDEFINES aliasiert den Speicher eines Elementarfelds. GOBACK kehrt aus dem Programm zurück. EXIT PERFORM bricht die n&aauml;chstgelegene inline PERFORM-Schleife ab. PROCEDURE-DIVISION-SECTION-Header werden als Bereichsmarkierungen akzeptiert. CALL "name" USING ... ruft ein externes Symbol auf; Standardargumente werden per Referenz uebergeben, und BY VALUE plus GIVING unterstuetzt Runtime-ABI-Aufrufe mit ganzzahligem Rueckgabewert.

Primäre COBOL-EXTERNAL- und GLOBAL-Elemente erzeugen ebenfalls Bridge-Metadaten für C-Verbraucher. Skalare Zahlen bleiben bei festen Breiten, feste PIC X/PIC A-Felder bleiben Byte-Arrays, ein-Level verschachtelte Gruppen mit festen Elementarfeldern werden als gepackte C-Structs mit flachgezogenen, alias-sicheren Feldnamen ausgegeben, und feste OCCURS-Arrays solcher Gruppen werden als C-Arrays dieser Structs mit Elementgrößen-Metadaten und Offset-Assertions ausgegeben. Tiefer oder mehrdeutig verschachtelte Gruppen, Gruppen-REDEFINES und OCCURS innerhalb von Gruppen liegen weiterhin ausserhalb dieser Bridge-Teilmenge.

Decimal Runtime (DECIMAL128 and UNL)

For fields that need higher precision, the COBOL runtime provides corrected DECIMAL128 functions (cobol_dec128_mul/div via __int128, no double round-trip) and UNL-backed arbitrary-precision decimal operations for COBOL-2002 fields up to 31 digits. The default scaled int64 path is exact for all COBOL-85 widths.

Bekannte Einschraenkungen: Sequentielle zeilenorientierte Datei-I/O ist fuer die getestete OPEN/READ/WRITE/CLOSE-Teilmenge implementiert, aber REWRITE, DELETE, START, indexierte/relative Dateien und SORT/MERGE sind nicht implementiert. Mehrere COPY ... REPLACING-Paare, Kommandozeilen-Copybook-Suchpfade, tiefer verschachtelte Gruppen-REDEFINES-Overlay, verschachtelte COBOL-Unterprogrammaufrufe und automatische Speicherauswahl fuer mehr als 18-stellige PIC-Felder liegen ausserhalb der zertifizierten Oberflaeche. OCCURS mit DEPENDING ON und INDEXED BY, SEARCH, gemischt-skalierte COMPUTE-Ausdruecke sowie CALL ... BY VALUE / BY CONTENT / RETURNING sind in den kanonischen Validierungsspuren qualifiziert.

PBXB64-Prüfung

Diese Referenzseite soll durch ein fokussiertes Compile- oder Laufzeitbeispiel belegt sein. Das Beispiel soll Eingaben, erwartete Ausgabe oder Exit-Code und erforderliche Windows-Ressourcen oder Include-Dateien nennen.

Übersichtshinweise

Allgemeine Übersichtsseiten sollten trotzdem sagen, welche Familie gemeint ist, welche konkreten Befehlsseiten die Implementierung tragen und welche Formen nur der Navigation dienen. So bleibt die Seite detailliert genug, ohne so zu tun, als wäre sie eine vollständige Befehlsreferenz.

Back to command index