آموزش زبان راست

آنچه در این صفحه می خوانید:

معرفی زبان راست (Rust)

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

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

Rust سینتکس زبان های سطح بالا و کنترل و عملکرد انها را با هم ادغام می کند. همچنین از تقسیم بندی های ناقص و خطر امنیتی جلوگیری می کند. این امر توانایی توسعه دهندگان را برای نوشتن کد سریع و درست افزایش می دهد. Rust برنامه های سیستم را با ترکیب انرژی با ارگونومی به برنامه های در دسترس تبدیل می کند. با استفاده از آن، برنامه نویسان می توانند نرم افزاری را ایجاد کنند که کمتر مستعد ابتلا به باگ ها و سو استفاده های امنیتی است. شرکت های بزرگ و کوچک از Rust در تولید در سراسر جهان استفاده می کنند، از جمله موزیلا، Dropbox، ان پی ام (npm)، Postmates، Braintree و غیره.

تاریخچه زبان راست (Rust)

این زبان از یک پروژه شخصی که در سال 2006 توسط Graydon Hoare، کارمند موزیلا آغاز شد، آغاز شد و اظهار داشت که احتمالاً این پروژه به نام  rust family of fungi نامگذاری شده است. موزیلا حمایت مالی از این پروژه را در سال 2009 آغاز کرد و آن را در سال 2010 اعلام کرد. در همان سال، کار از کامپایلر اولیه (نوشته شده توسط OCaml) به کامپایلر خود میزبانی که در Rust نوشته شده بود منتقل شد.

اولین نسخه پیش شماره آلفا از کامپایلر Rust در ژانویه 2012 رخ داد. Rust 1.0، اولین نسخه پایدار، در 15 مه 2015 منتشر شد. در پی 1.0، نسخه های پایدار از نقاط هر شش هفته یک بار ارائه می شوند، در حالی که ویژگی ها در nightly توسعه می یابد.

همراه با تایپ استاتیک معمولی، قبل از نسخه 0.4، Rust همچنین از تایپ های پشتیبانی می کند. سیستم تایپ مدل اظهارات قبل و بعد از اظهارات برنامه، از طریق استفاده از بیانیه چک ویژه مدل سازی شده است. اختلافات را می توان در زمان کامپایل، به جای زمان اجرای یک برنامه، کشف کرد، که ممکن است در مورد ادعاهای موجود در کد C یا ++C نیز اتفاق بیفتد. مفهوم typestate مختص Rust نبود، زیرا اولین بار در زبان NIL معرفی شد. نمونه ها حذف شدند، زیرا در عمل از آنها كم استفاده می شد، اگرچه با همان الگوی مارك تجاری هنوز می توان همین كاركرد را انجام داد.

سبک سیستم شی در نسخه های 0.2، 0.3 و 0.4 Rust به طور قابل توجهی تغییر کرد. نسخه 0.2 کلاس ها را برای اولین بار معرفی کرد، با نسخه 0.3 ویژگی های مختلفی از جمله تخریب کننده ها و چند شکل در استفاده از رابط ها را اضافه کرد. در Rust 0.4، صفات به عنوان ابزاری برای تأمین میراث اضافه شدند. واسط ها با صفات یکپارچه شدند و به عنوان یک ویژگی جداگانه حذف شدند. کلاس ها نیز حذف شدند و با ترکیبی از پیاده سازی ها و انواع ساختاری جایگزین شدند.

با شروع در 0.9 Rust و پایان دادن به Rust 0.11، Rust دارای دو نوع اشاره گر داخلی: ~ و @ بود که مدل حافظه اصلی را ساده می کند. این نوع اشاره گرها را در کتابخانه استاندارد به عنوان Box و (در حال حاضر حذف شده) مجدداً تکمیل کرد.

در ژانویه سال 2014، قبل از اولین نسخه پایدار، Rust 1.0، سردبیر دکتر Dobb's، اندرو بینوک، در مورد شانس Rust برای تبدیل شدن به رقیب ++C و به زبان های دیگر آینده D، Go و Nim اظهار نظر کرد. به گفته Binstock، در حالی که Rust به "گسترده ای به عنوان یک زبان بسیار ظریف" مورد توجه قرار می گرفت، تصویب سرعت کند زیرا به طور مکرر بین نسخه ها تغییر می کرد.

Rust سومین زبان برنامه نویسی در بررسی سالانه Stack Overflow 2015 بود و در سال های 2016، 2017، 2018 و 2019 مقام اول را کسب کرد.

معماری زبان راست (Rust)

Rust در نظر گرفته شده است که زبانی برای سیستم های بسیار همزمان و بسیار ایمن باشد، و برنامه نویسی در کل، یعنی ایجاد و حفظ مرزهایی که باعث حفظ صداقت سیستم بزرگ می شود. این امر منجر به ایجاد ویژگی هایی با تأکید بر ایمنی، کنترل چیدمان حافظه و همزمانی شده است.

  • عملکرد اصطلاح های برنامه نویسی راست

عملکرد اصطلاح های برنامه نویسی راست با عملکرد اصطلاح های برنامه نویسی سی پلاس پلاس قابل مقایسه است.

  • سینتکس

