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 را در پست قبلی شناختیم، مقایسه این دو معماری خیلی جذاب می‌شود.

ویژگیRISCCISC
نام کاملReduced Instruction Set ComputerComplex Instruction Set Computer
فلسفه کلیدستورهای ساده و منظمدستورهای متنوع و پیچیده‌تر
پیچیدگی ISAمعمولاً کمترمعمولاً بیشتر
طول دستوراغلب منظم‌ترمی‌تواند متغیر باشد
نمونه معروفRISC-V، ARMx86 / 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 جدا می‌شوند.

LOAD R1, [A] ADD R1, R2 STORE [B], R1

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

نکته مهم این است که منظورمان یک دستور خاص و مشترک بین تمام پردازنده‌های CISC نیست؛ بلکه درباره فلسفه طراحی ISA صحبت می‌کنیم.

Instruction Length در CISC

یکی از ویژگی‌های تاریخی مهم بسیاری از ISAهای CISC این است که طول Instruction می‌تواند متغیر باشد.

برای مثال در x86، دستورها می‌توانند طول‌های متفاوتی داشته باشند. این موضوع انعطاف‌پذیری زیادی ایجاد می‌کند، اما Decode کردن دستورها را نیز پیچیده‌تر می‌کند.

طول Instruction RISC 32 bit 32 bit 32 bit معمولاً منظم‌تر CISC 8B 15B 5B می‌تواند متغیر باشد

البته باید دقت کنیم که این موضوع یک ویژگی کلی و تاریخی از طراحی ISAهاست، نه اینکه هر RISC الزاماً همیشه ۳۲ بیت باشد یا هر CISC الزاماً دستور متغیر داشته باشد.

پس CPU چگونه یک دستور CISC را اجرا می‌کند؟

اینجا داستان جالب می‌شود.

ممکن است یک Instruction در سطح ISA بسیار پیچیده به نظر برسد، اما CPU مدرن لزوماً آن را مستقیماً به همان شکل در Data Path اجرا نمی‌کند.

در بسیاری از پردازنده‌های مدرن CISC، مخصوصاً x86، دستورهای معماری می‌توانند در داخل CPU به عملیات‌های ساده‌تر داخلی تبدیل شوند. این عملیات‌های داخلی معمولاً با نام‌هایی مانند Micro-ops یا μops شناخته می‌شوند.

CISC Instruction Decode Translation به عملیات داخلی μops ALU Load / Store Branch Execution Units در بسیاری از CPUهای مدرن CISC، پیچیدگی ISA می‌تواند به عملیات‌های داخلی ساده‌تر ترجمه شود.
🧠 این نکته خیلی مهم است

بنابراین نباید تصور کنیم که چون ISA یک CPU از نوع CISC است، تمام سخت‌افزار داخلی آن هم الزاماً به همان اندازه «پیچیده و یکپارچه» است. در CPUهای مدرن، مرز بین ایده RISC و CISC در سطح پیاده‌سازی داخلی تا حدی پیچیده و ترکیبی شده است.

Microcode چیست؟

در معماری‌های پیچیده، یکی از تکنیک‌هایی که از نظر تاریخی بسیار مهم بوده، Microcode است.

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

به صورت مفهومی می‌توان این رابطه را این‌طور دید:

Instruction → Decoder → Microcode / Control → Datapath

البته همه 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 نیز می‌تواند پیچیده‌تر شود.

Instruction Bytes Complex Decoder Opcode Addressing Mode Operands Control Signals Execution Units / μops Decode پیچیده یکی از چالش‌های تاریخی ISAهای CISC بوده است.

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، معمولاً مراحل را از هم جدا می‌کنیم:

LOAD x5, [address] ADD x7, x5, x6 STORE [address2], x7

در یک ISA CISC ممکن است دستورهایی وجود داشته باشند که ترکیب‌های پیچیده‌تری از این عملیات را در یک Instruction معماری بیان کنند.

اما نکته بسیار مهم این است: تعداد Instructionها به تنهایی معیار مناسبی برای مقایسه عملکرد دو CPU نیست.

برای بررسی عملکرد باید مواردی مانند CPI، Clock Frequency، Pipeline، Cache، Branch Prediction، Execution Width و بسیاری عوامل دیگر را نیز در نظر گرفت.

CPI چیست؟

یکی از معیارهای مهم در Computer Architecture، Cycles Per Instruction یا CPI است.

CPI = تعداد Cycleهای پردازنده ÷ تعداد Instructionهای اجراشده

مثلاً اگر CPU برای اجرای ۱۰۰ Instruction به ۲۰۰ Cycle نیاز داشته باشد:

