مقدمه

نکته: این نسخه از کتاب همان نسخه‌ی The Rust Programming Language است
که به‌صورت چاپی و الکترونیکی از طریق No Starch Press در دسترس می‌باشد.

به The Rust Programming Language خوش آمدید، کتابی مقدماتی درباره‌ی Rust.
زبان برنامه‌نویسی Rust به شما کمک می‌کند نرم‌افزارهایی سریع‌تر و قابل‌اعتمادتر بنویسید.
در طراحی زبان‌های برنامه‌نویسی، اغلب بین راحتی سطح بالا و کنترل سطح پایین تضادی وجود دارد،
اما Rust این چالش را برطرف می‌کند. با ترکیب توانایی فنی قدرتمند و تجربه‌ی کاربری عالی،
Rust این امکان را می‌دهد که کنترل جزئیات سطح پایین (مانند مدیریت حافظه) را بدون دردسرهای معمول در اختیار داشته باشید.

Rust برای چه کسانی مناسب است؟

Rust برای افراد مختلفی مناسب است. بیایید برخی از مهم‌ترین گروه‌ها را بررسی کنیم.

تیم‌های توسعه‌دهنده

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

Rust همچنین ابزارهای مدرن توسعه را به دنیای برنامه‌نویسی سیستم‌ها می‌آورد:

  • Cargo، مدیر وابستگی‌ها و ابزار بیلد داخلی،
    که اضافه کردن، کامپایل کردن و مدیریت وابستگی‌ها را در کل اکوسیستم Rust ساده و یکپارچه می‌کند.
  • Rustfmt، ابزاری برای قالب‌بندی کد، که سبک کدنویسی یکسانی را بین توسعه‌دهندگان حفظ می‌کند.
  • rust-analyzer، ابزاری که برای ادغام با محیط‌های توسعه (IDE) استفاده می‌شود
    و امکاناتی مانند تکمیل خودکار کد و نمایش خطاها به‌صورت آنی را فراهم می‌کند.

با استفاده از این ابزارها و دیگر امکانات اکوسیستم Rust،
برنامه‌نویسان می‌توانند هنگام نوشتن کدهای سطح سیستم، بهره‌وری بیشتری داشته باشند.

دانشجویان

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

شرکت‌ها

صدها شرکت، از کوچک تا بزرگ، از Rust در محیط‌های تولیدی برای کارهای متنوعی استفاده می‌کنند،
از جمله ابزارهای خط فرمان، سرویس‌های وب، ابزارهای DevOps،
دستگاه‌های تعبیه‌شده، تحلیل و تبدیل فرمت صدا و ویدئو، ارزهای دیجیتال،
زیست‌اطلاعاتی (bioinformatics)، موتورهای جستجو، برنامه‌های اینترنت اشیا (IoT)،
یادگیری ماشین، و حتی بخش‌های مهمی از مرورگر وب Firefox.

توسعه‌دهندگان متن‌باز

Rust برای کسانی است که می‌خواهند زبان برنامه‌نویسی Rust، جامعه‌ی آن،
ابزارهای توسعه و کتابخانه‌های مرتبط را توسعه دهند.
ما از مشارکت شما در بهبود زبان Rust استقبال می‌کنیم.

افرادی که سرعت و پایداری را ارزشمند می‌دانند

Rust برای کسانی است که به دنبال سرعت و پایداری در یک زبان برنامه‌نویسی هستند.
منظور از سرعت، هم سرعت اجرای کد Rust و هم سرعت نوشتن برنامه‌ها در این زبان است.
بررسی‌های کامپایلر Rust پایداری را از طریق افزودن ویژگی‌ها و انجام تغییرات ساختاری تضمین می‌کند.
این در تضاد با کدهای قدیمی شکننده در زبان‌هایی است که چنین بررسی‌هایی ندارند
و توسعه‌دهندگان اغلب از اصلاح آن‌ها واهمه دارند.
با تلاش برای ارائه‌ی انتزاعات بدون هزینه (zero-cost abstractions)،
Rust ویژگی‌های سطح بالا را به کدی سطح پایین و به همان سرعتی که به‌صورت دستی نوشته شده باشد، کامپایل می‌کند.
به این ترتیب، Rust تلاش می‌کند تا کد ایمن را همزمان سریع کند.

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

این کتاب برای چه کسانی است؟

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

چگونه از این کتاب استفاده کنیم؟

به طور کلی، این کتاب فرض می‌کند که شما آن را به ترتیب از ابتدا تا انتها می‌خوانید. فصل‌های بعدی بر پایه‌ی مفاهیمی که در فصل‌های قبلی توضیح داده شده‌اند ساخته می‌شوند و ممکن است برخی مباحث در فصل‌های اولیه به طور کامل بررسی نشوند اما در فصل‌های بعدی دوباره به آنها پرداخته شود.

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

فصل‌های کتاب

