Skip to main content

FFI

ይህ ሰነድ በWave ቋንቋ በውጭ የሚተገበሩ ተግባራትን ለመጥራት የFFI (ውጫዊ ተግባር በይነገጽ) መግለጫን ይገልጻል። በFFI፣ የWave ፕሮግራሞች በሌሎች ቋንቋዎች ከተፃፉ ቤተ-መጻህፍት ጋር በቀጥታ መገናኘት ይችላሉ።


አጠቃላይ እይታ

FFI of Wave የሚሰራው በማወጅ መሰረት ነው። ውጫዊ ተግባራት በ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 የሚከተሉትን ባህሪያት አይሰጥም፡

  • የተግባር ጠቋሚ
  • የመልሶ መደወያ ተግባር
  • ራስ-ሰር የማህደረ ትውስታ አስተዳደር
  • በቋንቋዎች መካከል ልዩ ውህደት አያያዝ

እነዚህ ባህሪያት በወደፊት ስሪቶች ውስጥ ተለይተው ሊቀርቡ ይችላሉ.