Skip to main content

FFI

ఈ పత్రం Wave భాషలో బాహ్యంగా అమలు చేయబడిన కాలింగ్ ఫంక్షన్‌ల కోసం FFI (ఎక్స్‌టర్నల్ ఫంక్షన్ ఇంటర్‌ఫేస్) స్పెసిఫికేషన్‌ను వివరిస్తుంది. FFI ద్వారా, Wave ప్రోగ్రామ్‌లు ఇతర భాషలలో వ్రాసిన స్థానిక లైబ్రరీలతో నేరుగా ఇంటర్‌ఫేస్ చేయగలవు.


అవలోకనం

Wave యొక్క FFI డిక్లరేషన్ ఆధారంగా పనిచేస్తుంది. Wave కోడ్‌లో బాహ్య విధులు అమలు చేయబడవు మరియు ఫంక్షన్‌ను అనుసరించే ABI (అప్లికేషన్ బైనరీ ఇంటర్‌ఫేస్)ని మాత్రమే పేర్కొనండి. లింకింగ్ దశలో బాహ్య లైబ్రరీల నుండి వాస్తవ అమలు పరిష్కరించబడుతుంది.

FFI కంపైల్ సమయంలో ఫంక్షన్ ఉనికిని మాత్రమే ప్రకటిస్తుంది మరియు ఎక్జిక్యూటబుల్ ఫైల్‌ను సృష్టించేటప్పుడు లింకర్ వాస్తవ చిహ్నాన్ని కలుపుతుంది.


బాహ్య ప్రకటన

బాహ్య విధులు బాహ్య కీవర్డ్ ఉపయోగించి ప్రకటించబడతాయి. ప్రస్తుతం, Waveకి ABI స్పెసిఫికేషన్ అవసరం మరియు extern(c)కి మాత్రమే మద్దతు ఉంది.

extern(c) fun function_name(args...) -> return_type;

ABIని పేర్కొనండి

extern డిక్లరేషన్ తప్పనిసరిగా ABIని పేర్కొనాలి. ప్రస్తుతం మద్దతు ఉన్న ABI c.

extern(c) fun printf(fmt: ptr<u8>);

extern(rust) వంటి డిక్లరేషన్‌లు అన్వయించబడినప్పటికీ, సెమాంటిక్ విశ్లేషణ దశలో లోపాలు సంభవిస్తాయి.


ఫంక్షన్-స్థాయి ఎక్స్‌టర్న్ డిక్లరేషన్

బాహ్య విధిని ప్రకటించేటప్పుడు, దానిని ఈ క్రింది విధంగా వ్రాయండి:

extern(c) fun InitWindow(width: i32, height: i32, title: ptr<u8>);

C ABIని అనుసరించే InitWindow చిహ్నాలు బాహ్య లైబ్రరీలో ఉన్నాయని ఈ ప్రకటన అర్థం.


బ్లాక్-లెవల్ ఎక్స్‌టర్న్ డిక్లరేషన్

ఒకే ABIని ఉపయోగించే బహుళ బాహ్య విధులు ఉంటే, వాటిని బ్లాక్ రూపంలో ప్రకటించవచ్చు.

extern(c) {
fun InitWindow(width: i32, height: i32, title: ptr<u8>);
fun CloseWindow();
fun BeginDrawing();
fun EndDrawing();
}

బ్లాక్-లెవల్ డిక్లరేషన్‌లు సెమాంటిక్‌గా పూర్తిగా ఫంక్షన్-లెవల్ డిక్లరేషన్‌లకు సమానంగా ఉంటాయి మరియు ఇవి కేవలం రీడబిలిటీ మరియు స్ట్రక్చరింగ్ కోసం సింటాక్స్.


చిహ్న నామకరణం

కొన్ని ABIలో, Wave ఫంక్షన్ పేర్లు మరియు అసలు లింకర్ గుర్తు పేర్లు సరిపోలకపోవచ్చు. ఈ సందర్భంలో, మీరు బాహ్య ఫంక్షన్ స్ట్రింగ్‌గా కనెక్ట్ చేయబడే అసలు గుర్తు పేరును పేర్కొనవచ్చు.