CPI = 200 ÷ 100 = 2

اما حتی این عدد نیز به تنهایی برای مقایسه دو معماری کافی نیست. چون فرکانس، تعداد Instructionهای برنامه و معماری داخلی CPU نیز اهمیت دارند.

یک نکته مهم‌تر: تعداد Instruction ≠ سرعت

فرض کنیم برنامه A با ۱۰۰ دستور اجرا شود و برنامه B با ۵۰ دستور. آیا B حتماً سریع‌تر است؟

خیر.

اگر CPU دوم برای هر Instruction به Cycleهای بیشتری نیاز داشته باشد، ممکن است با وجود Instruction کمتر، زمان اجرای بیشتری داشته باشد.

Execution Time = Instruction Count × CPI × Clock Cycle Time

و چون:

Clock Cycle Time = 1 ÷ Clock Frequency

پس برای بررسی Performance باید مجموعه عوامل را با هم ببینیم.

آیا CISC امروز هنوز واقعاً CISC است؟ 🤯

اینجا یکی از جذاب‌ترین بخش‌های داستان است.

اگر یک CPU مدرن x86 را باز کنیم، از نظر ISA با یک معماری CISC مواجه هستیم، اما داخل CPU ممکن است دستورها به عملیات‌های ساده‌تر داخلی تبدیل شوند.

به همین دلیل گاهی گفته می‌شود:

🧠 نکته عمیق

ممکن است یک CPU از نظر ISA CISC باشد، اما از نظر Microarchitecture داخلی، بخش زیادی از عملیات را با ساختاری بسیار منظم‌تر و شبیه ایده‌های RISC اجرا کند.

پس باید همیشه بین دو مفهوم تفاوت بگذاریم:

مفهوممعنی
ISAقرارداد بین نرم‌افزار و سخت‌افزار
Microarchitectureنحوه پیاده‌سازی ISA در داخل CPU

ISA و Microarchitecture را قاطی نکنیم!

این دو مفهوم یکی از مهم‌ترین پایه‌های Computer Architecture هستند.

Program → ISA → Microarchitecture → Hardware

مثلاً:

  • 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 نقطه شروع بسیار مناسبی است.

🔧 از دید پروژه FPGA

اگر هدف شما این باشد که از صفر یک CPU طراحی کنید، ابتدا می‌توانید یک CPU ساده RV32I بسازید. بعد از درک کامل Datapath و Control Unit، مفاهیم پیچیده‌تر Microarchitecture را بررسی کنید.

مزایا و چالش‌های CISC

موضوعتوضیح
Instructionهای قدرتمندبرخی عملیات‌های پیچیده می‌توانند در سطح یک Instruction بیان شوند.
کاهش حجم برخی برنامه‌هایک Instruction ممکن است کاری را انجام دهد که در ISA ساده‌تر به چند دستور نیاز داشته باشد.
انعطاف‌پذیری ISAAddressing 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؛ جنگی که کمی پیچیده‌تر از چیزی است که فکر می‌کنیم!

در کتاب‌های مقدماتی ممکن است تصویر ساده‌ای ببینیم:

RISC = ساده VS 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 یکی بدانیم.

ISA ≠ Microarchitecture

و مهم‌تر از همه: RISC و CISC را نباید به شکل «خوب و بد» یا «سریع و کند» در نظر گرفت. این‌ها دو رویکرد تاریخی و معماری برای طراحی ISA هستند و عملکرد واقعی CPU به عوامل بسیار بیشتری بستگی دارد.

مسیر یادگیری بعد از CISC و RISC

حالا دو مفهوم مهم را کنار هم داریم: RISC و CISC. قدم بعدی این است که ببینیم یک ISA چگونه واقعاً توسط CPU اجرا می‌شود.

Digital Logic → CPU Basics → ISA → RISC / CISC → Datapath → Control Unit → Pipeline → RTL / Verilog → FPGA

مبحث بعدی چیست؟

حالا سؤال جذاب بعدی این است:

🤔 سؤال

اگر یک CPU از ISA پیچیده‌ای مثل x86 استفاده کند، اما داخل خودش Instructionها را به Micro-opهای ساده‌تر تبدیل کند، آیا از نظر Microarchitecture واقعاً می‌توانیم آن را «کاملاً CISC» بدانیم؟

برای پاسخ دقیق به این سؤال باید برویم سراغ یکی از مهم‌ترین مفاهیم Computer Architecture: Microarchitecture و Datapath.

📚 منابع و مطالعه بیشتر

دسته‌بندی: 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 #معماری_کامپیوتر #پردازنده