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.
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.
.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.Diese Seite ist die Uebersicht zum Frontend. Die verlinkten Einzelseiten enthalten Syntax, getestete Beispiele, Status und Grenzen fuer die jeweiligen Befehle oder Sprachkonstrukte.
PBXB64 program.cbl -o program.exeA 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.
A COBOL program consists of up to four divisions, which must appear in this order:
| Division | Role | Support |
|---|---|---|
IDENTIFICATION DIVISION | Program name and metadata (PROGRAM-ID) | Read, then skipped |
ENVIRONMENT DIVISION | Konfiguration und line-sequential I/O-Zuweisungen | SELECT ... ASSIGN wird fuer unterstuetzte Datei-I/O erkannt |
DATA DIVISION | Datendefinitionen (WORKING-STORAGE und unterstuetzte FILE SECTION-Datensaetze) | Unterstuetzte Teilmenge |
PROCEDURE DIVISION | Executable statements and paragraphs | Fully 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.
COPY copybooks are accepted.| Symbol | Meaning |
|---|---|
9 | Numeric digit (0–9) |
X | Alphanumeric character |
A | Alphabetic character |
S | Sign (leading, signed) |
V | Implied decimal point |
Z | Zero suppression |
P | Scaling position |
(n) | Repetition factor, e.g. 9(5) = five digits |
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 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.
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:
| Rule | Behaviour |
|---|---|
| High-order digit truncation | MOVE 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 S9 | Sign preserved: MOVE -55 TO S9(4) → -55 |
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.
| Statement | Description |
|---|---|
DISPLAY | Outputs operands (literals and fields) to the console, followed by a newline |
ACCEPT | Reads a value from the console into a field |
MOVE | Transfers a value into a field (numeric with scaling/conversion, alphanumeric with padding) |
ADD | Adds operands to receivers: ADD a TO b or ADD a b GIVING c |
SUBTRACT | Subtracts: SUBTRACT a FROM b or SUBTRACT a FROM b GIVING c |
MULTIPLY | Multiplies: MULTIPLY a BY b (result in b) or MULTIPLY a BY b GIVING c |
DIVIDE | Divides: DIVIDE a INTO b, DIVIDE a BY b GIVING c |
COMPUTE | Berechnet einen Ausdruck unter Erhalt der natuerlichen Skalierung der Teilausdruecke; ROUNDED und ON SIZE ERROR werden unterstuetzt |
IF / ELSE / END-IF | Conditional branching |
PERFORM | Fuehrt Paragraphen und getestete Schleifen aus: einfach, THRU, UNTIL, VARYING und n TIMES |
GO TO | Springt zu einem Paragraphen, einschliesslich berechnetem GO TO ... DEPENDING ON |
STOP RUN | Terminates the program with return code 0 |
CONTINUE | No operation |
EVALUATE | Mehrfachverzweigung mit WHEN, mehreren Werten und WHEN OTHER |
GOBACK | Kehrt aus dem aktuellen COBOL-Programm oder Hilfsprogramm zurueck |
EXIT PERFORM | Bricht die naechstgelegene inline PERFORM-Schleife ab |
STRING / UNSTRING | Baut und teilt Festfeld-Strings in der implementierten Begrenzer-Teilmenge |
INSPECT | Zaehlen, Ersetzen und Konvertieren mit getesteten Einbyte- und Mehrbyte-Operanden |
INITIALIZE | Fuellt numerische Felder mit null und alphanumerische Felder mit Leerzeichen |
SET | Setzt getestete 88-Level-Bedingungsnamen auf TRUE |
CALL | Ruft externe Symbole mit getesteten USING-, BY VALUE- und GIVING-Formen auf |
OPEN / READ / WRITE / CLOSE | Line-sequential Datei-I/O in der getesteten Datensatz-Teilmenge |
SEARCH | Lineare Suche ueber feste OCCURS-Tabellen mit VARYING, AT END, WHEN und END-SEARCH |
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)
Relational operators are supported both as symbols and in word form:
| Operator | Word form | Meaning |
|---|---|---|
= | EQUAL | equal |
<> | NOT EQUAL | not equal |
< | LESS | less than |
<= | — | less than or equal |
> | GREATER | greater 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".
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 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 "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 ü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-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.
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.
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.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.
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.