CISC چیست؟
از دستورهای پیچیده تا پردازندههای مدرن؛ CISC را از پایه بشناسیم
وقتی درباره معماری پردازندهها صحبت میکنیم، معمولاً خیلی زود به دو واژه RISC و CISC میرسیم. اما CISC دقیقاً چیست و چرا معماریهایی مثل x86 سالهاست در کامپیوترهای شخصی حضور دارند؟
CISC یعنی چه؟
CISC مخفف عبارت Complex Instruction Set Computer است.
ترجمه ساده آن میشود: «رایانه با مجموعه دستورهای پیچیده».
اما منظور از «پیچیده» چیست؟ یعنی در یک معماری CISC، مجموعه Instructionها میتواند دستورهایی داشته باشد که نسبت به یک دستور ساده RISC، عملیات بیشتری را در سطح ISA توصیف میکنند.
در CISC تلاش میشود CPU بتواند با دستورهای نسبتاً قدرتمند و متنوع، عملیات پیچیدهتری را مستقیماً از طریق Instruction Set بیان کند.
برای مثال، به جای اینکه برنامهنویس یا Compiler مجبور باشد یک عملیات را با چندین دستور ساده انجام دهد، ISA میتواند دستورهایی داشته باشد که بخش بزرگتری از عملیات را در یک Instruction بیان کنند.
CISC در مقابل RISC
حالا که RISC-V را در پست قبلی شناختیم، مقایسه این دو معماری خیلی جذاب میشود.
| ویژگی | RISC | CISC |
|---|---|---|
| نام کامل | Reduced Instruction Set Computer | Complex Instruction Set Computer |
| فلسفه کلی | دستورهای ساده و منظم | دستورهای متنوع و پیچیدهتر |
| پیچیدگی ISA | معمولاً کمتر | معمولاً بیشتر |
| طول دستور | اغلب منظمتر | میتواند متغیر باشد |
| نمونه معروف | RISC-V، ARM | x86 / x86-64 |
| طراحی Decoder | معمولاً سادهتر | معمولاً پیچیدهتر |
| تمرکز تاریخی | سادگی سختافزار و اجرای منظم | ارائه دستورهای قدرتمندتر |
CISC به معنی «CPU کند» و RISC به معنی «CPU سریع» نیست. این یک برداشت بیش از حد سادهشده است. پردازندههای مدرن x86 با وجود ISA پیچیده، از تکنیکهای بسیار پیشرفتهای مثل Pipeline، Out-of-Order Execution، Branch Prediction، Cache و Speculative Execution استفاده میکنند.
چرا اصلاً CISC به وجود آمد؟
برای درک CISC باید کمی به گذشته برگردیم.
در نسلهای اولیه پردازندهها، حافظه نسبتاً گران و محدود بود و Compilerها هم به اندازه امروز پیشرفته نبودند. در نتیجه یک ایده جذاب شکل گرفت:
اگر بتوانیم عملیات بیشتری را در قالب یک Instruction قرار دهیم، برنامه میتواند با تعداد کمتری Instruction نوشته شود و حجم کد کاهش پیدا کند.
به همین دلیل ISAها به مرور دستورهای بیشتری پیدا کردند؛ دستورهایی برای کار با حافظه، محاسبات، رشتهها، پرشها و عملیات مختلف.
در چنین شرایطی CISC یک رویکرد منطقی برای سختافزار آن زمان بود.
یک مثال ساده؛ عملیات پیچیدهتر در یک دستور
فرض کنید بخواهیم دادهای را از حافظه بخوانیم، روی آن عملیات انجام دهیم و نتیجه را در جای دیگری قرار دهیم.
در یک معماری Load/Store مانند بسیاری از طراحیهای RISC، معمولاً عملیات حافظه و عملیات ALU جدا میشوند.
اما در یک ISA با دستورهای پیچیدهتر، ممکن است دستورهایی وجود داشته باشند که ترکیب پیچیدهتری از دسترسی به حافظه و عملیات محاسباتی را بیان کنند.
نکته مهم این است که منظورمان یک دستور خاص و مشترک بین تمام پردازندههای CISC نیست؛ بلکه درباره فلسفه طراحی ISA صحبت میکنیم.
Instruction Length در CISC
یکی از ویژگیهای تاریخی مهم بسیاری از ISAهای CISC این است که طول Instruction میتواند متغیر باشد.
برای مثال در x86، دستورها میتوانند طولهای متفاوتی داشته باشند. این موضوع انعطافپذیری زیادی ایجاد میکند، اما Decode کردن دستورها را نیز پیچیدهتر میکند.
البته باید دقت کنیم که این موضوع یک ویژگی کلی و تاریخی از طراحی ISAهاست، نه اینکه هر RISC الزاماً همیشه ۳۲ بیت باشد یا هر CISC الزاماً دستور متغیر داشته باشد.
پس CPU چگونه یک دستور CISC را اجرا میکند؟
اینجا داستان جالب میشود.
ممکن است یک Instruction در سطح ISA بسیار پیچیده به نظر برسد، اما CPU مدرن لزوماً آن را مستقیماً به همان شکل در Data Path اجرا نمیکند.
در بسیاری از پردازندههای مدرن CISC، مخصوصاً x86، دستورهای معماری میتوانند در داخل CPU به عملیاتهای سادهتر داخلی تبدیل شوند. این عملیاتهای داخلی معمولاً با نامهایی مانند Micro-ops یا μops شناخته میشوند.
بنابراین نباید تصور کنیم که چون ISA یک CPU از نوع CISC است، تمام سختافزار داخلی آن هم الزاماً به همان اندازه «پیچیده و یکپارچه» است. در CPUهای مدرن، مرز بین ایده RISC و CISC در سطح پیادهسازی داخلی تا حدی پیچیده و ترکیبی شده است.
Microcode چیست؟
در معماریهای پیچیده، یکی از تکنیکهایی که از نظر تاریخی بسیار مهم بوده، Microcode است.
ایده ساده این است که به جای اینکه تمام رفتار یک Instruction پیچیده مستقیماً با منطق سختافزاری بسیار بزرگ پیادهسازی شود، میتوان بخشی از رفتار آن را با یک لایه کنترلی داخلی توصیف کرد.
به صورت مفهومی میتوان این رابطه را اینطور دید:
البته همه CPUهای مدرن CISC الزاماً یک مدل Microcode یکسان ندارند و جزئیات پیادهسازی داخلی هر پردازنده متفاوت است.
نمونه معروف CISC: معماری x86
وقتی درباره CISC صحبت میکنیم، مهمترین نمونهای که باید بشناسیم x86 است.
x86 یک ISA با سابقه طولانی است که ریشه آن به پردازنده Intel 8086 در سال ۱۹۷۸ برمیگردد. این ISA در طول سالها گسترش پیدا کرده و نسلهای مختلفی از پردازندهها از آن استفاده کردهاند.
امروزه نسخه ۶۴ بیتی آن را معمولاً با نامهایی مانند x86-64 یا AMD64 میبینیم.
یکی از دلایل جذاب بودن x86 این است که با وجود قدمت زیاد ISA، نسلهای جدید CPU میتوانند قابلیتهای مدرن بسیار پیشرفتهای را در پشت همان اکوسیستم نرمافزاری ارائه دهند.
CISC و پیچیدگی Decoder
حالا از دید طراحی سختافزار به موضوع نگاه کنیم.
CPU باید Instruction را دریافت کند و بفهمد:
- این چه نوع دستوری است؟
- Operandها کجا هستند؟
- آیا دستور با Memory کار میکند؟
- چه Registerهایی باید خوانده شوند؟
- چه واحد اجرایی باید فعال شود؟
- نتیجه کجا باید نوشته شود؟
هرچه Instruction Set پیچیدهتر و متنوعتر باشد، طراحی بخش Decode و Control نیز میتواند پیچیدهتر شود.
Addressing Mode چیست و چرا در CISC مهم است؟
یکی از مفاهیم مهم هنگام مطالعه CISC، Addressing Mode یا «روش آدرسدهی» است.
Addressing Mode مشخص میکند CPU چگونه Operand موردنظر را پیدا کند.
مثلاً Operand ممکن است:
- داخل خود Instruction باشد؛ Immediate
- داخل یک Register باشد؛ Register Addressing
- در یک آدرس حافظه مشخص باشد؛ Memory Addressing
- با ترکیبی از Register و Offset محاسبه شود.
ISAهای CISC تاریخی معمولاً Addressing Modeهای متنوعی داشتهاند. این قابلیت انعطافپذیری زیادی ایجاد میکند، اما Decode و اجرای Instruction را نیز میتواند پیچیدهتر کند.
CISC در برابر RISC؛ یک مثال مفهومی
فرض کنید میخواهیم عملیاتی نسبتاً پیچیده روی دادهای در حافظه انجام دهیم.
در یک طراحی RISC/Load-Store، معمولاً مراحل را از هم جدا میکنیم:
در یک ISA CISC ممکن است دستورهایی وجود داشته باشند که ترکیبهای پیچیدهتری از این عملیات را در یک Instruction معماری بیان کنند.
اما نکته بسیار مهم این است: تعداد Instructionها به تنهایی معیار مناسبی برای مقایسه عملکرد دو CPU نیست.
برای بررسی عملکرد باید مواردی مانند CPI، Clock Frequency، Pipeline، Cache، Branch Prediction، Execution Width و بسیاری عوامل دیگر را نیز در نظر گرفت.
CPI چیست؟
یکی از معیارهای مهم در Computer Architecture، Cycles Per Instruction یا CPI است.
مثلاً اگر CPU برای اجرای ۱۰۰ Instruction به ۲۰۰ Cycle نیاز داشته باشد:
اما حتی این عدد نیز به تنهایی برای مقایسه دو معماری کافی نیست. چون فرکانس، تعداد Instructionهای برنامه و معماری داخلی CPU نیز اهمیت دارند.
یک نکته مهمتر: تعداد Instruction ≠ سرعت
فرض کنیم برنامه A با ۱۰۰ دستور اجرا شود و برنامه B با ۵۰ دستور. آیا B حتماً سریعتر است؟
خیر.
اگر CPU دوم برای هر Instruction به Cycleهای بیشتری نیاز داشته باشد، ممکن است با وجود Instruction کمتر، زمان اجرای بیشتری داشته باشد.
و چون:
پس برای بررسی Performance باید مجموعه عوامل را با هم ببینیم.
آیا CISC امروز هنوز واقعاً CISC است؟ 🤯
اینجا یکی از جذابترین بخشهای داستان است.
اگر یک CPU مدرن x86 را باز کنیم، از نظر ISA با یک معماری CISC مواجه هستیم، اما داخل CPU ممکن است دستورها به عملیاتهای سادهتر داخلی تبدیل شوند.
به همین دلیل گاهی گفته میشود:
ممکن است یک CPU از نظر ISA CISC باشد، اما از نظر Microarchitecture داخلی، بخش زیادی از عملیات را با ساختاری بسیار منظمتر و شبیه ایدههای RISC اجرا کند.
پس باید همیشه بین دو مفهوم تفاوت بگذاریم:
| مفهوم | معنی |
|---|---|
| ISA | قرارداد بین نرمافزار و سختافزار |
| Microarchitecture | نحوه پیادهسازی ISA در داخل CPU |
ISA و Microarchitecture را قاطی نکنیم!
این دو مفهوم یکی از مهمترین پایههای Computer Architecture هستند.
مثلاً:
- x86-64 یک ISA است.
- یک CPU مشخص Intel یا AMD یک پیادهسازی سختافزاری از این ISA است.
- جزئیاتی مانند تعداد Pipeline Stageها، Cacheها، Execution Unitها و نحوه Decode به Microarchitecture مربوط میشوند.
این تفکیک برای فهم RISC-V هم بسیار مهم است. RISC-V نیز خودش یک Microarchitecture مشخص نیست؛ بلکه ISA است.
ارتباط CISC با RTL و FPGA
اگر بخواهیم یک CPU CISC را در سطح RTL با Verilog طراحی کنیم، با چالشهای بیشتری نسبت به یک CPU آموزشی ساده RISC مواجه میشویم.
بسته به ISA موردنظر ممکن است مجبور شویم مواردی مانند:
- Instruction Decoder پیچیدهتر
- Instruction Length متغیر
- Addressing Modeهای متعدد
- Control Logic پیچیدهتر
- Memory Operandها
- Instructionهای چندمرحلهای
را مدیریت کنیم.
به همین دلیل برای پروژههای آموزشی FPGA معمولاً یک ISA سادهتر مثل RISC-V نقطه شروع بسیار مناسبی است.
اگر هدف شما این باشد که از صفر یک CPU طراحی کنید، ابتدا میتوانید یک CPU ساده RV32I بسازید. بعد از درک کامل Datapath و Control Unit، مفاهیم پیچیدهتر Microarchitecture را بررسی کنید.
مزایا و چالشهای CISC
| موضوع | توضیح |
|---|---|
| Instructionهای قدرتمند | برخی عملیاتهای پیچیده میتوانند در سطح یک Instruction بیان شوند. |
| کاهش حجم برخی برنامهها | یک Instruction ممکن است کاری را انجام دهد که در ISA سادهتر به چند دستور نیاز داشته باشد. |
| انعطافپذیری ISA | Addressing Modeها و Instructionهای متنوع امکانات زیادی ایجاد میکنند. |
| Decoder پیچیده | تنوع Instructionها میتواند Decode را دشوارتر کند. |
| پیادهسازی پیچیدهتر | کنترل و اجرای Instructionهای متنوع نیازمند طراحی پیچیدهتری است. |
| سازگاری نرمافزاری | ISAهای قدیمی مانند x86 اکوسیستم بسیار بزرگی ایجاد کردهاند. |
چند تصور اشتباه درباره CISC
❌ CISC یعنی کند
خیر. سرعت CPU فقط به نوع ISA وابسته نیست. Microarchitecture مدرن نقش بسیار بزرگی در Performance دارد.
❌ RISC همیشه بهتر از CISC است
چنین نتیجهای از تعریف RISC و CISC به دست نمیآید. هر دو رویکرد در طول تاریخ مزایا و محدودیتهای خودشان را داشتهاند و پردازندههای مدرن بسیار پیچیدهتر از این دو برچسب ساده هستند.
❌ هر دستور CISC حتماً چندین Cycle طول میکشد
این نیز یک سادهسازی نادرست است. رفتار دقیق به ISA و Microarchitecture پردازنده بستگی دارد.
❌ CISC فقط یعنی دستورهای طولانی
خیر. پیچیدگی CISC فقط مربوط به طول Instruction نیست؛ تنوع عملیات، Addressing Modeها، نحوه دسترسی به Memory و ساختار ISA نیز اهمیت دارند.
RISC و CISC؛ جنگی که کمی پیچیدهتر از چیزی است که فکر میکنیم!
در کتابهای مقدماتی ممکن است تصویر سادهای ببینیم:
اما دنیای واقعی اینقدر ساده نیست.
یک CPU مدرن میتواند ISA پیچیدهای داشته باشد، اما در داخل از Pipelineهای عمیق، Micro-op، Out-of-Order Execution، Register Renaming، Branch Prediction و Execution Unitهای متعدد استفاده کند.
از طرف دیگر، یک ISA نسبتاً ساده نیز میتواند روی Microarchitecture بسیار قدرتمندی پیادهسازی شود.
وقتی درباره RISC و CISC صحبت میکنیم، اول باید مشخص کنیم درباره ISA حرف میزنیم یا درباره Microarchitecture. این تفکیک جلوی بسیاری از سوءتفاهمهای رایج در Computer Architecture را میگیرد.
جمعبندی
CISC مخفف Complex Instruction Set Computer است و به رویکردی در طراحی Instruction Set اشاره میکند که در آن Instructionهای متنوع و نسبتاً پیچیدهتری وجود دارند.
معماری x86/x86-64 معروفترین نمونه امروزی این خانواده است.
در CISC، یک Instruction میتواند عملیات بیشتری را در سطح ISA بیان کند و ISA ممکن است Addressing Modeها و قالبهای متنوعی داشته باشد.
اما در پردازندههای مدرن، Instructionهای CISC میتوانند داخل CPU به عملیاتهای داخلی سادهتر مانند μops تبدیل شوند. بنابراین نباید ISA را با Microarchitecture یکی بدانیم.
و مهمتر از همه: RISC و CISC را نباید به شکل «خوب و بد» یا «سریع و کند» در نظر گرفت. اینها دو رویکرد تاریخی و معماری برای طراحی ISA هستند و عملکرد واقعی CPU به عوامل بسیار بیشتری بستگی دارد.
مسیر یادگیری بعد از CISC و RISC
حالا دو مفهوم مهم را کنار هم داریم: RISC و CISC. قدم بعدی این است که ببینیم یک ISA چگونه واقعاً توسط CPU اجرا میشود.
مبحث بعدی چیست؟
حالا سؤال جذاب بعدی این است:
اگر یک CPU از ISA پیچیدهای مثل x86 استفاده کند، اما داخل خودش Instructionها را به Micro-opهای سادهتر تبدیل کند، آیا از نظر Microarchitecture واقعاً میتوانیم آن را «کاملاً CISC» بدانیم؟
برای پاسخ دقیق به این سؤال باید برویم سراغ یکی از مهمترین مفاهیم Computer Architecture: Microarchitecture و Datapath.
📚 منابع و مطالعه بیشتر
- Wikipedia — Complex instruction set computer (CISC)
- Wikipedia — x86 Architecture
- Wikipedia — Microcode
- Intel® 64 and IA-32 Architectures Software Developer Manuals
- AMD Developer Guides & Manuals (AMD64)
- Wikipedia — Reduced instruction set computer (RISC)
- Computer Architecture: A Quantitative Approach — Hennessy & Patterson
- UC Berkeley CS61C — Great Ideas in Computer Architecture
دستهبندی: Computer Architecture، CPU، CISC، RISC، ISA، x86، Digital Design، RTL، FPGA
برچسبها: #CISC #RISC #RISC_V #ComputerArchitecture #CPU #ISA #x86 #x86_64 #Microarchitecture #RTL #Verilog #FPGA #معماری_کامپیوتر #پردازنده