
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 ZIPKanonischer 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 ZIPKanonischer 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 ZIPKanonischer 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 ZIPKanonischer 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 ZIPKanonischer 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 ZIPKanonischer Testfall mit erwartetem Ergebnis; hier keine neue native V22-Prüfung. Finale Ausführung noch ausstehend.