فصل ۱ نحوه‌ی نصب Rust، نوشتن برنامه‌ی "Hello, world!" و استفاده از Cargo (مدیر بسته و ابزار ساخت Rust) را توضیح می‌دهد.
فصل ۲ یک معرفی عملی برای نوشتن برنامه در Rust است و یک بازی حدس عدد را پیاده‌سازی می‌کنیم. در این فصل مفاهیم به صورت کلی توضیح داده می‌شوند و جزئیات در فصل‌های بعدی ارائه خواهند شد. اگر می‌خواهید سریع دست به کد شوید، از اینجا شروع کنید.
فصل ۳ ویژگی‌های Rust را که مشابه زبان‌های دیگر هستند پوشش می‌دهد.
فصل ۴ سیستم مالکیت (Ownership) در Rust را بررسی می‌کند. اگر علاقه دارید قبل از انجام پروژه، تمام جزئیات را بدانید، می‌توانید فصل ۲ را رد کنید و بعد از مطالعه‌ی فصل ۳ به آن بازگردید.

فصل ۵ درباره‌ی ساختارها (Structs) و متدها توضیح می‌دهد.
فصل ۶ به بررسی Enums، عبارت‌های match و ساختار کنترلی if let می‌پردازد. با استفاده از Struct و Enum، می‌توان در Rust انواع سفارشی ایجاد کرد.

فصل ۷ سیستم ماژول‌بندی Rust و قوانین مربوط به سطح دسترسی در API را آموزش می‌دهد.
فصل ۸ درباره‌ی ساختمان داده‌های پرکاربرد استاندارد مانند وکتورها، رشته‌ها و HashMapها صحبت می‌کند.
فصل ۹ فلسفه و تکنیک‌های مدیریت خطا در Rust را بررسی می‌کند.

فصل ۱۰ وارد دنیای جنریک‌ها، تریت‌ها (Traits) و لایف‌تایم‌ها (Lifetimes) می‌شود که به شما امکان می‌دهد کدی بنویسید که برای چندین نوع قابل استفاده باشد.
فصل ۱۱ به تست‌نویسی اختصاص دارد که حتی در Rust با تمام ویژگی‌های ایمنی‌اش، ضروری است.
فصل ۱۲ یک پروژه‌ی عملی برای پیاده‌سازی نسخه‌ای از ابزار خط فرمان grep ایجاد می‌کنیم که متن را درون فایل‌ها جستجو می‌کند. این فصل بسیاری از مفاهیم آموزش داده‌شده در فصل‌های قبل را به کار می‌گیرد.

فصل ۱۳ به بررسی Closures و Iterators می‌پردازد که ویژگی‌هایی از زبان‌های تابعی هستند.
فصل ۱۴ Cargo را عمیق‌تر بررسی کرده و بهترین روش‌های اشتراک‌گذاری کتابخانه‌ها را معرفی می‌کند.
فصل ۱۵ درباره‌ی اسمارت پوینترها (Smart Pointers) که در کتابخانه‌ی استاندارد Rust وجود دارند و تریت‌هایی که عملکرد آنها را ممکن می‌سازند صحبت می‌کند.

فصل ۱۶ مدل‌های مختلف برنامه‌نویسی همزمان (Concurrency) را بررسی کرده و نحوه‌ی مدیریت چندین ترد را در Rust آموزش می‌دهد.
فصل ۱۷ بر اساس مباحث فصل قبل، به بررسی ویژگی‌های async و await در Rust و مدل همزمانی سبک آنها می‌پردازد.

فصل ۱۸ مقایسه‌ای بین شیوه‌های رایج در Rust و اصول برنامه‌نویسی شی‌گرا ارائه می‌دهد.
فصل ۱۹ به بررسی الگوها (Patterns) و Pattern Matching در Rust می‌پردازد.
فصل ۲۰ شامل موضوعات پیشرفته‌ای مانند Rust ناامن (Unsafe Rust)، ماکروها (Macros) و مفاهیم تکمیلی درباره‌ی لایف‌تایم‌ها، تریت‌ها، انواع، توابع و Closures است.

فصل ۲۱ یک پروژه‌ی نهایی ارائه می‌دهد که در آن یک وب‌سرور چندنخی (Multithreaded Web Server) کم‌سطح را پیاده‌سازی می‌کنیم!

پیوست‌ها

برخی پیوست‌ها نیز در کتاب موجودند که اطلاعاتی مفید را به شکل مرجع ارائه می‌کنند:

  • پیوست A: کلمات کلیدی Rust
  • پیوست B: عملگرها و نمادهای Rust
  • پیوست C: تریت‌هایی که به صورت پیش‌فرض در Rust قابل اشتقاق هستند
  • پیوست D: ابزارهای مفید توسعه‌ی Rust
  • پیوست E: معرفی نسخه‌های مختلف Rust
  • پیوست F: ترجمه‌های کتاب
  • پیوست G: نحوه‌ی توسعه‌ی Rust و مفهوم Rust شبانه (Nightly Rust)

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

یادگیری از خطاها

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

Ferris به شما کمک می‌کند تا بفهمید کدام کدها کار نمی‌کنند:

Ferrisمعنی
Ferris با علامت سوالاین کد کامپایل نمی‌شود!
Ferris دستان خود را بالا گرفتهاین کد پَنیک می‌کند!
Ferris با یک چنگال بالا، شانه بالا انداختهاین کد رفتار مورد نظر را تولید نمی‌کند.

در اغلب موارد، ما شما را به نسخه‌ی صحیح کدهایی که کامپایل نمی‌شوند، هدایت خواهیم کرد.

کد منبع

فایل‌های منبعی که این کتاب از آنها تولید شده است، در GitHub قرار دارند.