۹ شهریور ۱۳۹۸

زبان برنامه‌نویسی RUST قابلیت ها و کاربردها

از زمان نوشتن سیستم‌عامل‌ها توسط زبان‌های برنامه‌نویسی سطح بالا، بیش از نیم قرن می‌گذرد، اما همواره محققان در این زمینه با دو مشکل اساسی مواجه بوده‌اند:

۱) دشواری نوشتن کد به صورت امن: زیرا همواره اکسپلویت‌های امنیتی مختلفی وجود دارند که به‌راحتی می‌توانند خطاهایی را در برنامه‌های مدیریت حافظه اعمال نمایند. به‌عنوان مثال، در تحلیل ویروس Morris، نخستین ویروس اینترنتی که به‌دقت مورد تحلیل قرار گرفت، مشخص شد که این ویروس توانسته ‌است از اِشکال سرریزهای بافر نهایت استفاده را ببرد و خود را از یک دستگاه به دستگاهی دیگر، کپی و منتشر نماید.

۲) دشواری نوشتن کد برای همزمان سازی در سیستم‌های چندنخی : یکی از قابلیت‌های ماشین‌های مدرن اجرای همزمان چند برنامه است که لزوم بهره برداری از آن نوشتن کد چندنخی است. با ورود نسل جدید سخت افزارها به بازار، هر یک به تنهایی تلاش در فراهم نمودن پردازنده‌های سریع‌تر دارند؛ امروزه حتی دستگاه‌های سیار نظیر تلفن های همراه، لپ تاپ‌ها و تبلت‌ها، حاوی چندین هسته هستند. با این وجود برای بهره‌بردار‌ی کامل از قابلیت‌های این دستگاه‌ها، کافی است که کدهای چندنخی نوشته شوند. اما، تجربه‌ی برنامه‌نویسان نشان داده ‌است که نوشتن چنین کدهایی، با هشدارهایی همراه است: همروندی، کلاس جدید گسترده‌ای از باگ‌ها را معرفی می‌کند و می‌تواند باگ‌های معمولی را سخت‌تر برای بازتولید ایجاد نماید.

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

کاربردهای زبان برنامه نویسی Rust:

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

  • برنامه‌های سمت سرویس گیرنده، مانند مرورگرها
  • سیستم‌های با تاخیر پایین و کارایی بالا، مانند درایورهای دستگاه، بازی‌ها، و پردازش سیگنال
  • سیستم‌های توزیع‌شده و همروند، مانند برنامه‌های سمت سِرور
  • سیستم‌های بلادرنگ و حیاتی، مانند سیستم‌عامل‌ها یا هسته‌های آنها
  • سیستم‌های تعبیه‌شده (که به حداقل زمان اجرا نیاز دارند) یا یک محیط مقید به منبع، مانند Raspberry Pi، Arduino، یا رباتیک‌ها
  • ابزارها یا سرویس‌هایی که نمی‌توانند تاخیرات طولانی‌مدت رایج در سیستم‌های کامپایلر JIT را تحمل نمایند و به راه‌اندازی آنی نیاز دارند.
  • فریم‌ورک‌های تحت وِب
  • سیستم‌های نرم‌افزاری مقیاس‌پذیر بزرگ، بسیار کارا، حساس به منبع، و پیچیده

همچنین Rust زمانی مناسب است که کیفیت کد، برای توسعه‌دهنده در اولویت باشد:

  • تیم‌های توسعه‌دهنده‌ی کوچک یا بزرگ
  • کد برای استفاده از محصولی با زمان اجرای طولانی
  • کد با طول عمری طولانی‌تر، که به نگهداری و بازسازی منظم نیاز دارد
  • کدی که کاربر بتواند به طور طبیعی، شمار متعددی از تست‌های واحد را جهت حفاظت از آن بنویسد

حتی پیش از ظهور Rust 1.0، دو شرکت، از آن در محصولات خود استفاده می‌کردند:

  • OpenDNS: یک میان‌افزار جهت انسداد بدافزار و دامنه‌های مخرب است
  • Skylight: متعلق به کمپانیTilde ابزاری جهت نگهداری اجرای برنامه‌های Rails

همانطور که می‌دانیم شهرت کنونی شرکت موزیلا، برگرفته از مرورگر معروف آن یعنی (فایرفاکس ) است. امروزه، غالب مرورگرها به زبان C++  نوشته می‌شوند؛ به عنوان مثال، فایرفاکس و کروم، به‌ترتیب توسط ۱۲,۹۰۰,۹۹۲ و ۴,۴۹۰,۴۸۸ خط کد به زبان C++  نوشته شده‌اند. این امر، به برنامه سرعت می‌بخشد، اما به‌طور ذاتی، به دلیل آن‌که امکان دستکاری حافظه در C وC++  وجود دارد و مکانیزمی جهت اعتبارسنجی دسترسی به حافظه در این زبان‌ها تعبیه نشده‌است، برنامه‌ای که تحت زبان‌های مذکور نوشته می‌شود، ناامن خواهد بود.

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

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

تصویر 1، محور ایمنی-کنترل زبان‌های برنامه‌نویسی

تصویر ۱، محور ایمنی-کنترل زبان‌های برنامه‌نویسی

 

تصویر ۱، محور ایمنی-کنترل زبان‌های برنامه‌نویسی را نشان می‌دهد. همان‌گونه که در تصویر مشاهده می‌شود، هرچه به سمت راست پیش می‌رویم، بر میزان ایمنی زبان‌ها افزوده خواهد شد. در واقع، با افزایش میزان ایمنی زبان، از میزان کنترل آن کاسته خواهد شد و بالعکس.

این زبان، به‌گونه‌ای طراحی شده‌است که سعی دارد با تعبیه‌ی ویژگی‌های زیر، با وضع دشوار موجود مقابله نماید و بر آن غلبه کند:

  • ایمنی بالا توسط سیستم
  • کنترل عمیق اما امن بر منابع سطح پایین (تا حدودی امنیتی نزدیک به زبان های C وC++را فراهم کند)، به‌گونه‌ای که نزدیک به سطح سخت‌افزار اجرا شود.

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

برخلاف اغلب زبان‌های برنامه‌نویسی مدرن موجود، مانند Java، C#، Python، Ruby، و Go، Rust قادر است اهداف مذکور را بدون استفاده از یک زباله‌روب ، به انجام رساند. در واقع، هنوز Rust فاقد یک زباله‌روب است (اگرچه، برنامه‌ریزی شده‌است).

جمع‌بندی

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

Rust، ابزاری مناسب برای توسعه‌دهندگان (برنامه‌نویسان) و نیز پروژه‌هایی است که نه تنها کارایی و بهینه‌سازی‌های سطح پایین برای آنها حائز اهمیت است، بلکه به محیط اجرایی امن و پایدار نیاز دارند. به‌علاوه، Rust، تکنیک‌های برنامه‌نویسی کاربردی سطح بالایی را به زبان اضافه می‌کند؛ به نحوی که گمان می‌رود این زبان در آنِ واحد، هم یک زبان سطح بالا و هم یک زبان سطح پایین است.

مراجع:

[۱] Rust-Lang, “The Rust Programming Language,” ۲nd Edition, https://www.rust-lang.org/en-US/.

[۲]  J. Getreu, “Embedded System Security with Rust,” May 2016.