স্কিপ করে মূল কন্টেন্ট এ যান

FFI

এই ডকুমেন্টটি বিদেশী ফাংশন ইন্টারফেস (FFI) এর স্পেসিফিকেশনের মাধ্যমে ওয়েভ ভাষাতে বহিরাগত ফাংশন কিভাবে কল করতে হয় তা ব্যাখ্যা করে। FFI এর মাধ্যমে ওয়েভ প্রোগ্রামটি অন্য ভাষায় লেখা নেটিভ লাইব্রেরির সাথে সরাসরি সংযোগ স্থাপন করতে পারে।


সংক্ষিপ্ত বিবরণ

ওয়েভের FFI ঘোষণার ভিত্তিতে কাজ করে। বাহ্যিক ফাংশন ওয়েভ কোডে বাস্তবায়িত হয় না, এবং কোন 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 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 পরবর্তী বৈশিষ্ট্যগুলি প্রদান করে না।

  • ফাংশন পয়েন্টার
  • কলব্যাক ফাংশন
  • স্বয়ংক্রিয় মেমরি ব্যবস্থাপনা
  • ভাষাগত ব্যতিক্রম হ্যান্ডলিং ইন্টিগ্রেশন

এই বৈশিষ্ট্যগুলি ভবিষ্যতের সংস্করণে আলাদাভাবে বিবেচনা করা হতে পারে।