Sprachen verbinden sich über konkrete Symbol- und Typverträge. Jeder Fall zeigt beide vollständigen Quellen, die erwarteten Werte und den gemeinsamen Build-Ablauf. Diese zusätzlichen Fälle sind nicht neu nativ qualifiziert.
Sprachen verbinden sich über konkrete Symbol- und Typverträge. Jeder Fall zeigt beide vollständigen Quellen, die erwarteten Werte und den gemeinsamen Build-Ablauf. Diese zusätzlichen Fälle sind nicht neu nativ qualifiziert. Grafik in voller Größe öffnen

Bridging: Quellen gemeinsam verwenden

Sprachen verbinden sich über konkrete Symbol- und Typverträge. Jeder Fall zeigt beide vollständigen Quellen, die erwarteten Werte und den gemeinsamen Build-Ablauf. Diese zusätzlichen Fälle sind nicht neu nativ qualifiziert.

B64 ruft eine C-Funktion auf

B64 deklariert c_v8_add als externe Funktion mit zwei i64-Parametern und i64-Ergebnis. C definiert denselben Symbolnamen mit int64_t. Der gemeinsame Aufruf liefert 20 + 22 = 42. Der Anbieter hat kein eigenes main; B64 besitzt den Programmeinstieg.

main_call_v8_c.b64

extern fn c_v8_add(a: i64, b: i64): i64;

fn main(): i64 {
    return c_v8_add(20, 22);
}

c_v8_add.c

#include <stdint.h>
int64_t c_v8_add(int64_t a, int64_t b) { return a + b; }
PBXB64.exe main_call_v8_c.b64 c_v8_add.c -o bridge.exe
.\bridge.exe
$LASTEXITCODE

Erwarteter Exitcode: 42

Beide Quellen als ZIP

Kanonischer Testfall mit erwartetem Ergebnis; hier keine neue native V22-Prüfung. Finale Ausführung noch ausstehend.

BASIC und ASM teilen eine Variable und ein Array

ASM exportiert asm_imported_counter als dq 41 und ein Array mit drei dq-Werten. BRIDGE IMPORT bindet BASIC-Namen an diese Symbole. Die Tests lesen 41, schreiben 42 und prüfen Arrayelemente. LONG und dq sind hier jeweils acht Bytes; alle Quellen müssen gemeinsam gelinkt werden.

test_bridge_import_variable_asm.pb

#COMPILE EXE

FUNCTION PBMAIN() AS LONG
    BRIDGE IMPORT imported_counter AS LONG ALIAS "asm_imported_counter"
    IF imported_counter <> 41 THEN FUNCTION = 1: EXIT FUNCTION
    imported_counter = imported_counter + 1
    IF imported_counter <> 42 THEN FUNCTION = 2: EXIT FUNCTION
    BRIDGE IMPORT imported_values(0 TO 2) AS LONG ALIAS "asm_imported_values"
    IF imported_values(0) <> 10 THEN FUNCTION = 3: EXIT FUNCTION
    imported_values(1) = 42
    IF imported_values(1) <> 42 THEN FUNCTION = 4: EXIT FUNCTION
    IF imported_values(2) <> 30 THEN FUNCTION = 5: EXIT FUNCTION
    FUNCTION = 0
END FUNCTION

test_bridge_import_variable_asm.asm

section .data
global asm_imported_counter
asm_imported_counter dq 41
global asm_imported_values
asm_imported_values dq 10, 20, 30
PBXB64.exe test_bridge_import_variable_asm.pb test_bridge_import_variable_asm.asm -o bridge.exe
.\bridge.exe
$LASTEXITCODE

Erwarteter Exitcode: 0

Beide Quellen als ZIP

Kanonischer Testfall mit erwartetem Ergebnis; hier keine neue native V22-Prüfung. Finale Ausführung noch ausstehend.

ASM liest eine von BASIC exportierte Variable

BRIDGE EXPORT veröffentlicht den Alias pb_exported_counter. ASM deklariert ihn als extern und liest ihn relativ zur Instruktionsadresse. Das zweite Beispiel liest Arrayelement 1 mit einem Abstand von acht Bytes. Der BASIC-Test ruft die ASM-Funktionen auf und erwartet jeweils 41.

test_bridge_export_variable_asm.pb

#COMPILE EXE

DECLARE FUNCTION read_exported_counter() COMMON AS LONG
DECLARE FUNCTION read_exported_array() COMMON AS LONG

FUNCTION PBMAIN() AS LONG
    BRIDGE EXPORT exported_counter AS LONG ALIAS "pb_exported_counter"
    exported_counter = 41
    IF exported_counter <> 41 THEN FUNCTION = 1: EXIT FUNCTION
    IF read_exported_counter() <> 41 THEN FUNCTION = 2: EXIT FUNCTION
    BRIDGE EXPORT exported_values(0 TO 2) AS LONG ALIAS "pb_exported_values"
    exported_values(1) = 41
    IF read_exported_array() <> 41 THEN FUNCTION = 3: EXIT FUNCTION
    FUNCTION = 0
END FUNCTION

test_bridge_export_variable_asm.asm

section .text
global read_exported_counter
extern pb_exported_counter

read_exported_counter:
    mov rax, [rel pb_exported_counter]
    ret

global read_exported_array
extern pb_exported_values

