Skip to main content

ጠቋሚ

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> ዒላማ ብቻ ነው።
  • እንደ i32bool እና array<...> ላሉ ጠቋሚ ላልሆኑ አይነቶች ሊመደብ አይችልም።
  • ጠቋሚ በኢንቲጀር ቀጥተኛ (0123-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]);
}

የደህንነት ማስታወሻዎች

Wave በአሁኑ ጊዜ እንደ Rust በባለቤትነት/በሕይወት ላይ የተመሰረተ የጠቋሚ ደህንነት ሞዴል የለውም። ስለዚህ፣ የnull መዝገቦች በራስ-ሰር አይከለከሉም። ከderef በፊት nullን በግልፅ የሚፈትሽ ስርዓተ ጥለት እንመክራለን።