ጠቋሚ
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፡ በጂኢፒ ላይ የተመሰረተ ጠቋሚ ወደ ኋላ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]);
}
