پرش به مطلب اصلی

پوینتر

معرفی

این سند نحوه استفاده از پوینترها در Wave را توضیح می‌دهد. Wave زبانی برای برنامه‌نویسی سیستم‌های سطح پایین است که برای امکان‌پذیر کردن دستکاری صریح آدرس‌های حافظه، ویژگی پوینتر را فراهم می‌کند. پوینتر متغیری است که به آدرس حافظه یک نوع خاص اشاره دارد، و از طریق آن دسترسی و تغییر مستقیم مقادیر امکان‌پذیر است.


اعلان پوینتر

در Wave پوینترها به صورت ptr<نوع> اعلان می‌شوند. برای مثال، یک پوینتر صحیح ممکن است به صورت زیر اعلان شود:

var p: ptr<i32>;

این اعلان پوینتر p را ایجاد می‌کند که به مقدار نوع i32 اشاره دارد.


شروع به کار پوینتر

پوینترها می‌توانند با استفاده از عملگر & با آدرس یک متغیر اولیه‌سازی شوند:

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

در اینجا &a به آدرس حافظه متغیر a اشاره دارد و p پوینتری است که به آن آدرس اشاره دارد.


بازخوانی پوینتر

برای خواندن یا تغییر مقداری که یک پوینتر به آن اشاره دارد باید از کلیدواژه deref استفاده کنید. این کار به بازخوانی معروف است:

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

println("{}", deref p); // چاپ 10

deref p = 20;
println("{}", a); // چاپ 20

پوینتر NULL

در Wave پوینتر NULL با کلیدواژه null بیان می‌شود. متغیر پوینتر می‌تواند به null مقداردهی اولیه شود که در این صورت به هیچ حافظه معتبری اشاره نمی‌کند:

var p: ptr<i32> = null;

در صورت بازخوانی یک پوینتر NULL کامپایلر خطا می‌دهد.


پوینتر چندگانه

Wave از پوینترهای چندگانه پشتیبانی می‌کند. پوینترها را می‌توان به صورت چند لایه اعلان و استفاده کرد:

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

println("{}", deref p1); // 1
println("{}", deref deref p2); // 1
println("{}", deref deref deref p3); // 1

آرایه و پوینتر

پوینترها می‌توانند به عناصر آرایه یا خود آرایه اشاره کنند.

پوینتر اشاره‌کننده به عناصر آرایه

var a: i32 = 10;
var b: i32 = 20;
var arr: array<ptr<i32>, 2> = [&a, &b];

println("deref arr[0] = {}, deref arr[1] = {}", deref arr[0], deref arr[1]); // 10, 20

پوینتری که به کل آرایه اشاره می‌کند

var arr: ptr<array<i32, 3>> = &[1, 2, 3];
println("{}", arr); // چاپ آدرس حافظه

امنیت و مالکیت

ویو با معرفی سیستم مالکیت و طول عمر مشابه Rust سعی در تضمین پایداری حافظه در حین استفاده از پوینترها دارد. بنابراین، بررسی‌های دقیقی انجام می‌شود تا از وقوع مشکلاتی مانند بازخوانی پوینتر نامعتبر، آزادسازی دوگانه، و پوینترهای دنگ‌لینگ جلوگیری شود.

fun main() {
let x: i32 = 42;
let p: ptr<i32> = &x;

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

deref p = 99;
println("x = {}", x);
}

خروجی:

x = 42
x = 99

نتیجه‌گیری

یکی از ویژگی‌های اساسی در Wave که امکان برنامه‌نویسی سطح پایین با عملکرد بالا را فراهم می‌کند، پوینترها هستند. در توسعه سیستم‌هایی که نیاز به کنترل مستقیم حافظه دارند، کتابخانه‌های بومی و کنترل سخت‌افزار بسیار مفید بوده و به دلیل ساختار امن کامپایلر ویو، می‌توان از خطرات احتمالی در حین استفاده از پوینترها به‌طور مؤثر جلوگیری کرد.