Skip to content

Latest commit

 

History

History
325 lines (257 loc) · 34.2 KB

README_fa.md

File metadata and controls

325 lines (257 loc) · 34.2 KB

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

دانشگاه برنامه‌نویسی سطح پایین:

در چه مورد صحبت می‌کنیم؟

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

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

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


من برنامه‌نویسی سطح پایین را برنامه‌نویسی که به ماشین خیلی نزدیک است و از زبان‌های سطح پایین همچون سی و اسمبلی استفاده می‌کند تعریف می‌کنم. این با برنامه‌نویسی سطح بالا- که در اپلیکیشن‌های فضای کاربر متداول است و از زبان‌هایی چون پایتون و جاوا استفاده می‌کند- متفاوت است.

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

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

تئوری

دو تئوری زمینه‌ای در مورد برنامه‌نویسی سطح پایین وجود دارند:

  • معماری کامپیوتر
  • سیستم‌های عامل

فکر می‌کنم بهترین راه برای یادگیری تئوری شرکت در دوره‌های آموزشی است. خواندن کتاب راه بدی نیست ولی نیازمند زمان و تلاش زیادی است. شما می‌توانید کلاس‌های خوب زیادی در دانشگاه‌های آنلاین پیدا کنید. بعنوان مثال Coursera.org و edx.org. فکر نمی‌کنم نیازی به گرفتن نمره الف داشته باشید، فقط تصویر کلی را متوجه شوید. با کسب تجربه بهتر و بهتر خواهید شد.

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

  • معماری کامپیوتر

    • معماری کامپیوتر، چاپ پنجم: دیدگاه کمی
    • سیستم‌های کامپیوتری: از دید یک برنامه‌نویس
    • سازماندهی و طراحی کامپیوتر، جلد چهارم: رابط سخت‌افزار-نرم‌افزار
  • سیستم‌های عامل

    • توضیح باغ جادویی: درون یونیکس، سیستم ۵، چاپ۴، طراحی یک سیستم باز
    • طراحی سیستم عامل یونیکس
    • سیستم‌های عامل: اصول طراحی و اجزاء درونی توسط ویلیام استالینگ
  • دوره‌های آموزشی:

  • CS401: Operating Systems from saylor.org

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

زبان‌ها:

**اسمبلی:**یک اسمبلی از میان x86 یا ARM انتخاب کنید. نیازی به دانستن هر دو نیست، در مجموع نیازی به دانستن زبان اسمبلی نیست بلکه هدف درک ساختار درونی پردازشگر و کامپیوتر است. بنابراین نیازی نیست که اسمبلی جدیدترین پردازشگر را یاد بگیرید.از بین ۸۰۸۶ و Corex-M یکی را انتخاب کنید.

سخت‌افزار و ثابت‌افزار: اگر می‌خواهید مهندس سیستم‌های نهفته شوید شروع با یک کیت سخت‌افزاری ساده گزینه بهتری از جدیدترین تراشه ARM است.

  • کیت آغازین آردوئینو
    • سری‌های بسیاری از آردوئینو وجود دارند ولی کیت آغازین آردوئینو ساده‌ترین پردازشگر(Atmega328P) را داشته و کتاب راهنما هم دارد.
    • پردازشگر Atmega328P یک هسته هشت بیتی دارد که بستر مناسبی برای طراحی مدارهای دیجیتال و توسعه ثابت‌افزار فراهم می‌کند.
    • نیازی به دانستن طراحی شماتیک و اسمبل کردن تراشه نیست.
    • ولی باید بتوانید شماتیک‌ها را خوانده و متوجه شوید تراشه‌ها چگونه متصل می‌شوند.
    • توسعه‌دهندگان ثابت‌افزار باید بتوانند شماتیک‌ها را خوانده و بدانند چطور داده را به درایور مقصد بفرستند.
    • کتب راهنما را دنبال کنید.
  • راهنمای ۸۰۸۶
    • اگر در معماری 86× مبتدی هستید، ۸۰۸۶ نیز راهنمای خوبی برای معماری پردازشگر و اسمبلی ۸۶×۸۰ خواهد بود.
  • راهنمای ۸۰۳۸۶

در این مرحله باید بقدری پیشرفت کرده باشید که بتوانید پردازشگرهای ARM یا 86× را شروع کنید.

