FFI
מסמך זה מתאר את המפרט של FFI (ממשק פונקציות חיצוני) לצורך קריאה לפונקציות המוטמעות חיצונית בשפת Wave. באמצעות FFI, תכנית Wave יכולה להשתלב ישירות עם ספריות מקומיות שנכתבו בשפות אחרות.
סקירה כללית
ה-FFI של Wave פועל על בסיס הכרזות. הפונקציה החיצונית אינה מיושמת בקוד של Wave, אלא רק מציינת את ה-ABI (ממשק בינארי יישומי) שהיא עוקבת אחריו. היישום בפועל נפתר בשלב הקישור על ידי ספריה חיצונית.
FFI מכריזה על קיום הפונקציה בזמן ההידור, ובזמן יצירת קובץ הפעלה, הקישור מבצע חיבור סמלים בפועל.
הכרזת extern
הפונקציה החיצונית מוכרזת באמצעות מילת המפתח extern.
נכון לעכשיו, ב-Wave יש צורך לציין ABI ותומכים רק ב-extern(c).
extern(c) fun שם פונקציה(פרמטרים...) -> סוג החזרה;
קביעת ABI
בהכרזת extern יש צורך לציין ABI.
כרגע תומכים ב-ABI אחד בלבד שהוא c.
extern(c) fun printf(fmt: ptr<u8>);
הכרזה כמו extern(rust) יכולה לנתח אך תגרום לשגיאה בשלב ניתוח המשמעות.
הכרזת extern ברמת הפונקציה
כאשר מצהירים על פונקציה חיצונית אחת, כותבים זאת כך.
extern(c) fun InitWindow(width: i32, height: i32, title: ptr<u8>);
ההצהרה הזו מציינת כי הסימבול InitWindow העוקב אחרי ABI של C קיים בספריה חיצונית.
הכרזת extern ברמת בלוק
כאשר יש מספר פונקציות חיצוניות המשתמשות באותו ABI, ניתן לקבץ אותן בהכרזה בצורת בלוק.
extern(c) {
fun InitWindow(width: i32, height: i32, title: ptr<u8>);
fun CloseWindow();
fun BeginDrawing();
fun EndDrawing();
}
ההכרזה ברמת בלוק היא זהה מבחינה משמעותית להכרזה ברמת פונקציה, ומשתמשים בה רק לגודליות ולמבנה.