زبان Rust چیست؟
شاید لازم باشد در این نوشتار، سعی کنم تا شما را به مهاجرت به Rust ترغیب کنم؛ از مزایای آن بگویم و از معایب رقبایش. اما این کار، خیلی «طرفدارانه» است و چنین القا میکند که انگار میخواهم دفاع بیخودی از این زبان داشته باشم و طوری القا کنم که انگار ماست من خیلی شیرین است!
ولی واقعاً چنین قصدی ندارم. هر زبانی برای کاربردهای خاص خودش بسیار مفید است. ولی لازم است بدانیم که این طبیعت بشر است که با گذر زمان، از ساختههای قبلی خودش درس میگیرد تا در چیزهای جدیدی که میسازد، مشکلات قبلی را کمتر، و مزایای آن را بیشتر کند. زبان Rust نیز بدین سبب که سعی وافری در این جهت داشته، بهصورت طبیعی در همین مسیر قرار میگیرد که برای معرفی آن لازم میآید از زبانهای قبلی و معایبشان سخن بگوییم تا در نهایت مشخص کنیم چگونه این زبان میتواند حرکتی روبهجلو باشد.
بالاخره اینکه شرکتهای بزرگ فناوری در حال مهاجرت به سمت راست (!!) هستند و بخش قابلتوجهی از Codebase خود را به سمت زبان راست میچرخانند بیدلیل نیست. در نتیجه اگر ما از Rust تعریف و تمجید میکنیم ناشی از طرفداری بیمورد و بیاساس و از روی هواخواهی نیست، بلکه واقعاً زبان Rust آیندۀ دنیای فناوری و تکنولوژی است.
کاربردهای زبان Rust
امروزه اینکه یکبار کد بنویسید و آن را روی پلتفرمهای مختلف اجرا کنید، نرخ شاهعباسی است! بسیاری از زبانها راه خود را به پلتفرمهای حتی در ظاهر بیربط نیز باز کردهاند (همچون جاوا اسکریپت برای Backend و php برای Frontend و C# برای اندروید)، و بسیاری دیگر نیز از ابتدا باهدف قابلیت اجرا بر روی سکوهای مختلف ایجاد شدند (همچون Java). Rust از نوع دوم است. اما کدام پلتفرمها؟ هر جایی که یک کد باینری بتواند اجرا بشود! يعنی تقریباً همهجا! ازجمله:
- برنامهنویسی Embedded برای Microcontrollerها
- توسعۀ نرمافزارهای کاربردی و روزمره
- توسعۀ سیستمعامل
- وبسرور و وبسرویس
- رابط کاربری
- جایگزینیِ نسبی برای JavaScript در Frontend از طریق Web Assembly
- ساختن بازیها و نرمافزارهای گرافیکی
- و هر جایی که تا قبل از این از C++ استفاده میشد! یعنی تقریباً تمام دنیای کامپیوتر
Rust، زبانی سطح بالا یا سطح پایین؟
تعاریف مختلفی از زبان برنامهنویسی سطح بالا یا سطح پایین وجود دارد. Rust ازاینجهت که به طور مستقیم با منابع سیستمی (همچون حافظه) درگیر است، سطح پایین محسوب میشود، اما ازاینجهت که سختیهای مدیریت منابع را بسیار سادهتر کرده و نیازمندی به عمیقشدن در مدیریت منابع را بسیار کاهش داده، شبیه به زبانهای سطح بالا همچون C#،Java ،JavaScript ،Python و غیره است.
اما همچنان بخشی از پیچیدگی مدیریت منابع را بر برنامهنویس تحمیل میکند؛ ولی نه به حدی که برای کسی که از زبانی سطح بالا میآید قابلتحمل نباشد؛ لذا میتوان گفت که Rust از منظر سختی در برنامهنویسی یک زبان سطح میانه است.
آیا یادگیری زبان Rust و مهاجرت به آن ارزشش را دارد؟
پاسخ به این سؤال بستگی دارد به اینکه از کدام زبانها به Rust میآیید. اگر از C++ و زبانهای همسطح با آن میآیید، قطعاً! Rust بسیار برنامهنویسی را سادهتر میکند و از نظر کارایی نیز افت چندانی به شما تحمیل نمیکند و بلکه در برخی موارد سریعتر نیز خواهد بود.
اما اگر از زبانهای سطح بالاتر (همچون خودم که از Java و PHP وارد دنیای Rust شدم) میآیید، حتماً میدانید که در پروژههای سادۀ چندخطی که تعداد محدودی کاربر از آن استفاده میکنند، آن زبانها خیلی کار را راه میاندازند. اما همینکه تعداد کاربران زیاد شد یا حتی حجم کدهای پروژه زیاد شد، مزایای این زبانها کمرنگ میشوند.
در کدهای بزرگ شما همیشه تابع ساختاری هستید که برای برنامۀ خود از پیش آماده کردهاید؛ اگر زبان شما جاوا باشد ساختار برنامه را بر اساس قابلیتهایی که جاوا به شما میدهد پیادهسازی میکنید و اگر PHP باشد نیز بر همان اساس. برای مثال در PHP بارگذاری داینامیک سورسکد توسط دستورهای include و require وجود دارد؛ اما در جاوا خیر.
ولی درهرحال اینکه قابلیتهای زبان چه باشد، احتمالاً آخرین چیزی است که برایتان مهم میشود؛ آنچه تمرکز شما را مصرف میکند، ساختار خود برنامه است. در مورد Rust نیز چنین است؛ Rust آنقدر مثل زبانهای سطح پایین پیچیده نیست که با آن نتوان پروژههای بزرگ را بهسادگی نوشت؛ صرفاً کافی است با پارادایمهای راست آشنا شوید تا سپس بتوانید پروژههای بزرگ خود را با بالاترین کارایی پیادهسازی کنید.
مزیت دیگر زبان راست در هنگامی است که کارایی برنامه بسیار مهم باشد؛ فرض کنید هستۀ سیستمعامل را با زبانی همچون جاوا مینوشتیم! فارغ از اینکه جاوا نیازمند JVM است (و سایر زبانهای مشابه نیز چیزهای مشابهی دارند)، خود جاوا آنقدر بهینه نیست.
یا مثلاً در وبسرور، اگر بخواهید تعداد کاربرانی که میتوانند از سرور خدمات بگیرند را تعدادی بسیار بالا در نظر بگیرید (مثلاً 1 میلیون کاربر همزمان) یا اینکه عملیاتی که برای هر کاربر صورت میگیرد بسیار پرمصرف باشد، زبانهایی همچون C++ و Rust از هزینههای بسیار بالای سرورهای اضافی جلوگیری میکنند و این امکان را میدهند که هر سرور بتواند به تعداد بسیار بیشتری از کاربران پاسخ دهد. اما Rust با سادگی بسیار بیشتر و کد بسیار تمیزتر از C++.
زبان Rust چه چیزهای جدیدی دارد؟
تا پیش از راست، زبانهای برنامهنویسی خلأهای عدیدهای داشتند که کار را برای برنامهنویسان سخت میکرد و زبانی که همۀ قابلیتهای زیر را ارائه بدهد وجود نداشت:
- مدیریت سادهتر حافظه در کنار حفظ کارایی (Performance)
- همزمانی (Concurrency) ساده و به دور از پیچیدگیهای دسترسی به منبع مشترک
- کامپایل به باینری (مانند C++) و نه Bytecode (همچون جاوا و C#)
- نبود Null Pointer که بسیار خطازا است
- جلوگیری از اکثر خطاهای ممکن، آن هم نه در زمان اجرا بلکه در زمان کامپایل
- منحنی یادگیری مناسب؛ نه خیلی شیبناک و نه خیلی بلندمدت
- امکان برنامهنویسی شیءگرا در کنار برنامهنویسی تابعگرا
- وجود Package Manager داخلی جهت مدیریت وابستگیها
- کتابخانۀ استانداردی که بسیاری از کدهای آن، سربار اضافی در زمان اجرا ایجاد نکند
توسعهدهندگان زبان راست سعی کردند تا گلچینی از راهکارهای بسیار کارآمد را در آن تعبیه نمایند که تمامی موارد بالا را تا حد ممکن پوشش دهد. اما هر چیزی هزینهای دارد و برای هر پروژه باید دید که آیا به هزینهاش میارزد یا خیر. جمعبندی ما – همانطور که سابقاً اشاره کردیم – این است که میارزد.
معایب زبان راست چیست؟
امنیت کد و جلوگیری از اشتباهات ناخواستۀ برنامهنویس، در کنار کارایی بالا بسیار برای زبان راست حائز اهمیت است. Rust سعی میکند تا تعادلی بین کارایی، امنیت و سادگی ایجاد کند؛ بر خلاف زبانی مثل پایتون که سادگی برایش در اوج اهمیت است. همین مسئله موجب میشود یادگیری و کدنویسی راست اندکی از سایر زبانها بهویژه سطح بالا سختتر باشد. خصوصاً که زبان راست اساساً مفاهیم جدیدی را به دنیای برنامهنویسی معرفی کرده که نیازمند به یادگیری هستند.
همچنین امنیت بالای راست موجب جدال زیادی میان یک «راستیشن» تازهکار با کامپایلر میشود؛ کامپایلر اجازۀ هر نوع کدی را نمیدهد و کد باید قوانین امنیتی متعددی را طی کند تا مورد تأیید قرار گیرد. مهمترین این قوانین، قوانین Ownership و Borrowing (مالکیت و قرضدادن) هستند که هم مفاهیم جدیدی ارائه میکنند و هم اثرگذاری شگرفی بر سایر قابلیتهای زبان Rust دارند.
نتیجهگیری
بهصورت خلاصه اگر بخواهم بگویم، Rust یک زبان برنامهنویسی پیشرفته، امن و کارآمد است که برای حل مشکلات زبانهای پیش از خود همچون جاوا و C++ طراحی شده است. این زبان با تسهیل مدیریت حافظه بدون نیاز به Garbage Collector، جلوگیری از خطاهای رایجی مثل Null Pointer و امکان نوشتن کدهایی تمیز و امن، هم در پروژههای بزرگ و حساس مانند سیستمعاملها و وبسرورها و هم در پروژههای کوچک، در عین سادگی عملکردی عالی دارد.
گرچه مفاهیم اختصاصی زبان راست مانند مالکیت و قرضدادن در بدو امر ممکن است سخت به نظر برسد، اما با گذر از این مرحله، تجربهای شیرین برای کدنویسی فراهم میشود. Rust انتخابی آیندهنگرانه است که نهتنها در مقیاسهای بزرگ، بلکه در برنامههای ساده و روزمره نیز مزایای قابلتوجهی به همراه دارد.