పాయింటర్
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 అనేది కానానికల్ లిటరల్. ఇది ఐడెంటిఫైయర్ కాదు మరియు వేరియబుల్ పేరుగా ఉపయోగించబడదు.
ప్రధాన నియమాలు:
nullptr<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) { ... }
శ్రేణులతో సంబంధం
పాయింటర్ శ్రేణి:
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 dereferences స్వయంచాలకంగా నిరోధించబడవు. deref కంటే ముందు nullని స్పష్టంగా తనిఖీ చేసే నమూనాను మేము సిఫార్సు చేస్తున్నాము.
