Compiler Design In Bangla
Language Processing System
HLL – High Level Language
Pre-Processor Modified Source Code / Pure HLL
Compile Time Compiler
Assembler Relocated Machine Code (Objected Code/Binary file)
Linker Library Files Object Files
Loader Target Machine Code (Executable Code / . exe )
Memory Executable Time/Run Time

Compiler

Higher level language ( Example: C, C++, Java ) কে Lower Level language এ Convert করে থাকে । সাধারণত Compiler Translator হিসেবে কাজ করে থাকে।

Pre – Processor

Pre processor – এর কাজ সাধারণত ২টি ।

1.File Inclusion

File Inclusion সাধারণত আমাদের ব্যবহার করা source code এর হ্যাশ #include থাকা tag remove করে দেই। যেমন:

2. Macro Processing

আমরা আমাদের Source Code গুলোতে সাধারনত অনেক সময় define use করে থাকি একটি variable কে অনেক জায়গায় ব্যবহার করবার জন্য। Macro Processing সাধারনত সেই হ্যাশ #define variable কে remove করে থাকে এবং Pre-Processing সেটাকে modified source code / Pure High level Language এ পরির্রতন করে থাকে। Example:

Compiler

এর পরের কাজ হল Compiler এর। Compiler সাধারণত pure high level language কে convert করে Assembly Program এ পরিবর্তন করা । এর পরে আমরা যে code টি পাব সেটা পুরোপুরি HLL ও না আবার সেটা পুরোপুরি Assembly ও না। মাযহামঅ্যাী ও না।

Assembly

Assembler এর পরের Relocated Machine Code এ পরিবর্তন করবে। আর এইটা হল পুরোপুরি Binary File(Object Code) । আমরা যদি Programming করে থাকি তবে আমরা যানি যে আমরা যদি কনো soure code compile দিয়ে run করাই তবে সেই file টার সাথে আরো ২টি file তোরি হয়ে থাকে তার মধ্যে .O/Obj। সেই file টি ( Relocated Machine Code ) নামে পরিচিত। Relocated Machine Code বলতে বুঝাই ঃ ্যোখুন আমাদের Main Memory তে আমরা আমাদের Code টি save করে রাখি এবং যে জাইগাই থাকে সেটাকে বুহযহাই । আমরা যে কোনো জাইগাই রাখি না কেনো সেটা Main Memory তে save থাকে সেটাকে বুঝাই।

Linker

Linker এর কাজ হলো আমাদের বযাহার করা বিভিন্ন Library Function , file যেমন ঃ stdio.h , math.h, mycreatedheader.h এ আমদের define করা variable অথবা Function এর সাথে একটি Link তইরি করা । আর এটতা হল linker এর মুল কাজ ।

Static Linker:

Compiler Processing এ আমরা সাধারণত ২টি প্রক্রিয়া করে থাকি সেতা হল Translation of code Hll to Assembly এবং Execution। Static Linker এর কাজ সাধারণত execution এর আগে একটা file এর সাথে অন্য file এর যে Link সেটা সম্পূর্ণ করা। Static Linker C তে ব্যবহার করা হয় আর Dynamic Linker সাধারণত Java তে ব্যবহার করা হয় ।

Loader

Loader এর কাজ হল আমাদের এখুন পর্যন্ত পাওয়া code [mycode.c , mycode.o , library files ] Main Memory তে load করে নেওয়া । এর পরে আমরা execution code পাব এবং আমরা execution time এর উপরে আমরা input দিতে পারব এবং output পাবো ।

Comiler Vs Interpreters Vs Assembler

Interpreter

The Stracture of a Compiler / Various Phase of a compiler

Compiler এর বিভিন্ন ধাপ বা Compiler আসলে কন কোন ধাপে কাজ করে সেগুলো আমরা জানব ঃ

# উপরের ধাপ গুলকে আমরা আবার ২টা Phase / Modulo তে ভাগ করতে পারি । কারণ আমদের Compiler Design এর সময় ২টা জিনিস লক্ষ্য রাখতে হবে এমন অনেক জিনিস আছে যা Independent ( যেগুলো সব Platform এ কাজ করে আর অনেক বিষয় জা Dependent যা সুধু মাত্র একটি Platform এ কাজ করে ) । তাই আমরা Compiler Design এর ধাপ গুলকে ২টা ধাপ এ ভাগ করেছি ঃ

1:Frontend বা Analysics :

LSSI (Lexical Analyzer, Syntax Analyzer ,Semantic Analyzer, Intermediate code Generator ) Part .

Part 2: Backend বা Synthasics Part:

CT ( Code Optimizer and Target Code Generator) Part.

Lexical Analyzer

Lexical Analyzer আমাদের Code এর String গুলকে Number of Tokens এ পরিবর্তন করে দেই । এটাকে আমরা Scaner ও বলে থাকি । কারণ Lexical আমদের code কে scan করে আমাদের ব্যবহার করা variable , keywords কে আলাদা আলাদা করে tokens এ পরিবর্তন করে দিবে ।

Syntax Analyzer

