مقدمه
نکته: این ویرایش از کتاب همان نسخهای است که با عنوان The Rust Programming Language از No Starch Press بهصورت چاپی و الکترونیکی منتشر شده است.
به The Rust Programming Language خوش آمدید؛ کتابی مقدماتی دربارهی Rust. زبان برنامهنویسی Rust به شما کمک میکند نرمافزار سریعتر و مطمئنتر بنویسید. در طراحی زبانهای برنامهنویسی، معمولاً «راحتیِ استفاده در سطح بالا» و «کنترل جزئیات سطح پایین» سرِ هم پیدا نمیشوند؛ اما Rust همین چالش را بهجای پذیرفتنش، به چالش میکشد. Rust با ترکیب ظرفیت فنی قوی و تجربهی خوب برای توسعهدهنده، این امکان را به شما میدهد که جزئیات سطح پایین—مثلاً استفاده از حافظه—را کنترل کنید، بیآنکه دردسر معمولِ چنین کنترلی را متحمل شوید.
Rust برای چه کسانی است
دلایل زیادی هست که Rust را برای گروههای مختلفی جذاب میکند. بیایید نگاهی به چند گروه مهم بیندازیم.
تیمهای توسعهدهنده
Rust نشان داده ابزار بهرهوری برای همکاری در تیمهای بزرگ است؛ تیمهایی که اعضایشان سطح متفاوتی از دانش برنامهنویسی سیستمی دارند. کدهای سطح پایین مستعد باگهای ریز و کمظاهرند؛ باگهایی که در بیشتر زبانها معمولاً فقط با تستهای فراوان و بازبینی دقیقِ کد توسط افراد باتجربه پیدا میشوند. در Rust، کامپایلر نقش دروازهبان را بازی میکند و کدهای حاوی همین باگهای مخفی، از جمله باگهای همزمانی، را اجازهی کامپایل نمیدهد. وقتی تیم با کامپایلر همراه میشود، میتواند وقتش را صرف منطق برنامه کند، نه دنبال باگگشتن.
Rust ابزارهای امروزی توسعه را هم به دنیای برنامهنویسی سیستمی آورده است:
- Cargo، مدیر وابستگی و ابزار ساختِ همراهِ Rust، اضافهکردن، کامپایل و مدیریت وابستگیها را در کل اکوسیستم Rust راحت و یکدست میکند.
- ابزار قالببندی
rustfmtسبک کدنویسی را در میان توسعهدهندهها یکنواخت نگه میدارد. - Rust Language Server امکان تکمیل کد و نمایش خطاها داخل ویرایشگر/IDE را فراهم میکند.
با این ابزارها و ابزارهای دیگر اکوسیستم Rust، میشود هم سطح سیستم کد زد و هم بهرهوری بالا برد.
دانشجویان و دانشآموزان
Rust برای دانشجوها و کسانی مناسب است که میخواهند مفاهیم سیستمی را یاد بگیرند. خیلیها با Rust به موضوعهایی مثل توسعهی سیستمعامل رسیدهاند. جامعهی Rust پذیرای سوالهاست و خوشحال میشود جواب بدهد. با کارهایی مثل همین کتاب، تیمهای Rust میخواهند مفاهیم سیستمی را برای افراد بیشتری قابلدسترس کنند، مخصوصاً کسانی که تازه برنامهنویسی را شروع کردهاند.
شرکتها
صدها شرکت کوچک و بزرگ از Rust در محیط تولید استفاده میکنند؛ برای ابزارهای خط فرمان، سرویسهای وب، ابزارهای DevOps، دستگاههای embedded، تحلیل و ترنسکدینگ صدا و تصویر، ارزهای دیجیتال، بیوانفورماتیک، موتورهای جستجو، اینترنت اشیاء، یادگیری ماشین و حتی بخشهای مهمی از مرورگر Firefox.
توسعهدهندگان متنباز
Rust برای کسانی است که میخواهند خود زبان Rust، جامعه، ابزارهای توسعه و کتابخانهها را بسازند. خوشحال میشویم شما هم در توسعهی Rust سهم داشته باشید.
کسانی که سرعت و ثبات برایشان مهم است
Rust برای کسانی است که در یک زبان هم سرعت میخواهند هم ثبات. منظور از سرعت، هم سرعت اجرای کد Rust است و هم سرعتی که Rust به شما اجازه میدهد برنامه بنویسید. بررسیهای کامپایلر با اضافهکردن امکان جدید و بازآرایی کد، ثبات را حفظ میکند. این دقیقاً برخلاف کدهای قدیمی و شکنندهی زبانی است که چنین بررسیهایی ندارند و توسعهدهندهها از دست زدن به آنها میترسند. Rust با هدف قرار دادن «مفاهیم بلامصرف صفر»—یعنی امکانهای سطح بالایی که به کد سطح پایین با سرعت کد دستی کامپایل میشوند—تلاش میکند کد امن هم سریع باشد.
زبان Rust امیدوار است کاربران بسیار دیگری را هم پوشش دهد؛ آنهایی که اینجا نام بردیم فقط برخی از مهمترین ذینفعاناند. در مجموع، بزرگترین آرزوی Rust این است که مصالحههایی را که برنامهنویسها دههها پذیرفتهاند کنار بگذارد: ایمنی و بهرهوری، سرعت و راحتیِ کار. Rust را امتحان کنید و ببینید انتخابهایش با شما میخواند یا نه.
این کتاب برای چه کسانی است
این کتاب فرض میکند که قبلاً با زبانی برنامهنویسی کردهاید، اما فرض نمیکند که آن زبان چه بوده است. سعی کردهایم مطالب را طوری بنویسیم که افراد با پسزمینههای مختلف برنامهنویسی به آن دسترسی داشته باشند. وقت زیادی نمیگذاریم که بگوییم برنامهنویسی اصلاً چیست یا چطور باید به آن فکر کرد. اگر کاملاً تازهکار هستید، کتابی که مخصوص مقدمهی برنامهنویسی نوشته شده، برای شما مناسبتر خواهد بود.
چطور از این کتاب استفاده کنیم
بهطور کلی، این کتاب را اینطور فرض میکند که از اول تا آخر و پشتسرهم میخوانید. فصلهای بعدی روی مفاهیم فصلهای قبل بنا میشوند و ممکن است یک موضوع در فصلهای اول عمیق نشود، اما در فصلهای بعدی دوباره سراغش میرویم.
در این کتاب با دو نوع فصل روبهرو هستید: فصلهای مفهومی و فصلهای پروژهمحور. در فصلهای مفهومی، بخشی از Rust را یاد میگیرید. در فصلهای پروژهمحور، با هم برنامههای کوچکی میسازیم و چیزی را که تا آنجا یاد گرفتهاید به کار میبندیم. فصلهای ۲، ۱۲ و ۲۱ پروژهمحورند؛ بقیه فصلهای مفهومیاند.
فصل ۱ نصب Rust، نوشتن برنامهی «Hello, world!» و استفاده از Cargo—مدیر بسته و ابزار ساخت Rust—را توضیح میدهد. فصل ۲ شروع عملی نوشتن برنامه با Rust است؛ در آن بازی حدس عدد را میسازیم. آنجا مفاهیم را در سطح کلی بررسی میکنیم و جزئیات بیشتر را به فصلهای بعد میسپاریم. اگر دلتان میخواهد زود دست به کد شوید، فصل ۲ همانجاست. اگر اهل یادگیری دقیق و مرحلهبهمرحله هستید و دوست دارید هر جزئیات را قبل از رفتن به بعد یاد بگیرید، میتوانید فصل ۲ را رد کنید و مستقیم بروید سراغ فصل ۳ که امکانهای شبیه به زبانهای دیگر را پوشش میدهد؛ بعد، وقتی خواستید روی پروژهای جزئیات یادشده را تمرین کنید، به فصل ۲ برگردید.
در فصل ۴ سیستم مالکیت Rust را میآموزید. فصل ۵ دربارهی struct و متدهاست. فصل ۶ enum، عبارت match و ساختارهای کنترلی if let و let...else را پوشش میدهد. با struct و enum، تایپهای سفارشی میسازید.
در فصل ۷ سیستم ماژول Rust و قوانین privacy برای سازماندهی کد و API عمومیاش را یاد میگیرید. فصل ۸ ساختارهای دادهی رایج کتابخانهی استاندارد—vector، string و hash map—را بررسی میکند. فصل ۹ فلسفه و تکنیکهای مدیریت خطا در Rust را میگشاید.
فصل ۱۰ generics، trait و lifetime را پیش میبرد؛ همانهایی که به شما قدرت میدهند کدی تعریف کنید که برای چند تایپ قابل استفاده باشد. فصل ۱۱ تماموکمال دربارهی تست است؛ چیزی که حتی با وجود تضمینهای ایمنی Rust، برای درستبودن منطق برنامه لازم است. در فصل ۱۲ پیادهسازی خودمان را برای زیرمجموعهای از قابلیتهای ابزار خط فرمان grep میسازیم؛ ابزاری که در فایلها دنبال متن میگردد. برای این کار، خیلی از مفاهیمی که در فصلهای قبلی دیدیم را به کار میبندیم.
فصل ۱۳ closure و iterator را بررسی میکند؛ امکانهایی که از زبانهای برنامهنویسی تابعی به Rust آمدهاند. در فصل ۱۴ Cargo را عمیقتر میفهمیم و دربارهی شیوهی درست به اشتراکگذاری کتابخانهها با دیگران حرف میزنیم. فصل ۱۵ smart pointerهای کتابخانهی استاندارد و traitهایی را که این قابلیت را ممکن میکنند توضیح میدهد.
در فصل ۱۶ با مدلهای مختلف برنامهنویسی همزمان آشنا میشویم و میبینیم Rust چطور کمک میکند در چند نخ، بیترس و هراس برنامه بنویسید. در فصل ۱۷ همان بحث را با نحو async و await ادامه میدهیم؛ با task، future و stream و مدل سبک همزمانی که اینها امکانش را میدهند.
فصل ۱۸ نگاهی میکند به اینکه اصطلاحات Rust با اصول شیگرایی که شاید از قبل میشناسید چه ربطی دارند. فصل ۱۹ مرجعی دربارهی pattern و pattern matching است؛ روشهای قدرتمندی که در سراسر برنامههای Rust برای بیان ایدهها به کار میروند. فصل ۲۰ بوفهای از موضوعهای پیشرفته را گرد آورده: unsafe Rust، macro و جزئیات بیشتر دربارهی lifetime، trait، type، function و closure.
در فصل ۲۱ یک پروژه را کامل میکنیم: پیادهسازی یک وبسرور چندنخی سطح پایین!
و در آخر، چند پیوست اطلاعات مفید را در قالب نزدیکتر به مرجع جمع کردهاند. پیوست A کلمات کلیدی Rust، پیوست B عملگرها و نمادها، پیوست C traitهای قابل derive در کتابخانهی استاندارد، پیوست D چند ابزار توسعهی کاربردی و پیوست E editionهای Rust را پوشش میدهد. در پیوست F ترجمههای کتاب را پیدا میکنید و در پیوست G توضیح میدهیم Rust چطور ساخته میشود و nightly Rust چیست.
هیچ راهِ اشتباهی برای خواندن این کتاب نیست: اگر میخواهید جلوتر بروید، جلو بروید! شاید در نقطهای لازم شود به فصلهای قبلی برگردید. هر چیزی که برای شما جواب میدهد، همان درست است.
بخش مهمی از یادگیری Rust، یادگیری خواندن پیامهای خطای کامپایلر است: این خطاها شما را به سمت کدِ درست هدایت میکنند. به همین دلیل، مثالهای زیادی میآوریم که کامپایل نمیشوند، همراه با پیام خطایی که کامپایلر در همان حالت نشان میدهد. بدانید که اگر یک مثال تصادفی را کپی و اجرا کنید، ممکن است کامپایل نشود! حتماً متن دور و بر مثال را بخوانید تا بفهمید قرار بوده خطا بدهد یا نه. در بیشتر موارد، نسخهی درست کدی که کامپایل نمیشود را نشانتان میدهیم. Ferris هم کمک میکند کدهایی که قرار نیست کار کنند را از بقیه جدا کنید:
| Ferris | معنی |
|---|---|
| این کد کامپایل نمیشود! | |
| این کد panic میکند! | |
| این کد رفتار موردانتظار را تولید نمیکند. |
در بیشتر موارد، نسخهی درست کدهایی که کامپایل نمیشوند را نشانتان میدهیم.
سورس کد
فایلهای منبعی که این کتاب از روی آنها تولید میشود را میتوانید روی GitHub پیدا کنید.