مفاهیم زبان Rust

مالکیت و قرضدادن (Ownership و Borrowing)
شاید کاملترین و عمیقترین توضیح از Ownership و Borrowing در تمام اینترنت! این است جملهای…
علی برزگر
1404/02/28

ارجاعات در Rust
در این مقاله با ارجاعات در Rust (یا References) و نحوۀ عملکرد آنها بهصورت مفهومی…
علی برزگر
1404/02/21

متغیرها در Rust
در این مقاله با چگونگی عملکرد متغیرها در زبان Rust آشنا میشویم و خواهیم دانست…
علی برزگر
1404/02/19
سیر تکامل زبان Rust
زبان برنامهنویسی راست در سال 2006 چشم به جهان گشود! پدر معنوی آن «گریدون هور» (Graydon Hoare)، یکی از کارمندان بنیاد Mozilla بوده است. وقتی موزیلا متوجه قابلیتهای این زبان شد، در سال 2010 آن را مورد حمایت قرار داد.طبیعتا وقتی موزیلا پشت چیزی میایستد، باید چالشهای وب مدرن را در آن لحاظ کند. بدین جهت زبان Rust یکی از زبانهای کاربردی برای توسعهٔ وب است، اگرچه کاربردهای آن بسیار فراتر از وب است. زبان راست منحصر در توسعهٔ وب نیست؛ بلکه هدف اصلی از ایجاد این زبان، جایگزینی با زبان C++ بود تا بتواند مشکلاتی که در آن زبان بر سر راه توسعهدهندگان بود را مرتفع نماید؛ مشکلاتی همچون ایمنی حافظه، همزمانی امن، مدیریت خطا و موارد دیگر.از آنجا که این زبان با هدف جایگزینی با C++ ساخته شده است، در نتیجه برای اهداف بیشماری همچون توسعهٔ سیستم عامل، برنامههای سمت سرور، توسعهٔ برنامههای دارای رابط کاربری، و نوشتن برنامههای سیستمی قابل استفاده است. آن هم بدون مشکلات عدیدهای که در C++ بر سر راه برنامهنویسان وجود دارد.بیجهت نیست که سرعت رشد زبان Rust بسیار بالاست و البته جامعهٔ بسیار فعالی برای آن وجود دارد؛ راست به توسعهدهندگان این اجازه را میدهد که برنامههایی بسیار سریع و کارآمد را در سادهترین شکل ممکن بنویسند.مشکلات مدیریت حافظه
به طور کلی مدیریت حافظه در زبانهای برنامهنویسی در دو دسته قابل تجمیع بود؛ مدیریت دستی، و روش Garbage Collection یا جمعآوری زباله. در روش اول (که توسط زبانهای سطح پایین همچون C++ انجام میشد) همواره مدیریت حافظه باید با مراقبتی بسیار توسط خود برنامهنویس انجام میشد؛ مسئلهای که بسیار موقعیتهای خطازا ایجاد میکرد و بیشترین چالشهای توسعهٔ نرمافزار را با خود به همراه داشت؛ به حدی که بیش از 60 درصد از باگهای نرمافزاری در پروژههایی همچون سیستمهای عاملی که گروههای مختلف مینوشتند، به مدیریت حافظه اختصاص داشت. تازه این باگها برای برنامهنویسان بسیار باتجربهای بوده که سالها در شرکتهای بزرگ مشغول توسعهٔ نرمافزارهای بزرگ بودهاند!بعدها زبانهایی با قابلیت Garbage Collection وارد میدان شدند همچون جاوا و پایتون؛ این زبانها مدیریت حافظه را به کلی از دستان برنامهنویس خارج میکردند و خودشان با الگوریتمهایی به صورت داخلی، حافظه را مدیریت میکردند. اما این راهکار نیز مشکلاتی به همراه داشت؛ مثلا اینکه همواره یک لایهٔ اضافه از کد باید بر برنامه نظارت میکرد؛ به همین سبب نیز کارایی به نسبت پایین داشتند و خصوصا برای مواردی که نیازمند به حداکثر بهینهسازی منابع داشتیم (همچون وبسرورها، سیستمهای عامل و سیستمهای Embedded) اصلا مناسب نبودند. البته زبانی همچون Golang سعی در بهبود این وضعیت داشت و برای مثال نیازمند به ماشین مجازی یا مفسر دائمی نبود، اما همچنان از اجرای یک کد موازی رنج میبرد.در این میان، زبان Rust با معرفی پارادایمی جدید در برنامهنویسی، این مسئله را دستخوش تغییر کرد؛ مالکیت و قرضدادن.مشکلات مربوط به همزمانی
همزمانی شامل مفاهیم متفاوتی میشود که در حوصلهٔ این نوشتار نیست. اما همواره یکی از بزرگترین چالشهای برنامهنویسان، استفاده از منابعی بوده است که چند رشتهٔ پردازشی به صورت همزمان به آن دسترسی پیدا میکنند. در اینجا نیز زبان راست از جدیدترین روشها جهت مدیریت این مسئله بهره میبرد؛ خصوصا وقتی آن را با مفاهیمی همچون مالکیت و قرضدادن، به همراه Smart Pointers ترکیب میکند.تفاوتهای بین Rust و C++
- مدیریت حافظهٔ بسیار بهتر
- عدم نیاز به Garbage Collection
- ساختار بروزتر و داشتن Package Manager داخلی با عنوان Cargo
- برنامهنویسی همزمان امنتر
- سینتکس سادهتر Rust که یادگیری و استفاده از آن را آسان میکند.
شباهتهای میان Rust و C++
شباهتهای بسیاری میان این دو زبان وجود دارد؛ از جمله اینکه هر دو اینها مستقیما به زبان ماشین کامپایل میشوند، برای کدهای سطح پایین قابل استفاده هستند، کارایی بالایی را به ارمغان میآورند، و کدهای آنها تقریبا در همه جا قابل اجرا هستند. البته امکان استفاده از کدهای C++ از طریق Rust نیز وجود دارد.مزایای Rust در عدم استفاده از Garbage Collection
- سرعت بیشتر: با نبود کد اضافهتر، منابع کمتری درگیر میشود و کارایی کلی برنامه بسیار افزایش مییابد؛ خصوصا در شرایط بار پردازشی شدید.
- کنترل بیشتر بر روی حافظه: این شمایید که تصمیم میگیرید با حافظه چگونه برخورد شود، اما درگیر چالشهای اضافی C++ نمیشوید.
- پیشبینیپذیری بیشتر و خطای کمتر: گاها GC موجب بروز خطا در برنامه میشود، اما این مورد در راست وجود ندارد.
- امکان سازگاری سریعتر کدهای Rust با پلتفرمهای مختلف.
ساز و کار Ownership و Borrowing
استفاده از متغیرها بیدروپیکر نیست! راست شما را ملزم میکند تا مراقب متغیرهایتان باشید و در همان زمان کامپایل، اجازهٔ هرگونه استفادهای را به شما نمیدهد. همین محدودسازی است که تفاوت راست را با سایر زبانها ایجاد میکند. به همین دلیل است که در راست نیازمند به الگوهای طراحی متفاوتی با زبانهای دیگر هستیم و ملاحظات متفاوتی باید توسط توسعهدهنده انجام شود. به من اعتماد کنید؛ به سختیِ مهاجرت از جاوا به جاوااسکریپت نیست! 😉در نتیجهٔ این ضوابط، مزایایی تولید میشود:- خطاهای دسترسی اشتباه به حافظه مدیریت میشوند.
- در برنامههای چندنخی، ایمنی بیشتری در دسترسی به منابع خواهیم داشت.
- مصرف منابع نیز به نحوی بهینهتر انجام میشود.
مزیتهای Rust در توسعهٔ سیستمهای عامل
این مزایا نیز بسیار قابل توجه هستند. فکرش را بکنید که در توسعهٔ برنامههای بسیار بزرگی همچون سیستمهای عامل، مشکلات مدیریت حافظه به حداقل برسد! طبق برآوردها، بیش از ۶۰ درصد مشکلاتی که بر سر راه توسعهٔ سیستمهای عامل سبز میشود، ناشی از مدیریت حافظه است. این را هم مایکروسافت میگوید، هم گوگل، و هم خالق لینوکس! همهٔ اینها عدد 70 درصد را بیان میکنند.کجاها میتوان از Rust استفاده کرد؟
تقریبا در همه جا! از توسعهٔ سیستمهای Embedded گرفته تا توسعهٔ سیستمهای عامل. از جایگزینی برای جاوااسکریپت از طریق WebAssembly، تا توسعهٔ Backend با قابلیت پشتیبانی از تعداد زیادی اتصال همزمان؛ از طراحی Backend نرمافزارهای ویندوزی و لینوکسی تا رابط کاربری این سیستمها.یک کلام؛ یک زبان برای تقریبا همهٔ مصارف!حرکت شرکتهای بزرگ به سمت Rust
شاید جالب باشد که بدانید حتی شرکتهایی که اکوسیستم اختصاصی خود را برای توسعهٔ نرمافزار دارند، آنها نیز نتوانستند از مزایای فوقالعادهٔ زبان راست چشمپوشی کنند! در ادامه چند عنوان از این شرکتها را ذکر میکنیم:- Microsoft در هستهٔ سیستم عامل ویندوز
- Google در سیستم عامل اندروید و برخی پروژههای زیرساختی
- Amazon در برخی سیستمهای ابری در AWS
- Meta در بخشهای مرتبط با مدیریت کدهای منبع