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

নির্দেশক

Wave Explicit Memory Type Model

Wave-এর পয়েন্টার ডিজাইন Wave এক্সপ্লিসিট মেমরি টাইপ মডেল-এর উপর ভিত্তি করে তৈরি। এই মডেলটি পয়েন্টার এবং অ্যারেকে ভাষা স্তরে সুস্পষ্ট মেমরির ধরন হিসাবে সংজ্ঞায়িত করার লক্ষ্য করে, সিনট্যাকটিক কৌশল বা লাইব্রেরি বিমূর্ততা হিসাবে নয়।

এই নকশা অনুসারে, Wave পয়েন্টারটিকে ptr<T>-এর প্রকার হিসাবে প্রকাশ করে। এটি স্পষ্টভাবে প্রকাশ করে যে এটি এমন একটি প্রকার যা একটি মেমরি ঠিকানাকে নির্দেশ করে যা একটি নির্দিষ্ট ধরণের, T এর মান সঞ্চয় করে। এই পদ্ধতি পয়েন্টারকে অপারেটর বা ঘোষণা বাক্য গঠনের পরিবর্তে টাইপ সিস্টেমের অংশ হিসাবে বিবেচনা করে। মেমরি স্ট্রাকচারগুলিকে আরও স্বজ্ঞাত এবং ধারাবাহিকভাবে প্রকাশ করার অনুমতি দেয়।


Wave-এ, পয়েন্টার হল একটি স্পষ্ট ধরনের ptr<T> টাইপ। ঠিকানা অধিগ্রহণের জন্য & এবং ডিরেফারেন্সের জন্য deref ব্যবহার করুন।

ঘোষণা এবং সূচনা

var x: i32 = 10;
var p: ptr<i32> = &x;

পয়েন্টার প্রকারগুলি নেস্ট করা যেতে পারে।

var p1: ptr<i32> = &x;
var p2: ptr<ptr<i32>> = &p1;

ব্যাক রেফারেন্স

var x: i32 = 10;
var p: ptr<i32> = &x;

println("{}", deref p); // 10
deref p = 20;
println("{}", x); // 20

null আক্ষরিক নিয়ম

null হল একটি কনোনিকাল আক্ষরিক। এটি একটি শনাক্তকারী নয় এবং একটি পরিবর্তনশীল নাম হিসাবে ব্যবহার করা যাবে না।

মূল নিয়ম:

  • null শুধুমাত্র ptr<T> টার্গেটে বরাদ্দ করা যেতে পারে।
  • এটি i32, bool, এবং array<...>-এর মতো নন-পয়েন্টার প্রকারগুলিতে বরাদ্দ করা যাবে না।
  • একটি পয়েন্টার একটি পূর্ণসংখ্যা আক্ষরিক (0, 123, -1, ইত্যাদি) দিয়ে আরম্ভ করা যাবে না। স্পষ্টভাবে null ব্যবহার করুন।
var p: ptr<i32> = null;
var arrp: ptr<array<i32, 3>> = null;

// var n: i32 = null; // ERROR
// var b: bool = null; // ERROR

পয়েন্টার পাটিগণিত

Wave নিম্নলিখিত পয়েন্টার গাণিতিক সমর্থন করে:

  • ptr + int: GEP-ভিত্তিক পয়েন্টার অগ্রগতি
  • int + ptr: একই অপারেশন
  • ptr - int: GEP-ভিত্তিক পয়েন্টার পিছনের দিকে
  • ptr - ptr: i64 বাইট পার্থক্য গণনা করুন

পয়েন্ট:

  • ptr<T> +/- n T (sizeof(T)) এর আকারের উপর ভিত্তি করে চলে।
  • অন্য কথায়, ptr<i32> + 3 +12 বাইটে চলে যায়।
var base: ptr<i32> = 0x1000 as ptr<i32>;

var p1: ptr<i32> = base + 3; // 0x1000 + 12
var p2: ptr<i32> = 2 + base; // 0x1000 + 8
var p3: ptr<i32> = base - 1; // 0x1000 - 4

var diff: i64 = p1 - base; // 12 (byte diff)

পয়েন্টার তুলনা

পয়েন্টার তুলনা জন্য ব্যবহার করা যেতে পারে.

if (p == null) { ... }
if (p != null) { ... }
if (p1 == p2) { ... }

Arrays সঙ্গে সম্পর্ক

পয়েন্টার অ্যারে:

var a: i32 = 10;
var b: i32 = 20;
var arr: array<ptr<i32>, 2> = [&a, &b];
println("{} {}", deref arr[0], deref arr[1]);

অ্যারে পয়েন্টার:

var p: ptr<array<i32, 3>> = &[1, 2, 3];
if (p != null) {
println("{}", deref p[1]);
}

নিরাপত্তা নোট

Wave-এর বর্তমানে Rust-এর মতো মালিকানা/আজীবন-ভিত্তিক পয়েন্টার নিরাপত্তা মডেল নেই। অতএব, null ডিরেফারেন্স স্বয়ংক্রিয়ভাবে প্রতিরোধ করা হয় না। আমরা একটি প্যাটার্ন সুপারিশ করি যা deref এর আগে null স্পষ্টভাবে পরীক্ষা করে।