Lexical Analyzer থেকে পাওয়া tokens গুলকে Syntax Analyzer Parser Tree/ Syntax Tree তে পরিবর্তন করে দিবে ।

Semantic Analyzer

Syntax Analyzer থেকে পাওয়া syntax tree টি Varified কিনা সেটা check করবে আর সেটা না হলে Error Generate করবে আর আই কাজ করে থাকে আমাদের Error Handler । এটাকে বলা হয় Semantically Varified ।

Intermediate code Generator

Sematical Analyzer থেকে পাওয়া Varified/Meaningful Syntax Tree টা চলে যাবে Intermediate Code Generator এর কাছে Intermediate Code Generator সেই Syntax Tree টাকে Intermediate Representation দিবে । এম্ন একটা Representation দিবে যেটা High Level Language ও না আবার Low Level Language ও না । আমরা অনেক রকম Intermediate code Generator Use kore থাকি কিন্তু সব থেকে পপুলার হল 3 Addressing Code Generator ।

Code Optimizer

আমাদের ব্যবহার করা Source Code টিকে Reduce করে থাকে । মানে আমাদের code এর লাইন সংখা কমাই দেই ।

Target Code Generator

এইটার কাজ হল আমাদের optimized code টিকে আমাদের Target Code এ পরিবর্তন করে দিবে ( এখানে Assembly Code এ পরিবর্তন করে দিবে ) ।

Symble Table Manager

আমাদের LSSICT (Lexical Analyzer, Syntax Analyzer ,Semantic Analyzer, Intermediate code Generator,Code Optimizer,Target Code Generator ) এর ধাপ গুলো নিয়ে কাজ করার জন্য যার সাহায্য নিব সেটা হল Symble Ttable Manager । কারণ এখানে আমাদের Source Code আর Object Code , Library Code গুলো Save থাকবে। আমাদের ব্যবহার করা Source Code, Parser Tree, Syntax Tree,Semantical Varified Code আর সর্বশেষ Target Code Save থাকবে আর আমরা ওই খান থেকেই সব কাজ গুলো করব।

Error Handler

LSSICT এর ধাপ গুলতে কোন Error দেখা দিলে Error Handle করার কাজ করে থাকে Error Handler।

What is 2 Phase / Modulo Compiler?

#LSSI (Lexical Analyzer, Syntax Analyzer ,Semantic Analyzer, Intermediate code Generator ) এই টুকু ধাপ কে আমরা একটা একটা ধাপ এ নিতে পারি আর CT ( ) কে আমরা আরেকটা ধাপ এ নিতে পারি। এভাবে Compiler কে ২টা ধাপে ভাগ করলে তাকে 2 Pphase Compiler বলবে ।

What Is 1 Phase / Modulo Compiler ?

# আমরা যদি LSSICT কে একটা ধাপে নিয়ে আসি এবং একসাথে কাজ গুলো গননা করে থাকি তবে সেটাকে 1 Phase/Modulo Compiler বলবে।

# L to I পর্যন্ত অংশ কে Frontend/Analysics Part বলা হয় আর C to T পর্যন্ত অংশ কে Backend/Synthesics Part বলে । Frontend টা কিন্তু Independent আপনি যেকোনো Platfrom use করতে পারেন এইটাতে কোন Problem ( as like windows, Linux ) হব না আর এইটা Matter ও করে না কিন্তু Backend টা Dependent । সুধু মাত্র Backend টা পরিবর্তন করেই আমরা নতুন Compiler বানাতে পারব ।

Introduction to Lexical Analyzer

Symble Table Manager

Example :

Lexeme

Lexeme হচ্ছে sequance of strings। মানে হচ্ছে Meaningful Character . Example : position , initial , rate ;

Lexical Analyzer

Lexical Code গুলকে Number of Strings এ পরিবর্তন করে দিবে আর Source Code এ যদি বেশি সংখ্যক Space থাকে তবে সেটা Remove করে দিবে আবার আমাদের Code যদি Comments থাকে তবে সেটাও Remove করে দিবে Lexical Analyzer । আবার আমাদের code এ বযভের করা Keywords , Identifier & Recognizing of Constant গুলো আলাদা করে দিবে এবং সেগুলো Tokens এ পরিনত করে দিবে । আমাদের প্রশ্ন হল Lexical Analyzer কিভাবে চিনবে যে কোনটা Indentifier , কোনটা Identifier না । সেই জন্য Lexical Analyzer কে কিছু Rules of Pattern দিয়ে দেওয়া হই যাতে করে Lexical Analyzer বুঝতে পারে যে কোনটা Identifier আর কোনটা Identifier না । Example : l ( l + d )* [ set of rules ] যেটাকে আমরা Pattern বলে থাকি । যেমন ঃ position হ্যাঁ এইটা একটা Tokens কারণ যে এইটা আমাদের l(l+d)* Pattern মেনেছে তাই ।

What is Tokens ?

