Ek hi cheez ke do naam kyun? Binary 10110000 01100001 ko humans padhna impossible hai. Assembly ise ek mnemonic deta hai (MOV AL, 0x61). Wahi instruction, alag representation — jaise "thirteen" likhne ke barabar "13" ya "1101" likhna.
CPU English nahi padh sakta. Toh hume "register 2 aur register 3 ko add karo, register 1 mein store karo" ko bits mein encode karna hoga. Aao hum aisi ek encoding design karein taaki koi magic nahi dikhe.
Step 1 — Bits CPU ko kya batani chahiye?
KAUN si operation? (add / sub / load / jump…) → ise opcode kaho.
KAUN sa data use karna hai? → operands (registers, ya ek constant, ya ek memory address).
Yeh step kyun? Har instruction bas "Y ke saath X karo" hai — opcode = X, operands = Y.
Step 2 — Bits allocate karo. Maan lo hamare toy CPU mein:
8 possible operations → opcode ke liye ⌈log28⌉=3 bits chahiye.
4 registers → har register ko name karne ke liye ⌈log24⌉=2 bits chahiye.
log2 kyun?n bits se tum 2n alag cheezein label kar sakte ho, toh k cheezein label karne ke liye n≥log2k chahiye.
Woh akela binary word 010 01 10 11hi machine code hai. Assembler ne ise text ADD R1, R2, R3 se produce kiya. CPU ise padhta hai aur wiring addition karta hai.
PC kyun? Programs memory mein sirf lists hain. Kuch toh "hum kahan hain?" yaad rakhna chahiye — woh PC hai. Ek jump instruction sirf PC mein ek naya value likhta hai, yahi wajah hai ki if/loops/functions bottom level par exist karte hain.
C source Python source
│ compiler │ interpreter (CPython)
▼ ▼
Assembly (MOV, ADD, JMP) Python bytecode ──► VM loop runs each
│ assembler (runs on a virtual machine, not the CPU directly)
▼ │
Machine code (raw bytes) ◄──────┘ (the VM itself is machine code)
│ CPU hardware
▼
Electrons / logic gates ← physics
Compiler (C, Rust, etc.): high-level language → assembly, ahead of time (mushkil creative kaam karta hai: loops, types, optimization).
Interpreter (standard/CPython): tumhara Python native assembly mein nahi badalta. Pehle tumhara .py portable bytecode mein compile karta hai, phir interpreter ke andar ek loop (the virtual machine) har bytecode op execute karta hai. Interpreter program khud woh machine code hai jo CPU chalata hai.
Assembler: assembly → machine code. Yeh sirf ek opcode lookup nahi hai — yeh label resolution bhi karta hai (ADDR1 ko real address mein badalna), relocation (taaki code memory mein kahin bhi rakha ja sake), macro expansion, aur directive handling.
Ek robot ki kalpana karo jo sirf numbered commands samajhta hai cards par likhe hue: "1 = utha lo", "2 = baayein jao", "3 = gira do". Tum uske liye ek kahani likhte ho numbers wale cards ki stack ke roop mein. Woh numbers machine code hain. Kyunki numbers yaad rakhna mushkil hai, tum ek cheat-sheet bhi rakhte ho jo kehta hai "PICKUP = 1, LEFT = 2" — un words ke saath apni kahani likhna assembly hai. Robot ke paas current card par ek ungli pointing hai (Program Counter); woh card padhta hai, karta hai, phir agle card par ungli move karta hai — jab tak koi card na kahe "card 2 par wapis jaao", yahi wajah hai ki yeh cheezein repeat kar sakta hai. C ke saath, ek translator tumhari poori kahani number-cards mein robot ke shuru hone se pehle badal deta hai. Python ke saath, ek helper robot (the interpreter) tumhari kahani ek line at a time padhta hai aur tumhare liye sahi buttons press karta hai — woh helper robot khud number-cards se bana hai.
Binary-encoded instructions jo CPU directly execute karta hai; har ek ek number hai = opcode + operands.
Assembly language kya hai?
Machine code ka human-readable, ~1-to-1 textual representation, jo assembler dwara bytes mein badla jaata hai.
Kya standard Python C ki tarah native assembly mein compile hota hai?
Nahi. CPython portable bytecode mein compile karta hai jise ek interpreter (virtual machine) phir execute karta hai; yeh native CPU assembly mein nahi badla jaata.
Assembler opcode→bits lookup se pare kya karta hai?
Compiler: source ko machine code mein ahead of time translate karta hai. Interpreter: ek pre-built program jo tumhara source (often bytecode ke zariye) run time par padhta aur execute karta hai.
Machine instruction ke do hisse kya hote hain?
Opcode (kaun si operation) aur operands (kaun sa data/registers/constants).
k items mein se ek select karne ke liye kitne bits chahiye?
⌈log₂ k⌉ bits.
16 possible operations wale opcode ko encode karne ke liye kitne bits?
⌈log₂16⌉ = 4 bits.
CPU ke main loop ke steps kya hain?
Fetch, Decode, Execute, Advance (PC update karo).
Program Counter (PC) kya hai?
Ek register jo fetch karne wali next instruction ka address hold karta hai.
Machine level par loop kaise exist karta hai?
Ek conditional jump PC mein ek naya (purana) address likhta hai, cycle repeat karta hai.
ISA kya hai?
Instruction Set Architecture — woh convention jo define karta hai har machine-code bit pattern ka matlab kya hai (jaise x86, ARM, RISC-V).
Same byte alag CPUs par alag cheez kyun matlab rakhta hai?
Kyunki matlab har CPU ke ISA se define hota hai, binary se universally nahi.
Immediate constant size kyun limited ho sakta hai?
Uske bit field ki fixed width hoti hai; jis value ko field se zyada bits chahiye usse encode nahi kar sakte.
Compiled ya interpreted, CPU ko ultimately kya touch karta hai?
Sirf machine code — ya toh compiler dwara ahead of time emit kiya gaya ya interpreter program ke zariye, jo khud machine code hai.