ఫంక్షన్-స్థాయి చిహ్నం హోదా

extern(c, "puts")
fun rust_func(i32);

rust_funcకి చేసే కాల్‌లు putsని అసలు లింక్ చిహ్నంగా ఉపయోగిస్తాయని ఈ డిక్లరేషన్ నిర్దేశిస్తుంది.


బ్లాక్ వారీగా గుర్తు హోదా

ప్రతి ఫంక్షన్ తర్వాత వ్యక్తిగత సింబాలిక్ పేర్లను పేర్కొనడానికి బ్లాక్-లెవల్ డిక్లరేషన్‌లు మిమ్మల్ని అనుమతిస్తాయి.

extern(c) {
fun my_puts(ptr<i8>) "puts";
fun my_strlen(ptr<i8>) "strlen";
}

పాయింటర్ రకం

పాయింటర్లు ptr<T> రూపంలో వ్యక్తీకరించబడ్డాయి.

ptr<u8>
ptr<MyStruct>

ptr<T> నేరుగా బాహ్య భాషలలోని పాయింటర్‌లకు అనుగుణంగా ఉంటుంది మరియు మెమరీ యాజమాన్యం లేదా జీవిత చక్రం Wave ద్వారా నిర్వహించబడదు.


struct ఉపయోగించండి

నిర్మాణాలను ఆర్గ్యుమెంట్‌లుగా లేదా బాహ్య ఫంక్షన్‌ల రిటర్న్ విలువలుగా ఉపయోగించవచ్చు.

struct Color {
r: u8,
g: u8,
b: u8,
a: u8,
}

FFIలో నిర్మాణాలను ఉపయోగిస్తున్నప్పుడు, ఫీల్డ్ ఆర్డర్ డిక్లేర్డ్ క్రమాన్ని నిర్వహిస్తుంది మరియు ABIకి అవసరమైన మెమరీ లేఅవుట్‌ను అనుసరిస్తుంది.


బాహ్య ఫంక్షన్ కాల్

externగా ప్రకటించబడిన విధులు సాధారణ ఫంక్షన్ల వలెనే పిలువబడతాయి.

fun main() -> i32 {
InitWindow(800, 600, "Wave");
BeginDrawing();
EndDrawing();
CloseWindow();
return 0;
}

కాల్ చేస్తున్నప్పుడు వాక్యనిర్మాణ వ్యత్యాసాలు లేవు మరియు కాలింగ్ కన్వెన్షన్‌లు మరియు సింబల్ లింకింగ్ పూర్తిగా ABI మరియు లింకర్ ద్వారా నిర్వహించబడతాయి.


లింక్ చేస్తోంది

బాహ్య ఫంక్షన్ యొక్క వాస్తవ అమలు లింకింగ్ దశలో బాహ్య లైబ్రరీ నుండి అందించబడుతుంది. Wave కంపైలర్ బాహ్య ఫంక్షన్ కాల్‌లను కలిగి ఉన్న ఆబ్జెక్ట్ ఫైల్‌లను ఉత్పత్తి చేస్తుంది మరియు లింకర్ పేర్కొన్న లైబ్రరీల ద్వారా చిహ్నాలను పరిష్కరిస్తుంది.

లైబ్రరీ స్పెసిఫికేషన్ బిల్డ్ టూల్ మరియు CLI ఎంపిక ద్వారా అందించబడుతుంది.


పరిమితులు

Wave కింది లక్షణాలను అందించదు:

  • ఫంక్షన్ పాయింటర్
  • కాల్బ్యాక్ ఫంక్షన్
  • ఆటోమేటిక్ మెమరీ నిర్వహణ
  • మినహాయింపు నిర్వహణ భాషల మధ్య ఏకీకరణ

ఈ ఫీచర్‌లు భవిష్యత్తు వెర్షన్‌లలో విడిగా ప్రస్తావించబడవచ్చు.