Learning Rust 🦀: 06 – مالکیت – قسمت 1

این اولین مقاله از این مجموعه است که در مورد یک ویژگی منحصر به فرد زنگ صحبت می کند. مالکیت. برای روشن ماندن موضوع را به 2 قسمت تقسیم می کنم. بنابراین، بیایید شروع کنیم! 🤩
⚠️ به خاطر بسپار!
شما می توانید تمام کدهای این مجموعه را در مخزن همراه آن بیابید
اگر نمی خواهید Rust را به صورت لوکال نصب کنید، می توانید با تمام کدهای این مجموعه در زمین بازی رسمی Rust که در صفحه رسمی آن یافت می شود بازی کنید. اما برای این یکی، شما نیاز دارید
cargo
نصب بر روی دستگاه شما (یا VM).⚠️⚠️ مقالههای این مجموعه بهطور ضعیفی از محتویات «زبان برنامهنویسی Rust، ویرایش دوم» توسط استیو کلابنیک و کارول نیکولز پیروی میکنند، بهگونهای که درک من را از دیدگاه توسعهدهندگان پایتون منعکس میکند.
⭐ سعی می کنم هر هفته یک مقاله جدید منتشر کنم (شاید بیشتر اگر خدایان رست 🙌 سخاوتمند باشند😁) پس با ما همراه باشید 😉. من “به روز رسانی مقالات جدید” را در لینکدین و توییتر.
فهرست مطالب:
مدیریت حافظه:
همانطور که در اولین مقاله این مجموعه به طور خلاصه معرفی شد، یک زبان برنامه نویسی کامپیوتری باید حافظه هر برنامه کامپیوتری که به آن زبان نوشته شده است را به نحوی مدیریت کند، فرآیندی به نام “مدیریت حافظه”.
در خارج از دنیای “Rust”، این فرآیند به طور کلی انجام می شود به صورت دستی (مسئولیت برنامه نویس) یا با استفاده از نوعی از مجموعه زباله الگوریتم(ها) (مسئولیت زبان برنامه نویسی). برای پایتون از آن استفاده می کند مجموعه زباله. در اصل، این یک الگوریتم برای شناسایی “خودکار” است استفاده نشده بلوک های حافظه توسط برنامه و سپس آنها را “عدم تخصیص” (رایگان) می کند. در این مقاله عالی، شما می توانید همه چیز را در مورد جزئیات بیشتر بخوانید مجموعه زباله در پایتون و حدس میزنم در زبانهای دیگر نیز مشابه باشد 🤷♂️.
کتابچه راهنمای از طرف دیگر مدیریت حافظه کاملاً بر عهده برنامه نویس است. برنامه نویس مجبور است اختصاص دهد سپس حافظه را به برنامه اختصاص دهید تخصیص دادن (رایگان) این حافظه زمانی که برنامه با آن تمام شد. این قدرت زیادی به برنامه نویس می دهد و اگر به درستی انجام شود، برنامه را بسیار کارآمدتر می کند و بدون هیچ گونه اجرا می شود مجموعه زباله در بالای سر. اما این مجموعه جدیدی از مشکلات را ایجاد می کند:
- اگر برنامه نویس فراموش کرد حافظه را آزاد کند: در نتیجه چیزی به نام نشت حافظه جایی که برنامه در حال استفاده بیش از حد از حافظه اضافی است.
- اگر برنامه نویس حافظه را خیلی زود آزاد کند: این می تواند باعث از کار افتادن برنامه یا خرابی داده ها شود که هر دو بد هستند 😔.
پشته و پشته:
یک چیز دیگر قبل از اینکه در مورد Rust صحبت کنیم مالکیت سیستم و اگر می دانید چیست پشته و پشته هستند، می توانید از این بخش رد شوید. اما برای من این یک چیز جدید بود! 🤓
از دیدگاه یک زبان برنامه نویسی، حافظه کامپیوتر به دو بخش تقسیم می شود.سیستم های فرعی” (اگر بتوانیم آنها را اینطور بنامیم). یکی یک سیستم سازمان یافته، شناخته شده و مانند صف است که نامیده می شود پشته. ورودیهای پشته باید اندازههای مشخصی داشته باشند و بر اساس آخرین ورودی اول به آنها دسترسی داشته باشید. میتوانید آیتمها را به پشته فشار دهید (اضافه کنید) و آیتمها را نیز از پشته بیرون بیاورید (حذف کنید)، اما نمیتوانید یک مورد را از وسط آن حذف کنید بدون اینکه ابتدا موارد قبلی را بیرون بیاورید. هل دادن به و ترکیدن از پشته سریعتر از پشته است.
پشته پسر عموی کمتر سازماندهی شده است پشته. اقلام می توانند اندازه های نامشخصی داشته باشند و به هر ترتیبی قابل تخصیص و حذف شوند. هل دادن به پشته کندتر از پشته. وقتی داده ها را به پشته، شما یک اشاره گر به این داده ها، زیرا اندازه آن ناشناخته است.
نکته اصلی در اینجا این است که دسترسی به داده ها در پشته سریعتر از پشته و داده ها در پشته باید در زمان کامپایل اندازه مشخصی داشته باشد بر خلاف پشته.
مالکیت زنگ:
زنگ راه منحصر به فرد خود را برای انجام دارد مدیریت حافظه. استفاده می کند مالکیت که 3 قانون ساده زیر است:
- مقدار در Rust باید دارای یک باشد مالک.
- هر ارزشی باید داشته باشد فقط یک مالک در یک زمان معین.
- وقتی صاحبش میره خارج از دامنه، مقدار کاهش یافته است.
با پیروی از این قوانین، Rust توانسته است با اجتناب از مشکلات، ایمنی حافظه را تقویت کند مدیریت دستی حافظه و از استفاده اجتناب کرد مجموعه زباله که معمولا عملکرد را بهبود می بخشد. ممکن است تعجب کنید، “این دقیقاً چیست؟ دامنه و مالک؟؟!”. نگران نباشید، در ادامه در مورد آن صحبت خواهم کرد.
محدوده ها در Rust:
محدوده در زنگ است دامنه جایی که این مقدار (متغیر) معتبر است. یک متغیر با شروع از آن معتبر است اعلام تا دامنه فعلی آن به پایان برسد.
fn main() {
// Start of "main" function scope.
let x = 5;
println!("Value of x from 'main' scope is {x}");
{
// Start of "internal" scope.
let y = 10;
println!("Value of y from internal scope is {y}");
println!("Value of x from 'internal' scope again is {x}");
} // End of "internal" scope.
println!("Value of y from 'main' scope is {y}"); // Error: cannot find value `y` in this scope
println!("Value of x from 'main' scope again is {x}");
} // End of "main" function scope
ادامه دهید و این کد را اجرا کنید. برنامه به دلیل این خط وحشت می کند println!("Value of y from 'main' scope is {y}");
دادن خطای زیر:
cannot find value `y` in this scope
که تقریباً مشابه پایتون و هر زبان دیگری است. اما این همه چیز نیست دامنه ها. مانند همیشه در مورد Rust، برخی اخطارهای متمایز در مورد دامنه وجود دارد که در قسمت 2 بررسی خواهیم کرد.
در این مقاله کوتاه به برخی از نظریه ها در مورد زنگ پرداختیم مالکیت. در بخش 2، ما عمیق تر خواهیم شد و موضوع این مقاله را دنبال می کنیم و شروع به کاوش در آن می کنیم رشته به عنوان مثال برای نشان دادن آن تایپ کنید مالکیت مفاهیم. پس میبینمت👋.