Token হল Number of Strings আর আমাদের একটা Pattern মেনে কাজ করবে যে । Example : float position , initial , rate ; এখানের float ও কিন্তু token কিন্তু সেটা আমাদের Symble Table Manager এ আসবে না কারণ Lexical Analyzer এর আগে থেকেই জানা আছে যে float এর token কি তাই , কারণ এইটা একটা keyword । তাই সেটা Symble Table Manager এ Save থাকে না । আরও বাদ যাবে আমাদের ব্যবহার করা কমা ( , ) , সেমিকলন ( ; ) । এইটা আমরা একটা BFS এর State এর দিকে নজর দিলেও দেখতে পাই যে সে একটা নিয়ম মেনে Travel করে থাকে ।তার পরে একটার পরে আরেকটা Base Travel করে তেমনি Lexical Analyzer প্রতিটা Character কে check করে state মেনে এবং সেটা Keyword কিনা যাচাই করে তার পরে Symble Table Manager এ save করে । Example :


Token আবার ২টা part এ থাকে ঃ

Tokens Example :


Introduction to Syntax Analyzer

id1 = id2 + id3 * 60 ;

এই input কে Synatx Analyzer input হিসেবে নিবে এবং কোন Grammar এর rules কে Follow করবে এবং Parser Tree তে পরিনত করবে । Rules Example :

#আমরা জখুন Parse Tree কে Compress করব তখুন আমরা পাব Syntax Tree । Parse Tree কে যখুন আমরা Compress করব তখুন Oparator গুলো হবে internal Node আর Oparand গুলো হনে Leave Node ।সুতরাং আমরা তখুনি Syntax Tree পাব যখুন Tokens গুলো একটা Rules মেনে Parser Tree তে রুপান্তর হবে । আর যদি এই কাযে rules না follow করে তবে সেটা Hande করার দায়িত্ত Error Handler এর । এই জিনিষ টা বুঝার জন্যে আমরা একটা উদাহরন দেখি তাহলেই বুঝে যাব । Example :

এইটা থেকে আমরা Parser Tree পাব না কারণ এইটা আমাদের Rules Follow করে না ।

Introduction To Semantic Analyzer

Syntax Tree কে Semantic Analyzer কে Input হিসেবে নিবে এবং একটা Syntax Tree দিবে যেটা Semantically Varified । Example :

এই উদাহরনে Grammatically কোন ভুল নাই তবে এইটা Meaningful না । এই Program টা float return করবে কিন্তু আমরা ব্যবহার করেছি Character যা এখানে Declier করা নাই । আমরা চাচ্ছি একটা আর আমাদের দিচ্ছে আরেকটা ।

Semantical Analyzer এর মুল কাজ হল Data Type Conversition করা আমরা এটাকে Type Casting ও বলে থাকি । যদি Data Type এ কোন Problem থাকে তবে সেটা Same Data Type এ Conversition করে দেই ।

Data Type Casting 2 রকম হতে পারে ঃ

Emplecite Type Casting হল বড় কোন Data Type থেকে ছোট কোন Data Type এ পরিবর্তন করা আর Explecite Data Type Casting হল ছোট কোন Data Type থেকে বড় কোন Data Type এ পরিবর্তন করা। Xplecite Data Type Casting সাধারণত Compiler নিজে থেকে করে থাকে আমাদের নিজেকে করার প্রয়োজন পরে না । Emplecite Data Type Casting Example :

float অনেক বড় তাই আমাদের নিজে থেকে এইটা করে নিতে হই আর এইটাকেই Emplecite Type Casting বলবে ।

Introduction to Intermediate Code Generator

#Sematically Varified Tree থেকে আমরা output পাব এবং code generator সেটাকে একটা intermediate Representation দিবে ।

3 Addressing Code Generator

3 Addressing Code এ Oparand থাকবে 3টি । Left Side এ 1টা আর Right Side এ 2টা ( এখানে সরবচ্চ ২ টা বোঝানো হয়েছে কম করে হলেও ১ টা থাকতে পারে ) । Example :

আমাদের আগের ব্যবহার Code টা কিন্তু 3 Addressing Code না । কারণ সেটার কোনো Representation আমরা পাই না ।

Code Optimizer

Intermediate Code Generator থেকে Input হিসেবে আমরা 3 Addressing Code টা নিবে এবং Optimized করবে মানে আমাদের code এর line of number redoucing সংখা কমাইই দিবে । এইটা কোনো Compiler এ থাক্তেও পারে নাও পারে ।

Code Optimizer দিয়ে আমরা source code কে redouce করে 4 টা ine থেকে 2টা line করেছি ।

Next - Coming Soon Backend Design With Details.

I am Thinking to make Video Series about Compiler Design and Online Judge Design in Bangla.

Online Judge Design

Now i am introducing how to design and code for an Programming Online Judge.

My Online Judge ArenaBoard Details

ArenaBoard Online Judge This is my Programming Online Judge and also MCQ Online Judge .I am happy to say in presents my Online Judge Users are 1500+ about 3 Months without any national level Contest.I am working this about 1 year and 8 Months.When i was participate on Onsite Programming Contest then thing to make some this type Appilcation but that day i have no knowledge how to make it when i learn some more then think to make this type application.Then Make It.

Share and give me feedback in Facebook or Mail me : mdsanaulhaqueshanto@gmail.com

Know About me: Visit my Resume .

Last Update: 20 June, 2018