मुख्य कंटेंट तक स्किप करें

पॉइंटर

Wave स्पष्ट मेमोरी प्रकार मॉडल

Wave की पॉइंटर डिज़ाइन Wave Explicit Memory Type Model पर आधारित है। इस मॉडल का उद्देश्य पॉइंटर्स और ऐरे को व्याकरणिक युक्तियों या लाइब्रेरी अमूर्तताओं के बजाय, भाषा स्तर के स्पष्ट मेमोरी प्रकार के रूप में परिभाषित करना है।

इस डिज़ाइन के अनुसार, 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 निम्नलिखित पॉइंटर अंकगणित का समर्थन करता है।

  • int + ptr: GEP आधारित पॉइंटर अग्रिम
  • ptr - int: समान संचालन
  • 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) { ... }

ऐरे के साथ संबंध

पॉइंटर ऐरे:

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 जांच डालने का पैटर्न अनुशंसित है।