سینتکس بتونی Rust شبیه C و ++C است، با بلوک های کد محدود شده توسط آکولاد، و کلمات کلیدی جریان کنترل مانند if، else، while و for آن کنترل شده است. با این وجود همه کلمات کلیدی C یا ++C اجرا نمی شوند و برخی از توابع Rust (مانند استفاده از کلمه کلیدی مطابقت با الگوی) برای کسانی که در این زبان ها آشنا هستند کمتر آشنا می شوند. با وجود شباهت سطحی به C و ++C، سینتکس Rust به معنای عمیق تری به خانواده زبان های ML و زبان هسکل نزدیکتر است. تقریباً هر قسمت از بدنه تابع یک expression است، حتی عملگرهای جریان را کنترل می کنند.

  • ایمنی حافظه

Rust به گونه ای طراحی شده است که از حافظه ایمن باشد، و به این ترتیب امکان نشانگرهای null، نشانگرهای آویز یا نژاد داده ها در کد ایمن را نمی دهد. مقادیر داده فقط می توانند از طریق مجموعه ای ثابت از فرم ها آغاز شوند، که همه آنها نیاز به ورودی های اولیه دارند. برای تکرار عملکرد در سایر زبان های نشانگر معتبر یا NULL است، از جمله در لیست پیوندی یا ساختار داده های درختی باینری، کتابخانه Rust core یک نوع گزینه را ارائه می دهد، که می تواند برای تست اینکه آیا یک اشاره گر مقداری ارزش دارد یا وجود ندارد. Rust همچنین برای مدیریت طول عمر نحو اضافه شده را معرفی می کند و کامپایلر در مورد این موارد از طریق چک وام خود دلایل دارد.

  • مدیریت حافظه

Rust از سیستم زباله روبی اتوماتیک مانند گو (Go)، جاوا یا دات نت فریمورک استفاده نمی کند. در عوض، حافظه و منابع دیگر از طریق دستیابی به منابع، کنوانسیون اولیه سازی (RAII)، با شمارش مرجع اختیاری اداره می شوند. Rust مدیریت قطعی منابع با سربار بسیار پایین را فراهم می کند. همچنین Rust از اختصاص پشته ای ارزش ها حمایت می کند و بوکس ضمنی را انجام نمی دهد.

همچنین مفهومی از منابع (با استفاده از & نماد) وجود دارد که شامل شمارش مرجع ران تایم نیست. ایمنی استفاده از چنین نشانگرها در زمان کامپایل توسط وام گیرنده تأیید می شود، از جلوگیری از گره خوردن نشانگرها و سایر اشکال رفتار نامشخص جلوگیری می کند.

  • مالکیت

Rust دارای سیستم مالکیت است که در آن همه ارزش ها دارای یک مالک منحصر به فرد هستند و دامنه ارزش آن برابر با دامنه مالک است. ارزش ها را می توان با استفاده از مرجع تغییر ناپذیر، با استفاده از &T، با استفاده از مرجع تغییر پذیر، با استفاده از mut T&، یا با مقدار، با استفاده از T. در همه زمان ها، می توانید چندین منبع غیرقابل تغییر و یا یک مرجع تغییر پذیر (یک ضمنی خواننده-نویسنده قفل) داشته باشید. کامپایلر Rust این قوانین را در زمان کامپایل کردن اعمال می کند و همچنین بررسی می کند که همه منابع معتبر هستند.

ویژگی های زبان راست (Rust)

  • خواندن کد Rust نسبتاً آسان است و به سختی نمی توان نحو زبان هایی مانند ++C یا Scala را تجزیه کرد.
  • داشتن ویژگی های عملکردی مانند ()map() ،filter() ،find و غیره لذت بخش است. تعریف کارکردهای مرتبه بالاتر و عبور از بسته شدن آنها، به راحتی قابل انجام است. این ویژگی برنامه نویسی را به آسانی زبانی مانند روبی (Ruby) انجام نمی دهد، اما نزدیک به آن است. در واقع، شگفت آور است که برای زبانی که نسبتاً با C++ / C کار می کند، بسیار آسان است.
  • Rust شما را وادار می کند که درباره تخصیص حافظه سخت فکر کنید زیرا چاره ای ندارید. در پایان، به معنای نوشتن کد شلوغ دشوار است و نوشتن کد خوب آسان است. این انتزاع ها مستقیماً به نگارش کد همزمان نقشه ایمن دامن می زنند.
  • هزینه صفر Rust نوشتن کد خوب را بدون اضافه کردن سربار آسان می کند. صفات انتزاع برنامه نویسی مدرن را بدون مجازات عملکرد فراهم می کند.
  • کد Rust ایمن است (مشروط بر اینکه از کلید واژه ناامن استفاده نکنید، یا با کتابخانه های ناامن C تماس بگیرید)
  • نتیجه: گزینه Rust راهی مناسب برای مقابله با توابع است که می تواند یک مقدار یا متغیرهایی را که ممکن است حاوی یک مقدار باشند، بازگرداند. یک الگوی رایج در C++، C و حتی جاوا برای این است که توابع برای بازگشت یک نشانگر تهی در هنگام بازگشت چیزی وجود نداشته باشند. در بیشتر موارد، هنگامی که این اتفاق به طور غیر منتظره رخ می دهد، منجر به این می شود که کسی اوقات بدی داشته باشد.

نمونه کد های زبان راست (Rust)

در اینجا ساده برنامه "!Hello, World" نوشته شده است. !println ماکرو پیام را به خروجی استاندارد چاپ می کند.

fn main() {
    println!("Hello World!");
}

تابع فاکتوریل

fn factorial(i: u64) -> u64 {
    match i {
        0 => 1,
        n => n * factorial(n-1)
    }
}

نظرتون درباره این نوشته چیه؟ عالیه بد نیست خوب نبود