আমাদের দ্বিতীয় থিম মাস, Mechanical March-এ স্বাগতম। এই মাসে আমরা মন দিচ্ছি সিস্টেম ভাষার দিকে, যেগুলো মেশিন কোডে কম্পাইল হয়ে যায়।
এটি Mechanical March ভিডিওর কিছুটা পোস্ট, কিছুটা ট্রান্সক্রিপ্ট। আমি আপনাদের এই মাসটি নিয়ে একটু পরিচয় দেব, তারপর আমরা সিস্টেম ভাষাগুলো একটু দেখব, ইতিহাসের ধারায় তাদের বিবর্তন, মেশিন কোডে কম্পাইল করার সুবিধা-অসুবিধা, আর নির্বাচিত প্রতিটি ভাষার দিকে এক ঝলক চোখ বুলাব। আবারও আমার সঙ্গে আছেন Erik, যিনি দ্বিতীয়ার্ধে বেশিরভাগ কথা বলবেন। তবে শুরুটা আমি করব কিছু ব্যবহারিক তথ্য দিয়ে।
তাহলে শুরুতে, এই মাসের নির্বাচিত ভাষাগুলো। সেগুলো হলো C, C++, D, Go, Nim, Rust, V এবং Zig। Mechanical March ব্যাজ পেতে হলে এই ভাষাগুলোর যেকোনো একটিতে পাঁচটি অনুশীলনী শেষ করতে হবে। আমাদের Go ট্র্যাকের সিলেবাস Exercism-এর সেরাগুলোর একটি, তাই আমি সত্যিই এটা চেষ্টা করে দেখার পরামর্শ দেব। আমরা এখানে Exercism-এ Nim-এরও বড় ভক্ত, কারণ শুরু করার জন্য এটি তুলনামূলক সহজ একটি ভাষা আর লিখতেও খুব সহজ, তাই এটাও নিশ্চিতভাবে চেষ্টা করে দেখার পরামর্শ দেব।
আমাদের আবার পাঁচটি নির্বাচিত অনুশীলনীও আছে, যা আপনি করে দেখতে পারেন:
- Linked-list বা simple-linked-list (ভাষার উপর নির্ভর করে): মেমরি অ্যালোকেট/ফ্রি করা, পয়েন্টার
- secret-handshake: বিটওয়াইজ অপারেশন
- pangram: for লুপ, স্ট্রিং আর ক্যারেক্টার
- sieve: অ্যারে, for লুপ
- binary-search: অ্যারে, লুপ
কয়েক দিন আগে আমার করা আপডেট ভিডিওতে একটি নতুন ব্যাজের কথা জানিয়েছিলাম, যেটা থিমভিত্তিক ভাষাগুলোতে পাঁচটি নির্বাচিত অনুশীলনী শেষ করার জন্য। তাই ওই ব্যাজ পেতে হলে বছরের মধ্যে কোনো এক সময় একটি সিস্টেম ভাষায় ওই সবগুলো অনুশীলনী সম্পূর্ণ করতে হবে।
আমাদের আরও অনেক মজার পরিকল্পনা পাক খাচ্ছে - Go Core টিমের দুজনের সঙ্গে সাক্ষাৎকার, আশা করছি Rust আর অন্য কিছু ভাষার সঙ্গেও। পুরো মাস জুড়ে অনেক লাইভ স্ট্রিমিংও থাকবে। আর শিগগিরই আসছে Mechanical March-এর কিছু উপহারসামগ্রীও!
তাহলে চলুন, একটু গভীরে গিয়ে কারিগরি দিকটা দেখি।
এই ভাষাগুলো কী কাজে ব্যবহৃত হয়?
আমরা Exercism-জুড়ে এগুলো ব্যবহার করি। আমাদের CLI লেখা হয়েছে Go-তে, configlet নামের আমাদের অভ্যন্তরীণ ট্র্যাক ম্যানেজমেন্ট টুল লেখা হয়েছে Nim-এ, আর আপনার সলিউশনে কোডের লাইন গোনে এমন মূল লাইব্রেরিটি লেখা হয়েছে Rust-এ। Erik, ওই টুলগুলোর অংশগুলোর জন্য আমরা কেন ওই ভাষাগুলো বেছেছিলাম?
CLI:
- আমার মনে হয় আমরা Go বেছেছিলাম কারণ Katrina এটার সঙ্গেই সবচেয়ে বেশি পরিচিত ছিলেন।
- এই ধরনের ছোট আকারের কমান্ড-লাইন টুলের জন্য Go দারুণ।
- Go-এর কোড তুলনামূলক সহজ, ফলে অবদান রাখা সহজ হয়
- Go বাইনারি সহজে ডিপ্লয় করা যায়, কারণ এতে কোনো রানটাইম লাগে না
- Go ক্রস-কম্পাইলেশন ভালোভাবে করে
Nim
- Nim-এ Go-র প্রায় সব একই সুবিধা আছে
- CLI রক্ষণাবেক্ষণ করতে পারে এমন Go জানা লোক আমাদের বেশি ছিল না, তাই আমরা Nim-এ চলে যাই
আর কোন কোন জায়গায় এই ভাষাগুলোর ব্যবহার আশা করবেন?
- যেখানে পারফরম্যান্স গুরুত্বপূর্ণ সেখানে (ড্রাইভার, গেম, অপারেটিং সিস্টেম, বিল্ড সিস্টেম/কম্পাইলার)
- যেখানে রিসোর্স সীমিত (যেমন এমবেডেড সফটওয়্যার)
- যা খুব সহজে এক প্ল্যাটফর্ম থেকে আরেকটায় নেওয়া যায়, অর্থাৎ অনেক আলাদা প্ল্যাটফর্মে চলে
মেশিন কোড কী?
তাহলে আগেই বলেছি, Mechanical March-এর এই ভাষাগুলোর বিশেষত্ব হলো এগুলো মেশিন কোডে কম্পাইল হয়। একটু বুঝিয়ে বলুন, মেশিন কোড আসলে কী, আর এর বিপরীতে বাইটকোড কী?
- মেশিন কোড হলো এমন কোড যা সরাসরি মেশিনে চলে।
- অন্যদিকে বাইটকোড চালাতে হয় অন্য কোনো কোড দিয়ে, যা বাইটকোডকে ইন্টারপ্রেট বা কম্পাইল করে মেশিন কোডে রূপান্তর করে। তাই বাইটকোড চালানোর আগে একটা মধ্যবর্তী ধাপ লাগে।
বাইটকোডের তুলনায় মেশিন কোডের সুবিধা-অসুবিধা কী?
সুবিধা:
- দ্রুত স্টার্টআপ (JIT কম্পাইলেশনের ধাপ নেই)
- ছোট মেমরি ফুটপ্রিন্ট (কোনো রানটাইম লোড হয় না, মেমরিতে বাইটকোড থাকে না, এমবেডেড সিস্টেমের জন্য দারুণ)
- টার্গেট মেশিনে ইনস্টল করা রানটাইম লাগে না (Docker কন্টেইনার ছোট রাখতে এটা গুরুত্বপূর্ণ)
অসুবিধা:
- পোর্টেবল নয়। বাইটকোড পোর্টেবল, কিন্তু কম্পাইল করা মেশিন কোড নির্দিষ্ট একটি প্ল্যাটফর্মের জন্য
- প্রোফাইল-গাইডেড অপটিমাইজেশনের মতো উন্নত অপটিমাইজেশন করা যায় না (কিছু সময় ধরে (বাইট)কোড চালানোর পর সেটি কম্পাইল করার সেরা উপায় নির্ধারণ করা)
দ্রষ্টব্য: হাইব্রিড পদ্ধতিও সম্ভব, যেখানে ভাষাটি বাইটকোডে কম্পাইল হয়, তারপর অন্য একটি টুল দিয়ে সেই বাইটকোড মেশিন কোডে কম্পাইল করা হয়।
সিস্টেম প্রোগ্রামিংয়ের বিবর্তন
ঠিক আছে। তাহলে চলুন, এই মাসের কিছু ভাষার বিবর্তন একটু দেখি। প্রথমে শুরু করা যাক সেই জায়গা থেকে যেখানে সবটা শুরু হয়েছিল, C দিয়ে, আর সেখান থেকে C++ কীভাবে এলো তা নিয়ে। এই ভাষাগুলো নিয়ে একটু বলুন
C খুবই লো-লেভেল ভাষা। মনে হয় আপনি মেশিন কোডের ঠিক এক ধাপ উপরে আছেন। এটাই C-কে খুব শক্তিশালী আর উচ্চমাত্রায় অপটিমাইজযোগ্য করে তোলে, তবে একইসঙ্গে কিছুটা বাগ-প্রবণও করে তোলে (যেমন নাল পয়েন্টার এক্সসেপশন আর বাফার ওভারফ্লো)। মেমরি ম্যানেজমেন্ট পুরোপুরি ম্যানুয়াল, তাই এর দায়িত্ব প্রোগ্রামারের, যা সম্ভাব্য বাগ আর/বা মেমরি লিকের দিকে নিয়ে যেতে পারে। C++ অনেকটা C-র মতোই, তবে এতে অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিংয়ের সমর্থন আছে। এটি এখনও বেশ লো-লেভেল, আর মেমরি ম্যানেজমেন্ট আপনাকে নিজ হাতে করতে হয়। C আর C++ দুটোতেই আপনি ইনলাইন অ্যাসেম্বলি (ASM) লিখতে পারেন!
আর নতুন সিস্টেম ভাষাগুলোর কী খবর? ওগুলো কীভাবে বিবর্তিত হয়েছে?
সব আধুনিক সিস্টেম প্রোগ্রামিং ভাষাই স্বয়ংক্রিয় মেমরি ম্যানেজমেন্ট সমর্থন করে, হয় রেফারেন্স কাউন্টিং, নয়তো গার্বেজ কালেক্টর, কিংবা অন্য কোনো পদ্ধতিতে।
শুরুর দিকের সিস্টেম প্রোগ্রামিং ভাষাগুলোতে নাল পয়েন্টার ছিল (টনি হোয়ার এটাকে তাঁর “বিলিয়ন ডলারের ভুল” বলে অভিহিত করেছেন)। এগুলো রানটাইম এরর আর দুর্বলতার কারণ হয়ে কুখ্যাত। অনেক আধুনিক ভাষা নাল একেবারে বাদ দিয়েছে, বা অন্তত এটি ব্যবহার করতে বাড়তি পরিশ্রম দাবি করে।
আরেকটি পরিবর্তন হলো, আগে ডিফল্টে মান ছিল মিউটেবল, এখন ডিফল্টে মান ইমিউটেবল। যেমন Rust আর VLang দুটোতেই ডিফল্টে মান ইমিউটেবল, মিউটেবিলিটি ব্যবহার করতে চাইলে আলাদা করে সেটা বেছে নিতে হয়।
নতুন সব ভাষাতেই C (বা C++)-এর সঙ্গে ইন্টারঅপের সমর্থন আছে, কারণ ওই ভাষাগুলোতে বিশাল পরিমাণ কোড লেখা হয়ে গেছে।
আরেকটি মজার বিষয় হলো, নতুন কিছু ভাষা সরাসরি মেশিন কোডে কম্পাইল হয় না, বরং সেটা করার জন্য অন্য টুল ব্যবহার করে। যেমন Rust আর Zig ব্যবহার করে LLVM, আবার Nim-এ অনেক রকম কম্পাইলার ব্যবহার করা যায়। এটাকে বলা হয় ট্রান্সপাইলিং।
ম্যাক্রো আর মেটাপ্রোগ্রামিংয়ের মতো বিষয়গুলো কী?
ম্যাক্রো/মেটাপ্রোগ্রামিং নিয়ে একটি মজার ভাগাভাগি দেখা যায়। C/C++-এর ম্যাক্রো শক্তিশালী, তবে কাজ করা কঠিন বলে এগুলোর সুনামটা তেমন ভালো নয়। Rust, Nim আর D শক্তিশালী মেটাপ্রোগ্রামিং দেয়, তবে অনেক সুন্দরভাবে। উল্টোদিকে, VLang আর Zig দুটোই স্পষ্টভাবে বলে যে তাদের ভাষায় ম্যাক্রো নেই, এটাই তাদের একটি বৈশিষ্ট্য, আর Go-র পদ্ধতি আলাদা, সেটা হলো go generate।
সিস্টেম ভাষাগুলোর সুনাম হলো এগুলো বেশ লো-লেভেল। সেটা কি এখনও ঠিক?
নতুন ভাষাগুলো C/C++-এর চেয়ে অনেক উঁচু স্তরের অ্যাবস্ট্রাকশনে কাজ করে। যেমন Rust, D আর Nim-এ খুব ফাংশনাল ধাঁচে কোড লেখা যায়। Nim আর D-তে তো “পিওর” ফাংশনের ধারণাই আছে।
এই মাসের ভাষাগুলোর পরিচয়
তাহলে একে একে প্রতিটি ভাষা দেখা ভালো হবে। সব ভাষার মধ্যে মিলও আছে - সবগুলোই স্ট্রং আর স্ট্যাটিকালি টাইপড। কিন্তু চলুন দেখি ওরা কোথায় আলাদা। C দিয়ে শুরু করি?
C
- Dennis Ritchie-এর তৈরি
- সবচেয়ে পুরোনো ভাষাগুলোর একটি, আর সম্ভবত বিশ্বের সবচেয়ে বেশি ব্যবহৃত
- অঢেল সফটওয়্যার C-তে লেখা, যেমন Unix আর Linux
- ভীষণ প্রভাবশালী (ভেবে দেখুন: “C-এর মতো ভাষা” বলে একটা জিনিস তো আছেই)
- ম্যানুয়াল মেমরি ম্যানেজমেন্ট
- খুব দ্রুতগতির (হার্ডওয়্যারের একেবারে কাছাকাছি)
- যেকোনো জায়গায় চলে
- এমবেডেড সিস্টেমের জন্য একেবারে উপযুক্ত
- মোটামুটি ছোট ভাষা
C++
- Bjarne Stroustrup-এর তৈরি
- C-র উত্তরসূরি, তবে এতে অবজেক্ট-ওরিয়েন্টেশন যোগ করা হয়েছে (ক্লাস-সহ C)
- অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং জনপ্রিয় করতে সাহায্য করেছে
- C-র চেয়ে বেশি হাই-লেভেল ভাষা-বৈশিষ্ট্য
- টেমপ্লেটের মাধ্যমে জেনেরিক প্রোগ্রামিং সমর্থন করে
- নেমস্পেসের মাধ্যমে মডিউল সমর্থন যোগ করে
- অনেক গেম (ইঞ্জিন) C++-এ লেখা, আর Windows-এর বড় অংশও
- ম্যানুয়াল মেমরি ম্যানেজমেন্ট
- এখনও বিবর্তিত হচ্ছে, নিয়মিত নতুন বৈশিষ্ট্য যোগ হচ্ছে (বিশাল স্পেসিফিকেশন)
D
- Walter Bright-এর তৈরি, পরে যোগ দেন Andrei Alexandrescu
- প্রথমে ভাবা হয়েছিল এটি নতুন করে বানানো C++ (C++-এর “ভুল” থেকে শিক্ষা নিয়ে), তবে এটি আরও অনেক ভাষা থেকে অনুপ্রেরণা নিয়েছে
- মাল্টি-প্যারাডাইম, ইম্পারেটিভ/অবজেক্ট-ওরিয়েন্টেড/ফাংশনাল প্রোগ্রামিং সমর্থন করে
- C/C++-এর সঙ্গে সহজ ইন্টারঅপ
- ইউনিফর্ম ফাংশন কল সিনট্যাক্স
- কম্পাইল টাইম ফাংশন ইভালুয়েশন (যেমন কম্পাইল সময়ে Regex স্টেট মেশিন তৈরি করা)
- ফাংশনাল প্রোগ্রামিং আর “পিওর” ফাংশন সমর্থন করে
- অনেক নিরাপত্তা-বৈশিষ্ট্য
- @safe-এর মাধ্যমে মেমরি সেফটি
- কনট্র্যাক্ট (প্রি/পোস্ট কন্ডিশন, ইনভেরিয়েন্ট)
- পিওর ফাংশন
- ইউনিট টেস্টের উপর জোর, টেস্ট থাকে যে সোর্স কোডকে টেস্ট করা হচ্ছে তার পাশেই (Exercism ওয়েবসাইটে এর জন্য একটি ব্যতিক্রম করা প্রয়োজন হয়েছিল :))
- ইউনিকোড
Rust
- Mozilla Research-এর কর্মী Graydon Hoare-এর তৈরি, পরে Mozilla আনুষ্ঠানিকভাবে গ্রহণ করে, আর এখন এটি Rust Foundation-এর অংশ
- মাল্টি-প্যারাডাইম, OO সমর্থন করে (তবে নিজের মতামত নিয়ে, যেমন ইনহেরিট্যান্স নেই), ইম্পারেটিভ আর ফাংশনাল প্রোগ্রামিং (Option/Result টাইপ, প্যাটার্ন ম্যাচিং)
- অনেক নতুন টুল Rust-এ লেখা (যেমন SWC, আবার Gleam-ও, আর Linux কার্নেলের দ্বিতীয় সমর্থিত ভাষা হিসেবে; কোডের লাইন গোনার কাজে আমরা এর উপরই নির্ভর করি)
- নির্ভরযোগ্যতা আর পারফরম্যান্সের উপর জোর
- LLVM-এর উপরে তৈরি
- গত সাত বছর ধরে StackOverflow-এর জরিপে সবচেয়ে প্রিয় ভাষা
- দ্রুত, আংশিকভাবে কারণ এর কোর আর স্ট্যান্ডার্ড লাইব্রেরি খুব ছোট
- নিরাপদ, ওনারশিপ আর লাইফটাইমের মাধ্যমে মেমরি-সেফটি ও থ্রেড-সেফটি দুটোই, ডিফল্টে ইমিউটেবল
- শক্তিশালী টাইপ সিস্টেম, কম্পাইল সময়েই অনেক বাগ ধরে ফেলে (বিশেষত মেমরি-সংক্রান্ত)। কম্পাইলার সত্যিই সহায়ক এরর দেখায়
- সবকিছু আগে থেকেই দেওয়া: কম্পাইলার, বিল্ড টুল, ফরম্যাটার, প্যাকেজ ম্যানেজার, IDE ইন্টিগ্রেশন
- দারুণ ডকুমেন্টেশন (কম্পাইলার কীভাবে কাজ করে তা নিয়ে বিশাল একটা ডকুমেন্টও আছে)
- পোর্টেবল: একটি একক স্ট্যাটিক বাইনারিতে কম্পাইল হয়, আর ইনস্টল করা রানটাইম লাগে না
- C কোডের সঙ্গে সহজ ইন্টারঅপ
- শূন্য-খরচের অ্যাবস্ট্রাকশন
- নির্ভীক কনকারেন্সি
- ম্যাক্রো
Nim
- Andreas Rumpf-এর তৈরি (শুরুতে নাম ছিল Nimrod)
- সিনট্যাক্স অনুপ্রাণিত Python থেকে
- মাল্টি-প্যারাডাইম
- Exercism-এ configlet-এ ব্যবহৃত
- দারুণ পারফরম্যান্স: জিরো ওভারহেড ইটারেটর, ভ্যালু-ভিত্তিক টাইপ স্ট্যাক অ্যালোকেশনে রাখার প্রবণতা
- আধুনিক, ভাব প্রকাশে সক্ষম টাইপ সিস্টেম: টাইপ ইনফারেন্স, টাপল, জেনেরিক, সাম টাইপ, async/await
- গার্বেজ কালেকশন, তবে ডিটারমিনিস্টিক মেমরি ম্যানেজমেন্টের সমর্থনও আছে (একাধিক মেমরি ম্যানেজমেন্ট অপশন)
- কম্পাইল সময়ে কোড এক্সিকিউট করা
- ইউনিফর্ম কল সিনট্যাক্স
- ম্যাক্রো: ভাষা বাড়ানো সহজ
- ইফেক্ট সিস্টেম: টাইপ সিস্টেমে সাইড ইফেক্ট এনকোড করা
Go
- Google-এ Robert Griesemer, Rob Pike আর Ken Thompson-এর তৈরি
- বেশিরভাগ ক্ষেত্রে ইম্পারেটিভ/প্রসিডিউরাল, অবজেক্ট-ওরিয়েন্টেডের মতো একটা ধাঁচও সমর্থন করে (তবে ইনহেরিট্যান্স ছাড়া)
- Docker, Kubernetes-এর মতো বড় প্রকল্পে ব্যবহৃত। ব্যাকএন্ড আর CLI-র জন্যও দারুণ (যেমন esbuild)
- লক্ষ্য হলো এত সহজ হওয়া যাতে পুরোটা মাথায় ধরে রাখা যায় (সামান্য সিনট্যাক্স)
- গার্বেজ কালেক্টরের মাধ্যমে মেমরি সেফটি
- দ্রুত: দ্রুত কম্পাইলেশন, দ্রুত টেস্টিং আর দ্রুত রানটাইম। বেঞ্চমার্ক লেখার বিল্ট-ইন সমর্থন!
- নিজের মতামতটা জোরালো: Go কোডের স্টাইল গড়ে তুলতে অনেক পরিশ্রম করা হয়েছে: সামান্য সিনট্যাক্স, go fmt দিয়ে কোড ফরম্যাট করা, কোড আদর্শ ধাঁচে লেখা কি না তা যাচাই করার টুলিং, আর অন্য ভাষায় যেগুলো শুধু ওয়ার্নিং সেগুলোতে এরর দেখানো (যেমন অব্যবহৃত ভ্যারিয়েবল), আর ব্যবহারযোগ্য Go ইডিয়মের তালিকা দেওয়া ডকুমেন্টেশন
- হালকা টাইপ সিস্টেম, যা Go-কে খুব নমনীয় করে তোলে (টাইপ ইনফারেন্স সমর্থন করে)
- পোর্টেবল: একটি একক স্ট্যাটিক বাইনারিতে কম্পাইল হয়, আর ইনস্টল করা রানটাইম লাগে না। সহজ ক্রস-কম্পাইলেশন। গোরুটিনের (হালকা) মাধ্যমে কনকারেন্সি আর চ্যানেলের মাধ্যমে যোগাযোগ
- ইন্টারফেসের মাধ্যমে স্ট্রাকচারাল টাইপিং (ডাক টাইপিংয়ের মতো, তবে স্ট্যাটিকভাবে যাচাই করা)
- এরর হ্যান্ডলিং: ভাষা উৎসাহ দেয় এরর খুঁজে বের করে তা সামলানোর
VLang
- Alexander Medvednikov আর Delyan Angelov-এর তৈরি
- অনুপ্রাণিত Go থেকে:
- একই “কাজ করার একটাই উপায়” কৌশল
- একই “ন্যূনতম সিনট্যাক্স” কৌশল
- কোরুটিন
- Go থেকে আলাদা:
- nil/null নেই, বদলে result টাইপ ব্যবহার করে
- ডিফল্টে ইমিউটেবল
- সাম টাইপ (ফাংশনাল)
- স্ট্রিং ইন্টারপোলেশন
- ছোট রানটাইম/বাইনারি
- প্যাটার্ন ম্যাচিং
- GC-কে ঐচ্ছিক করার কাজ চলছে (autofree)
- শূন্য খরচের C ইন্টারঅপ
- কোড থেকে ডকুমেন্টেশন তৈরি করে
- দ্রুত কম্পাইলার, যা সামান্য মেমরি ব্যবহার করে
Zig
- Andrew Kelley-এর তৈরি
- মোটামুটি সামান্য সিনট্যাক্স (৫০০ লাইনের PEG গ্রামার ফাইল)
- কম্পাইল সময়ে কোড এক্সিকিউশন আর রিফ্লেকশন
- লক্ষ্য “স্পষ্ট” হওয়া, কোনো লুকানো কন্ট্রোল ফ্লো বা অ্যালোকেশন বা ম্যাক্রো/মেটাপ্রোগ্রামিং নেই
- ম্যানুয়াল মেমরি অ্যালোকেশন
- বিভিন্ন অ্যালোকেটর সমর্থন করে
- স্ট্যান্ডার্ড লাইব্রেরির যে ফাংশনগুলো অ্যালোকেট করে, সেগুলোতে একটি অ্যালোকেটর প্যারামিটার থাকে
- টেস্ট ফ্রেমওয়ার্ক মেমরি লিক ধরতে পারে
- নিরাপত্তা:
- এরর হলো মান, আর সেগুলো সামলাতেই হবে
- null নেই, অপশনাল টাইপ ব্যবহার করে
- টেস্ট সোর্সের একই ফাইলে লেখা যায় (D-র মতো)
- ব্যাকএন্ড হিসেবে LLVM ব্যবহার করে
- C/C++ কোড কম্পাইল করতে পারে
- সহজ C ইন্টারঅপ
- সহজ ক্রস-কম্পাইলেশন
উপসংহার
এখানেই থামছি, কারণ আমার ধারণা এই পর্যায়ে সবার মাথা প্রায় ভরে গেছে।
আশা করি এই মাসের নির্বাচিত ভাষাগুলোর সঙ্গে এটা একটা কাজের আর মজার পরিচয় হয়ে গেল। এই ভাষাগুলো ঘেঁটে আপনার খুব মজা হোক। আপনি কোনটা বাছলেন আর কেমন লাগল, সেটা শুনতে Erik আর আমি দুজনেই আগ্রহী, তাই অবশ্যই কমেন্টে বা ফোরামে লিখুন!
দেখার জন্য ধন্যবাদ!