LEVEL 5
কম্পাইলার
Compilers
এই মডিউল যে প্রশ্নের উত্তর দেয়একটা text file কীভাবে চলমান machine code হয়ে ওঠে?
Compiler হলো CS-এর সবচেয়ে সুন্দর pipeline-গুলোর একটা। এখানে আমরা পুরোটা নিজে বানাব — lexer থেকে code generation পর্যন্ত। এরপর আপনি আর কোনো compiler-কে black box মনে করবেন না।
লেসন
- 01Compiler Pipeline — text থেকে machine code: পুরো ম্যাপgcc hello.c-এর ভেতরে preprocess → lex → parse → semantic → IR → optimize → codegen → assemble → link — পুরো pipeline-এর ম্যাপ, আর প্রতিটা stage-এর আউটপুট নিজ হাতে দেখা।
- 02Lexical Analysis — character stream থেকে token streamSource text-কে অর্থপূর্ণ শব্দে ভাগ করার প্রথম compiler stage — token, maximal munch, DFA, আর নিজের হাতে লেখা পুরো Lexer class।
- 03Grammar ও Ambiguity — BNF, derivation, আর দ্ব্যর্থক বাক্যToken stream-কে structure দেওয়ার formal ভাষা — grammar; আর grammar-এর সবচেয়ে বিপজ্জনক ফাঁদ ambiguity চেনা ও নির্মূল করা।
- 04Parsing — recursive descent, Pratt, আর LR-এর ছায়াGrammar থেকে running parser — hand-written recursive descent আর Pratt parsing-এর practical mastery, পেছনে LR-এর theory।
- 05AST Design — tree-টা নিজেই একটা data structure design সমস্যাParse tree থেকে compiler-এর মূল data structure — node taxonomy, variant encoding, spans, আর round-tripping pretty-printer।
- 06Semantic Analysis — syntax ঠিক, অর্থ ভুল ধরাParse হওয়া tree-তে অর্থের প্রথম ছোঁয়া — symbol table, scoping, name resolution আর precise diagnostics।
- 07Type Checking — checker আসলে একটা ছোট evaluatorAST walk করে প্রতিটা expression-এর type গণনা — signature table, coercion ladder, আর six failing programs-এ যাচাই।
- 08Intermediate Representation — TAC, SSA, আর কেন একটা মাঝের ভাষা দরকারCompiler-এর মূল ভাষায় প্রবেশ — tree-কে linear three-address code-এ flatten, SSA-র গণিত, আর নিজের হাতে প্রথম lowering।
- 09Control Flow Graph ও Dataflow Analysis — প্রবাহের উপর গণিতকম্পাইলার প্রোগ্রামকে basic block-এর একটা গ্রাফে (CFG) ভেঙে সেই গ্রাফের উপর সেট-ভিত্তিক গণিত চালিয়ে জানে ঠিক কোথায় কোন মান বাঁচা আছে — এটাই প্রতিটা global optimization-এর ভিত্তি।
- 10Optimization — কোনটা safe, কোনটা profitable, কোনটা fastপ্রতিটা optimization একই চুক্তির উপর দাঁড়ায় — semantics অটুট রেখে সত্যিই দ্রুত করা — আর সেই চুক্তির প্রতিটা clause-এর একটা লুকানো ব্যতিক্রম আছে।
- 11Register Allocation — অসীম temporary, সসীম registerIR-এর অসীম temporary-দের সসীম x86-64 register-এ ফেটে পড়াটাই graph coloring — যেখানে রঙ না মিললে মান স্ট্যাকে ঠেলে দিতে হয়।
- 12Instruction Selection ও Scheduling — IR থেকে আসল instructionএক IR op-এর জন্য ISA-য় হাজারো encoding — selection ঠিক করে কোনটা, scheduling ঠিক করে কোন ক্রমে; এই শেষ মাইলেই machine code গড়ে ওঠে।
- 13Code Generation — শেষ ধাপে সিলিকনের ভাষায় অনুবাদRegister allocation শেষ হলে code generator টার্গেট ISA-র প্রকৃত instruction লেখে — frame layout ঠিক করে, prologue/epilogue emit করে, calling convention মেনে — আর এই লেসনে আমরা toy compiler-এর পুরো ধাপটা হাতে করে করে দেখি।
- 14Linking ও Relocation — ভাঙা address জোড়া লাগানোপ্রতিটা .o ফাইল নিজের ভেতরের ঠিকানা জানে কিন্তু বাইরের প্রতিটা symbol-এর জায়গায় ফাঁকা ঘর রাখে — linker symbol resolution আর relocation-এর মাধ্যমে সেই ভাঙা ঠিকানাগুলো চূড়ান্ত মান দিয়ে জোড়া লাগায়।
- 15Loader ও Dynamic Linker — ./a.out টাইপ করলে kernel আর ld.so কী করে./a.out টাইপ করা আর main()-এর প্রথম লাইনের মধ্যে দুইজন অভিনেতা কাজ করে — kernel execve-তে PT_LOAD segment গুলো মেমরিতে বসায়, তারপর PT_INTERP নির্দেশিত dynamic linker লাইব্রেরি জোগাড় করে বাকি relocation সারায়।
- 16JIT Compilation — bytecode থেকে native, চলতে চলতেJIT compiler runtime-এর ভেতরেই থাকা একটা compiler — interpreter চলতে চলতে profile জমায়, hot কোডে speculation-ভিত্তিক native code বানায়, ভুল হলে deoptimize করে — আর এই লেসনে আপনি একটা কাজ করা micro-JIT নিজেই লিখবেন।
যা যা থাকছে
- Compiler pipeline overview
- Lexical analysis, regular languages, DFA construction
- Parsing — recursive descent, LL, LR, Pratt
- Grammars, ambiguity, precedence
- AST design
- Semantic analysis, symbol tables, scoping
- Type checking ও type errors
- Intermediate representation — three-address code, SSA
- Control flow graph ও dataflow analysis
- Optimizations — constant folding, DCE, CSE, inlining, loop opts
- Register allocation (graph coloring, linear scan)
- Instruction selection ও scheduling
- Code generation
- Linking — static, dynamic, relocation, symbol resolution
- Loading ও dynamic linker
- JIT compilation
প্রজেক্ট
Lexer + Pratt Parser
●●●○○Expression language-এর precedence-correct parser।
Bytecode VM
●●●●○Stack machine, compiler থেকে bytecode, dispatch loop।
Full Toy Compiler
●●●●●নিজের ভাষা → x86-64 assembly → চলমান binary।