برای مثال بورد رسپ‌بری پای پردازشگری با کورتکس-a53 دارد که مجموعه دستورات ۶۴ بیت را ساپورت می‌کند. این به شما امکان آشنا شدن با پردازشگر مدرن RPi را می‌دهد. شما می‌توانید آنرا بخرید ولی می‌خواهید چه کاری با آن انجام دهید؟ اگر برنامه خاصی ندارید احتمالا آنرا همانند سایر وسایلی که احتمالا قبلا خریده‌اید در کشو انداخته و فراموش خواهید کرد. بنابراین من یک پروژه به شما پیشنهاد می‌کنم:

  • ساختن یک کرنل

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

    • (توصیف پروژه): این منبع حاوی یک راهنمای گام به گام است که نحوه ساختن هسته یک سیستم عامل ساده را از ابتدا نشان می‌دهد. هر مبحث طوری طراحی شده است که نشان می‌دهد که یک کارکرد هسته در سیستم عامل RPi چطور پیاده می‌شود و سپس نحوه عمل همان کارکرد در هسته لینوکس را نشان می‌دهد.

    من یک شبه هسته ساخته‌ام که مدل ۶۴ بیت، پیجینگ و جابجایی ساده موضوع را ساپورت می‌کند. ساختن چنین هسته‌ای کمک می‌کند تا با معماری کامپیوتر‌های نوین و کنترل سخت‌افزار آشنا شوید.

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

    سایر هسته‌ها:

    هسته لینوکس و درایور نیازی به ساختن یک سیستم عامل کامل ندارید.به انجمن لینوکس پیوسته و در توسعه آن شرکت کنید.

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

  • کتاب‌ها: این کتاب‌ها را به‌ترتیب بخوانید:
  • سایر منابع:منابع رایگانی که توصیه می‌کنم:
    • آزمایشگاه درایور‌های لینوکس.

      • راهنمای عملی و تمرینات عالی برای ساختن درایورهای لینوکس به‌همراه ای‌پی‌آی‌های ضروری هسته.
    • چالش یودوپتولا

      • متاسفانه این چالش اعضای جدیدی نمی‌پذیرد، چون چالش جدیدی وجود ندارد. نگهدارنده سایت گفته است که در حال کار بر روی یک فرمت جدید است. امیدوارم که شاهد بازگشت این چالش باشیم.

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

        • این پروژه هنوز کامل نشده است.
        • همواره بر این عقیده هستم که ساختن هسته‌ای مشابه هسته لینوکس بهترین راه برای یادگیری هسته لینوکس است.
      • لایه بلاک و درایور دستگاه:

        • از یک بلاک ساده درایور(مثلا رام‌دیسک) با مدل چند صفی شروع کنید.
        • جلوتر رفته و به لایه بلاک بروید.
        • ترجمه انگلیسی را تمام کردم، لطفا نظر خود را برایم بفرستید.
      • درایور ام‌دی برای لینوکس(کره‌ای)

        • ابزار mdadm چطور کار می‌کند و چطور درایورmd را فرامی‌خواند؟
        • درایور md چطور کار می‌کند؟

منابع

وقتی به چیزی نیاز دارید آنرا چک کنید.

  • صفحه الکترون آزاد

    سایر اپلیکیشن‌ها شاید شما به لینوکس و ثابت‌افزار علاقه نداشته باشید. در اینصورت می‌توانید اپلیکیشن‌های دیگری پیدا کنید:

    • برنامه‌نویسی سیستمی و درایور لینوکس.
    • ایمنی.
    • مهندسی معکوس. من درباره این اپلیکیشن‌ها اطلاعی ندارم. لطفا هر نوع اطلاعات مبتدی در این زمینه دارید برایم بفرستید.

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

آینده برنامه‌نویسی سطح پایین

درباره آینده چیزی نمی‌دانم ولی نگاهم را به راست(Rust) دوخته‌ام.

اگر یک هفته آزاد و تنها بودم، راست را یاد می‌گرفتم چون این تنها زبان جدیدیست که می‌توانم با آن درایور لینوکس بسازم.

یوت(IoT) شیوه جدیدی است, بنابراین می‌توانید بررسی کنید که چه سیستم‌های عاملی برای آن مناسب هستند.ARM، سامسونگ و برخی از کمپانی‌های دیگر سیستم‌های عامل بی‌درنگ خود را دارند ولی متاسفانه بسیاری از آنها منبع بسته هستند. ولی بنیاد لینوکس یک راه حل دارد: زفیر.

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

  • http://unikernel.org/ داده‌های بزرگ و رایانش ابری پیوسته نیاز به فضای ذخیره‌سازی بزرگ‌تری دارند. برخی از دیسک‌هایی که مستقیما به سرورها وصل هستند نمی‌توانند پاسخگوی ظرفیت، ثبات و عملکرد مورد نیاز باشند. بنابراین تحقیقاتی برای ایجاد سیستم‌های ذخیره‌سازی بسیار بزرگ انجام شده‌اند که ماشین‌های ذخیره‌سازی متعددی را توسط شبکه پرسرعت متصل می‌کنند. اینها در گذشته بر ساخت یک حجم ذخیره بسیار بزرگ متمرکز بودند ولی در حال حاضر حجم‌های متعددی که به ماشین‌های مجازی مختلفی اختصاص داده شده‌اند فراهم شده‌اند.
  • https://en.wikipedia.org/wiki/Software-defined_storage
  • https://en.wikipedia.org/wiki/Clustered_file_system
  • https://en.wikipedia.org/wiki/Ceph_(software)

چطور شروع کنیم؟

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

ترجمه

درباره مولف

از مطلب google-interview-university الهام گرفته‌ام. تمایل دارم تجاربم را به اشتراک بگذارم و راه تبدیل شدن به یک برنامه‌نویس سطح پایین را نشان دهم زیرا دریافته‌ام که این مهارت‌ها باندازه سابق محبوبیت ندارند. بعلاوه بسیاری از دانشجویان درباره اینکه چطور می‌توان یک مهندس هسته لینوکس شد می‌پرسند.

من بیش از ده سال تجربه در زمینه برنامه‌نویسی سطح پایین دارم:

  • اسمبلی ۸۶×۸۰
  • سخت‌افزار با تراشه و ثابت‌افزار Atmel
  • برنامه‌نویسی سیستمی سی برای لینوکس
  • درایور لینوکس
  • هسته لینوکس: تخصیص صفحه
  • هسته لینوکس: درایور بلاک و مودول ام‌دی