از کد تا اجرا: اصولی که پشت معماری کامپیوترها قرار دارند

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

معماری کامپیوترلایه‌های انتزاعمعماری مجموعه دستورات

~5 دقیقه مطالعه · آخرین به‌روزرسانی ۱۵ شهریور ۱۴۰۵

معماری کامپیوتر دقیقاً چه چیزی را بررسی می‌کند

وقتی افراد اصطلاح Computer Architecture را می‌شنوند، معمولاً فقط اجزای فیزیکی یک ماشین را تصور می‌کنند. در واقعیت، این حوزه دو لایه به‌هم‌پیوسته را پوشش می‌دهد: Instruction Set Architecture (ISA) که واژگانی که یک پردازنده می‌فهمد را تعریف می‌کند، و Hardware Organization که پیاده‌سازی فیزیکی اجراکننده آن دستورات است.

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

هشت ایده بنیادین پشت پردازنده‌های امروزی

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

طراحی بر اساس قانون مور

Moore's Law بیان می‌کند که تعداد ترانزیستورهای روی یک تراشه تقریباً هر دو سال یک‌بار دو برابر می‌شود. طراحان سیستم‌ها را با این پیش‌بینی طراحی می‌کنند که سخت‌افزار آینده منابع بیشتری خواهد داشت، بنابراین تصمیمات طراحی امروز با در نظر گرفتن ظرفیت فردا گرفته می‌شود.

استفاده از انتزاع برای ساده‌سازی طراحی

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

سریع کردن حالت رایج

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

بهبود کارایی از طریق موازی‌سازی

Parallelism یعنی انجام همزمان چند عملیات به‌جای اجرای پشت‌سرهم آن‌ها. این ایده در همه سطوح دیده می‌شود، از اجرای همزمان چند دستور درون یک هسته تا اجرای هم‌زمان چند هسته یا چند ماشین در کنار هم.

بهبود کارایی از طریق پایپ‌لاینینگ

Pipelining مراحل اجرای چند دستور را هم‌پوشانی می‌کند، شبیه به یک خط تولید. در حالی که یک دستور در حال decode شدن است، دستور دیگری می‌تواند از قبل fetch شود و دستور سومی در حال اجرا باشد.

افزایش کارایی از طریق پیش‌بینی

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

سلسله‌مراتب حافظه

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

قابلیت اطمینان از طریق افزونگی

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

از کد منبع تا برنامه در حال اجرا

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

  • توسعه‌دهنده کد را با یک High-Level Language مانند C یا Java می‌نویسد، که به زبان انسان نزدیک و از جزئیات سخت‌افزار دور است.
  • یک Compiler این کد سطح بالا را به Assembly Language ترجمه می‌کند، که نمایشی نمادین از دستوراتی است که یک خانواده خاص از پردازنده می‌فهمد.
  • یک Assembler، زبان اسمبلی را به Machine Language تبدیل می‌کند، که شکل باینری‌ای است که سخت‌افزار واقعاً می‌خواند.
  • Operating System بارگذاری این کد ماشین در حافظه را مدیریت کرده و اجرای آن را در کنار سایر برنامه‌های در حال اجرا هماهنگ می‌کند.

مثالی از یک ایده واحد بیان‌شده در دو سطح متفاوت:

عبارت سطح بالا:
total = price + tax

دستور ساده‌شده مشابه اسمبلی:
ADD total, price, tax

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

چرا این ایده‌ها برای سیستم‌های امروزی اهمیت دارند

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

نوشته و پژوهش‌شده توسط دکتر شاهین صیامی

مقالات مرتبط

سخت‌افزار چگونه تقسیم انجام می‌دهد: خارج‌قسمت، باقیمانده و موارد خاص

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

ادامه

سخت‌افزار چگونه اعداد را ضرب می‌کند: از منطق ساده تا مدارهای واقعی

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

ادامه

سخت‌افزار چگونه جمع و تفریق انجام می‌دهد و سرریز را تشخیص می‌دهد

سخت‌افزار چگونه جمع و تفریق انجام می‌دهد و سرریز را تشخیص می‌دهد

ادامه

آرایه‌ها در مقابل اشاره‌گرها در سطح سخت‌افزار

در C، آرایه‌ها و اشاره‌گرها اغلب قابل‌تعویض به‌نظر می‌رسند، و بسیاری از برنامه‌نویسان با آن‌ها به‌عنوان یک چیز واحد رفتار می‌کنند. با این حال در سطح سخت‌افزار، آن‌ها به توالی‌های دستوری قابل‌توجهی متفاوت با ویژگی‌های کارایی متفاوت کامپایل می‌شوند. این مقاله این دو رویکرد را با استفاده از اسمبلی RISC-V مقایسه می‌کند تا دقیقاً نشان دهد چرا کد مبتنی بر اشاره‌گر اغلب سریع‌تر است.

ادامه

از کد منبع تا یک فرآیند در حال اجرا: ترجمه و یک مثال کامل مرتب‌سازی

تبدیل یک برنامه C به چیزی که سیستم‌عامل واقعاً بتواند اجرا کند شامل چندین مرحله ترجمه مجزاست، که هرکدام یک فایل میانی متفاوت تولید می‌کنند. این مقاله کل این خط لوله را از کامپایلر تا loader مرور می‌کند، سپس مفاهیم این فصل را روی یک مثال کامل و واقعی به‌کار می‌برد: ترجمه گام‌به‌گام یک روال مرتب‌سازی C به اسمبلی RISC-V.

ادامه

مدیریت آدرس‌های بزرگ و همگام‌سازی در RISC-V

یک دستور ۳۲ بیتی نمی‌تواند یک ثابت بزرگ یا یک آدرس حافظه دور را مستقیماً درون خودش جا دهد، و چند پردازنده‌ای که حافظه را به اشتراک می‌گذارند نمی‌توانند بدون هماهنگی، یک داده یکسان را با امنیت به‌روزرسانی کنند. این مقاله توضیح می‌دهد RISC-V چگونه مقادیر فوری و آدرس‌های بزرگ را از قطعات کوچک‌تر می‌سازد، و دستورات اتمیک چگونه اجازه می‌دهند برنامه‌های موازی با امنیت همگام شوند.

ادامه