প্রোগ্রামিং ভাষাগুলো কি আপনার কাছে বিস্ময়কর কিন্তু রহস্যময় औজার मालूम पड़ছে? যদি আপনাকে তাদের হুডের নিচে ঝাঁকি মারার সুযোগ মেলে এবং বুঝতে পারেন কী কarno তাদের কাজ করে, তাহলে কেমন হত? যদি আপনি হাত ঘোঁটিয়ে প্রোগ্রামিং ভাষা স্ক্র্যাচ থেকে তৈরি করতে আগ্রহী হন, তবে এই ব্লগ পোস্ট এবং এই সিরিজের পরবর্তী পোস্টগুলো আপনার জন্য সাহায্যকর হবে।
কেন প্রোগ্রামিং ভাষা বানাবেন?
স্টফল (Stoffle) সম্ভবত পাইথন বা রুবিকে প্রতিস্থাপন করবে না। তাহলে কেন এটি विकশিত করবেন? মজার পাশাপাশি, এই সিরিজে আমি দেখাতে চাই যে একটি ভাষা তৈরি করা দুর্দান্ত প্রোগ্রামিং অভ্যাস। এই অভিজ্ঞত থেকে একাধিক সুবিধা পাওয়া যায়:
এটি প্রোগ্রামিং ভাষাগুলোকে গোপন নয় রাখে (এবং ডেভেলপার টুলগুলোকেও পরোক্ষভাবে) এবং আমাদের নিজেদেরকে শুধু এই টুলগুলোর ভোক্তা না দেখিয়ে স্রষ্টা হিসেবে দেখতে সাহায্য করে—যারা প্রয়োজন বা ইচ্ছা অনুযায়ী নিজেদের ভাষা তৈরি করতে পারেন;
এই অভ্যাস অসাধারণ প্রোগ্রামিং চ্যালেঞ্জ উপস্থাপন করে যা আমাদের többের দৈনন্দিন জীবনে কখনো saamna করতে হয় না;
আমরা প্রোগ্রামিং ভাষা বাস্তবায়নের বাইরেও কাজ आने वाले কম্পোনেন্ট সম্পর্কে শিখব। উদাহরণস্বরূপ, একটি পার্সার লক্ষ লক্ষ ক্রিপ্টিক রেগুলার এক্সপ্রেশনের বদলে ব্যবহার করা যেতে পারে আপনার বস যেহেতু বলে একটি সমস্যাযুক্ত লিগ্যাসি টেক্সট ফাইল আপনার সিস্টেমে নতুন ডেটা আমদানির 메কানিজম হিসেবে সমর্থন করতে হবে।
প্রোগ্রামিং ভাষা কিভাবে কাজ করে?
এই প্রজেক্টে আমাদের সামনে কী আছে সেটা দেখার আগে, আসুন একটু জুম আউট করি এবং বুঝি একটি প্রোগ্রাম কম্পিউটারে কিভাবে রান হয়। আপনি কল্পনা করতে পারেন, একটি CPU সরাসরি রুবি-এর মতো হাই-লেভেল ভাষা সমর্থন করে না। তবে CPU-দের তাদের আর্কিটেকচারের উপর নির্ভর করে অনেক নিম্ন-স্তরের ইনস্ট্রাকশন থাকে যা তারা সমর্থন করে।
আপনি যদি কৌতূহলী হন, তবে x86 আর্কিটেকচার সম্পর্কে গবেষণা করুন, যা খুব সম্ভব আপনার কম্পিউটারকে চালাচ্ছে যদি আপনি এই আর্টিকেলটি PC বা Mac-এ পড়ছেন।
তো, একটি প্রোগ্রামিং ভাষার কাজ হলো তার হাই-লেভেল কোডকে মেশিন কোডে রূপান্তর করা যেটা CPU বুঝতে পারে। এই কাজ সম্পন্ন করার জন্য অনেক কৌশল ব্যবহার করা হয়। স্টফল একটি ইন্টারপ্রেটেড ভাষা, অর্থাৎ ইন্টারপ্রেটার প্রোগ্রাম চলাকালীন স্টফলের সোর্স কোডকে মেশিন কোডে অনুবাদ করবে।
C-এর মতো কম্পাইলড ভাষা ভিন্ন ধরনের। এগুলোর একটি কম্পাইলেশন ধাপ থাকে যা বাইনারি তৈরি করে (অর্থাৎ সোর্সকে মেশিন কোডে রূপান্তর করে) যেটা টার্গেট CPU দ্বারা এক্সিকিউট হতে পারে। অন্য একটি কৌশল হলো সোর্স ফাইলকে অন্য (প্রায়শই হাই-লেভেল) ভাষায় কম্পাইল করা যা ইতিমধ্যে অস্তিত্বে আছে; এই কৌশলকে সাধারণত 'ট্রান্সপাইলেশন' বলা হয়।
মনে রাখবেন, বাস্তব ভাষাগুলোর ক্ষেত্রে বিষয়গুলো এতটা স্পষ্ট নয়। সেগুলো সাধারণত এই সব (এবং অন্যান্য) বাস্তবায়ন কৌশলগুলির দিক গ্রহণ করে। বেসিকগুলো কভার হলে আপনার প্রিয় ভাষা কোন পথ অনুসরণ করে সেটা গবেষণা করতে আমি আপনাকে উৎসাহিত করছি।
স্টফলের পাখির চোখে দেখা
পূর্বে বলা অনুযায়ী, স্টফল একটি প্রাথমিক, ইন্টারপ্রেটেড, ডাইনামিক্যালি টাইপড প্রোগ্রামিং ভাষা। এতে থাকবে কিছু বেসিক ডেটা টাইপ, চারটি 초보িক গাণিতিক অপারেটর, তুলনা এবং সমতা, লজিক্যাল অপারেটর, if/else, while লুপ, ফাংশন, এবং কনসোলে প্রিন্ট করার ক্ষমতা।
তথ্য: স্টফলের মতো যেসব ভাষার প্রाथміক উদ্দেশ্য শেখা এবং পরীক্ষা-নিরীক্ষা, সেগুলোকে প্রায়শই টয় ল্যাঙ্গুয়েজ বলা হয়।
স্টফলের ইন্টারপ্রেটার আমাদের প্রিয় রুবি দিয়ে বাস্তবায়ন করা হবে। যখন আমরা ইন্টারপ্রেটার চালু করব (stoffle hello_world.sfe), তখন আমাদের সোর্স ফাইল ইন্টারপ্রেটারের কম্পোনেন্ট এবং ফেজগুলো দিয়ে যাবে:

আমাদের ইন্টারপ্রেটারের অংশগুলো এবং .sfe ফাইল রান করলে কী ঘটে।
লেক্সার (Lexer)
স্ক্যানার 이름으로ও পরিচিত, লেক্সার এর মিশন হলো সাদা ক্যারেক্টার স্ট্রিংকে অর্থপূর্ণ গ্রুপিং-এ রূপান্তর করা যাকে সাধারণত 'টোকেন' বলা হয়। কল্পনা করুন আমরা my_var নামক একটি ভেরিয়েবল ডিক্লেয়ার করলাম। আমাদের লেক্সার এই ক্যারেক্টারগুলো পড়ে একটি Token::VARIABLE টোকেন তৈরি করবে।
পার্সার (Parser)
সোর্স কোডের নেস্টেড প্রকৃতি অস্বীকার্য নয়। একটি কন্ডিশনাল এক্সপ্রেশন ভাবুন; এর true এবং false ব্রাঞ্চগুলো নেস্টেড থাকে এবং কন্ডিশনের ইভ্যালুয়েশন রেজাল্টের উপর নির্ভর করে এক্সিকিউট হয়।
পার্সার এর মূল কাজ হলো টোকেনের একটি ফ্ল্যাট সিকোয়েন্সকে এমন একটি ডেটা স্ট্রাকচারে রূপান্তর করা যেটা তাদের মধ্যে থাকা সম্পর্কগুলো রিপ্রেজেন্ট করতে পারে। পার্সার এর আরেকটি গুরুত্বপূর্ণ ফাংশন হলো সিনট্যাক্স এরর রিপোর্ট করা যখন আমরা ভুল করি।
ইন্টারপ্রেটার (Interpreter)
স্টফলের ইন্টারপ্রেটার সিম্পল হবে এবং পার্সার তৈরি করা ডেটা স্ট্রাকচারের সাথে সরাসরি কাজ করবে। ইন্টারপ্রেটার এই স্ট্রাকচারটুকরো টুকরো বিশ্লেষণ করবে এবং চলমান অবস্থায় এক্সিকিউট করবে।
স্টফল প্রোগ্রামিং ভাষায়, মেশিন কোডে রূপান্তর হবে কারণ ইন্টারপ্রেটার নিজে একটি রুবি প্রোগ্রাম (এবং তাই রুবির ইন্টারপ্রেটার দ্বারা ইন্টারপ্রেট হবে যখন আমরা এটি চালাব!)।
শেষ বন্দনা
আজকের আর্টিকেলে আমরা স্টফলকে জীবন দেওয়ার জন্য নেওয়া ধাপগুলোর একটি রফ ওভারভিউ দিয়েছি। আশা করি আপনি আমার মতোই উত্তেজিত এবং যারা মনে করতেন প্রোগ্রামিং ভাষা বাস্তবায়ন ফ مرতমানুষদের বাসের বাইরে, তাদের আত্মবিশ্বাস দিতে পারেছি।
এই সিরিজের পরবর্তী ব্লগ পোস্টে, আমরা স্টফলের লেক্সার বাস্তবায়ন করে হাত ঘোঁটাতে শুরু করব, যার মানে পরবর্তী পোস্টের শেষে আমরা একটি রুবি প্রোগ্রাম তৈরি করব যা স্টফল সোর্স কোড পড়তে পারে এবং নীরস ক্যারেক্টার সিকোয়েন্সকে আরও স্ট্রাকচার্ড (এবং আকর্ষণীয়!) টোকেন সিকোয়েন্সে রূপান্তর করতে পারবে।
এই সিরিজের পরবর্তী किस্তে আপনাদের সাথে আবার দেখা হবে!