read_exported_array:
    mov rax, [rel pb_exported_values + 8]
    ret
PBXB64.exe test_bridge_export_variable_asm.pb test_bridge_export_variable_asm.asm -o bridge.exe
.\bridge.exe
$LASTEXITCODE

Erwarteter Exitcode: 0

Beide Quellen als ZIP

Kanonischer Testfall mit erwartetem Ergebnis; hier keine neue native V22-Prüfung. Finale Ausführung noch ausstehend.

PILOT und BASIC: zwei Aliase auf dieselbe Variable

Der BASIC-Anbieter definiert GLOBAL pilot_bridge_number AS QUAD = 40 und einen STRING. V: verbindet numerische #Variablen und $Strings mit diesen GLOBAL-Namen. Nach dem Schreiben von 42 beziehungsweise from-pilot muss der jeweils zweite Alias den neuen Wert sehen. Das ist ein typisierter Live-Vertrag und keine bloße Kopie.

pilot_pb_bridge.pil

R: V: creates live two-way bindings to PB GLOBAL variables.
V: #NUMBER|pilot_bridge_number|QUAD
V: #NUMBER_ALIAS|pilot_bridge_number|QUAD
V: $TEXT|pilot_bridge_text|STRING
V: $TEXT_ALIAS|pilot_bridge_text|STRING
C: #CHECK = #NUMBER - 40
N: T: "number-imported"
T: $TEXT
C: #NUMBER = 42
C: $TEXT = "from-pilot"
T: $TEXT_ALIAS
C: #CHECK = #NUMBER_ALIAS - 42
N: T: "number-exported"
E:

pilot_pb_bridge_globals.pb

GLOBAL pilot_bridge_number AS QUAD = 40
GLOBAL pilot_bridge_text AS STRING

SUB PilotBridgeGlobalsAnchor()
END SUB
PBXB64.exe pilot_pb_bridge_globals.pb -c -o provider.obj
PBXB64.exe pilot_pb_bridge.pil provider.obj -o bridge.exe
.\bridge.exe
$LASTEXITCODE

Erwarteter Exitcode: 0

Beide Quellen als ZIP

Kanonischer Testfall mit erwartetem Ergebnis; hier keine neue native V22-Prüfung. Finale Ausführung noch ausstehend.

Numerischer COBOL-Wert in BASIC

COBOL stellt SHARED-COUNT mit PIC S9(9), Anfangswert 41 und GLOBAL bereit. BASIC bindet den Namen über den konkreten numerischen Bridge-Vertrag, liest ihn und schreibt 42. Dieser Fall beschreibt die numerische Abbildung. Daraus folgt keine Zusage für beliebige PIC-X-Strings oder Record-Layouts.

bridge_pb_import_numeric.pb

#COMPILE EXE
#DIM ALL

FUNCTION PBMAIN() AS LONG
    BRIDGE IMPORT shared_count AS QUAD ALIAS "SHARED-COUNT"
    PRINT shared_count
    shared_count = 42
    PRINT shared_count
    FUNCTION = 0
END FUNCTION

bridge_cobol_export_numeric.cbl

       IDENTIFICATION DIVISION.
       PROGRAM-ID. COBOLEXPORTNUMERIC.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 SHARED-COUNT PIC S9(9) VALUE 41 GLOBAL.
       PROCEDURE DIVISION.
           STOP RUN.
PBXB64.exe bridge_pb_import_numeric.pb bridge_cobol_export_numeric.cbl -o bridge.exe
.\bridge.exe
$LASTEXITCODE

Erwarteter Exitcode: 0

Ausgabe-Vertrag: ' 41\n 42\n'

Beide Quellen als ZIP

Kanonischer Testfall mit erwartetem Ergebnis; hier keine neue native V22-Prüfung. Finale Ausführung noch ausstehend.

SPR: VIP. verbindet QUAD und STRING

Der BASIC-Anbieter definiert einen QUAD mit Anfangswert 40 und einen STRING. VIP. bindet $$NUM und $$TXT an diese GLOBAL-Namen. CAL. erhöht den Wert auf 42, VAS. setzt den Text auf bridged. Der kanonische Runner übersetzt zuerst den BASIC-Anbieter als Objekt und linkt danach SPR mit diesem Objekt.

vip_pb_global_bridge.spr

' VIP. binds exact $$XXX SPR variables to PB GLOBAL AS QUAD and STRING.
VIP.$$NUM|spr_vip_num|QUAD
VIP.$$TXT|spr_vip_txt|STRING
CAL.$$NUM=$$NUM+2
VAS.$$TXT=bridged
PRT.$$NUM
PRT.$$TXT
END.

vip_pb_globals.pb

GLOBAL spr_vip_num AS QUAD = 40
GLOBAL spr_vip_txt AS STRING

SUB VipPbGlobalsAnchor()
END SUB
PBXB64.exe vip_pb_globals.pb -c -o provider.obj
PBXB64.exe vip_pb_global_bridge.spr provider.obj -o bridge.exe
.\bridge.exe
$LASTEXITCODE

Erwarteter Exitcode: 0

Ausgabe-Vertrag: '42\nbridged'

Beide Quellen als ZIP

Kanonischer Testfall mit erwartetem Ergebnis; hier keine neue native V22-Prüfung. Finale Ausführung noch ausstehend.