export
export Wave లో అమలు చేసిన function ను బాహ్య linker symbol గా బయటకు ఇస్తుంది. extern బాహ్య function ను Wave లోకి తీసుకువస్తే, export Wave function ను C, Rust, C++, Zig లేదా ఇతర native భాషల నుండి object file ద్వారా call చేయగలిగేలా చేస్తుంది.
అవలోకనం
Wave FFI రెండు దిశల్లో పనిచేస్తుంది.
extern(c)బాహ్య library ఇచ్చే function ను ప్రకటిస్తుంది, తద్వారా Wave code దాన్ని call చేయగలదు.export(c)Wave function body ను బాహ్య ABI symbol గా emit చేస్తుంది.
రెండు రూపాలు ఒకే ABI header ఆకారాన్ని పంచుకుంటాయి, కానీ అర్థం విరుద్ధం. extern లో function body Wave బయట ఉంటుంది. export లో function body Wave లోపల ఉంటుంది.
ప్రస్తుతం support అయ్యే export ABI c మాత్రమే.
Function స్థాయి export
ప్రాథమిక రూపం ఇది:
export(c) fun add(a: i32, b: i32) -> i32 {
return a + b;
}
ఈ code add అనే public symbol ను సృష్టిస్తుంది. తయారైన object file ను C ABI ఆశించే బాహ్య code తో link చేయవచ్చు.
Symbol పేర్లు
Wave function పేరు మరియు export అయిన linker symbol పేరు వేర్వేరుగా ఉండవచ్చు.
export(c, "wave_add_i32") fun add_i32(a: i32, b: i32) -> i32 {
return a + b;
}
ఇక్కడ Wave పేరు add_i32, కానీ object file wave_add_i32 ను expose చేస్తుంది. బాహ్య భాషలు ఈ symbol పేరునే declare చేసి call చేయాలి.
బ్లాక్ export
ఒకే ABI ఉపయోగించే అనేక functions ను ఒక block లో ఉంచవచ్చు.
export(c) {
fun wave_inc_i32(a: i32) -> i32 {
return a + 1;
}
fun wave_dec_i32(a: i32) -> i32 {
return a - 1;
}
}
బ్లాక్ export ప్రతి function పేరును public symbol గా ఉపయోగిస్తుంది. export(c, "symbol") { ... } అనుమతించబడదు, ఎందుకంటే అనేక functions కు ఒకే alias ఇస్తే symbol collision వస్తుంది.
C నుండి call చేయడం
Wave file ను object file గా build చేయండి.
wavec build math.wave --emit=obj -o math.o
Export అయిన symbol ను C లో declare చేయండి.
#include <stdio.h>
extern int wave_add_i32(int a, int b);
int main(void) {
printf("%d\n", wave_add_i32(40, 2));
return 0;
}
తర్వాత C code మరియు Wave object file ను సాధారణ linker తో link చేయండి.
cc main.c math.o -o app
extern మరియు export
extern(c) అంటే Wave బాహ్య symbol ను ఉపయోగిస్తుంది.
extern(c) fun puts(s: ptr<i8>) -> i32;
export(c) అంటే బాహ్య code Wave symbol ను ఉపయోగించగలదు.
export(c) fun answer() -> i32 {
return 42;
}
రెండూ FFI లో భాగమే, కానీ దిశ వేరు.
