রিক্রিয়েশনাল প্রোগ্রামিং - যখন প্রোগ্রামিং এর উদ্দেশ্য কেবল মজা করা!
প্রোগ্রামিং জিনিসটা আমার কাছে ছোটবেলা থেকেই অনেক ইন্টারেস্টিং লাগতো। প্রোগ্রামার হয়ে টাকা কামানো যায় - এ ব্যাপারটা বাদ দিলে প্রোগ্রামিং অনেকটা দাবার মতো। মগজের রেগুলার ইউজের জন্য প্রোগ্রামিং অনেক কাজের একটা জিনিস। এই ব্যাপারটাকে আরেকটু চ্যালেঞ্জিং করতে অনেক ধরণের প্রতিযোগীতা আছে। স্পোর্টস প্রোগ্রামিং বা কোডিং কন্টেস্ট এ পার্টিসিপেট করে নাই এরকম প্রোগ্রামার পাওয়া বেশ টাফ। কারো প্রবলেম সল্ভিং এ দক্ষতা কম থাকলে তার জন্য হ্যাকাথন আছে - যেখানে একটা নির্দিষ্ট সময়ের মধ্যে কোন সমস্যা সমাধানের জন্য ওয়ার্কিং প্রোটোটাইপ বানানো লাগে। কেউ সিকিউরিটি মাইন্ডসেটের হলে তার জন্য আছে সিটিএফ কম্পিটিশন।
তবে আমার মতো এভারেজ প্রোগ্রামার হলে কোন কম্পিটিশনে সুবিধা করাই কঠিন। এক্ষেত্রে সাইড প্রজেক্ট বেশ কাজের একটা জিনিস। হাতে কাজ না থাকলে উইকেন্ডে বসে একটা সফটওয়্যার কিংবা ওয়েবসাইট বানিয়ে ফেললে অনেক কিছু শিখা যায়, মাথাটাও একটু খাটানো হয়ে গেল।
রিক্রিয়েশন হিসাবে প্রোগ্রামারদের জন্য প্রোগ্রামিং এর এসব ব্যাপার বেশ কাজের। লক্ষ করলে দেখা যায় যে এগুলা সবই ‘প্রোডাক্টিভ’ ব্যাপারস্যাপার। কিন্তু যেই লোকের সপ্তাহের পাঁচ দিনই প্রোডাক্টিভ থাকা লাগে তাকে মজা করার জন্য প্রোডাক্টিভ হতে বললে তো সমস্যা। এই ব্যাপারটা অনেকেরই ভালো লাগে না। এই ভালো না লাগা থেকে “কোড লিখতে পারি, যা মন চায় করবো। এতো কাজের কিছু করা লাগবে না।” মাইন্ডসেটের বেশ কিছু কনসেপ্ট একটা টাইমে প্রোগ্রামারদের মধ্যে জনপ্রিয় হয়ে গেল। এরকম কিছু টপিক নিয়েই আমার আজকের লেখা!
এসোটেরিক ল্যাঙ্গুয়েজ - Esoteric Language
রেগুলার প্রোগ্রামিং করতে থাকলে একটা সময়ে এসে সবারই ইচ্ছা করে নিজের একটা প্রোগ্রামিং ল্যাঙ্গুয়েজ বানানো। বেশিরভাগ ক্ষেত্রেই একটা ইউজেবল প্রোগ্রামিং ল্যাঙ্গুয়েজ বানানো অনেক কঠিন আর এটার জন্য অনেক মানুষের লম্বা সময়ের রিসার্চ লাগে। কিন্তু কিছু লোক আছে এসব মানতে নারাজ। তাদের কথা হচ্ছে, “আমি ল্যাঙ্গুয়েজ বানাবো মজার জন্য, ইউজ করার তো কোন মানে নাই।” আবার কেউ কেউ আছে যাদের মেইন উদ্দেশ্য-ই হচ্ছে নিজের আর অন্যের বুদ্ধিকে চ্যালেঞ্জ করা। সব মিলিয়ে দেখা যায়, যে হাজার হাজার প্রোগ্রামিং ল্যাঙ্গুয়েজ আছে যেগুলো দিয়ে প্রোগ্রাম লিখা যায় কিন্তু কেউ লিখে না কারণ সেগুলো ব্যবহারের যোগ্য না!
এসব ল্যাঙ্গুয়েজকে বলা হয় Esoteric Language। এ ধরণের ল্যাঙ্গুয়েজ বানানোর আসল উদ্দেশ্য হচ্ছে মজা করা। একটা কমপ্লিকেটেড কিংবা ইনোভেটিভ কিছু বানানোই এখানে মূখ্য।
যেমন ধরা যাক Cow ল্যাঙ্গুয়েজের নিচের কোডটা-
MoO MoO MoO MoO MoO MoO MoO MoO MOO moO MoO MoO MoO MoO MoO moO MoO MoO MoO MoO moO MoO MoO MoO MoO moO MoO MoO MoO MoO MoO MoO MoO MoO MoO moO MoO MoO MoO MoO mOo mOo mOo mOo mOo MOo moo moO moO moO moO Moo moO MOO mOo MoO moO MOo moo mOo MOo MOo MOo Moo MoO MoO MoO MoO MoO MoO MoO Moo Moo MoO MoO MoO Moo MMM mOo mOo mOo MoO MoO MoO MoO Moo moO Moo MOO moO moO MOo mOo mOo MOo moo moO moO MoO MoO MoO MoO MoO MoO MoO MoO Moo MMM MMM Moo MoO MoO MoO Moo MMM MOo MOo MOo Moo MOo MOo MOo MOo MOo MOo MOo MOo Moo mOo MoO Moo
কে বলবে এই কোড রান করলে স্ক্রিনে ভেসে উঠে “Hello, World!”
আবার বলছিলাম যে কেউ কেউ ল্যাঙ্গুয়েজ বানায় অন্যকে চ্যালেঞ্জ করার জন্য। এ ধরণের ল্যাঙ্গুয়েজ হচ্ছে Brainfu*k. শুধু +-><.,
এই ছয়টা সিম্বল ইউজ করে যে কোন টেক্সট স্ক্রিনে লিখা সম্ভব। এটাই সম্ভবত সবচেয়ে পপুলার এসোটেরিক ল্যাঙ্গুয়েজ। এটা নিয়ে শত শত মানুষ কাজ করেছে, করছে। আবার Malbolge নামে একটা ল্যাঙ্গুয়েজ আছে, যেটা দিয়ে এখন পর্যন্ত কেবল দুইটা কম্পিউটার প্রোগ্রাম লেখা সম্ভব হয়েছে - তাও সুপারকম্পিউটারের সাহায্য নিয়ে। কেননা প্রতিটা অক্ষর লিখলে কোড নিজেই পরিবর্তিত হয়ে যায়! এখানে হ্যালো ওয়ার্ল্ড প্রোগ্রামের উদাহরণ-
(=<`#9]~6ZY327Uv4-QsqpMn&+Ij"'E%e{Ab~w=_:]Kw%o44Uqp0/Q?xNvL:`H%c#DD2^WV>gY;dts76qKJImZkj
JSFuck নামে আরেকটা ল্যাঙ্গুয়েজ আছে, যেটা বানানোর মূল উদ্দেশ্যই হচ্ছে Javascript নামের ল্যাঙ্গুয়েজটার বিভিন্ন সমস্যা সবাইকে চোখে আঙ্গুল দিয়ে দেখিয়ে দেয়া। জাভাস্ক্রিপ্ট কিন্তু টপ ৫ পপুলার ল্যাঙ্গুয়েজের একটা!
মানুষ যেমন এসোটেরিক ল্যাঙ্গুয়েজ বানায়, অনেকে আছে অন্যের বানানো ল্যাঙ্গুয়েজ নিয়ে রীতিমতো গবেষণা করে, ইন্টারেস্টিং প্রোগ্রাম বানায় - মজার জন্য, নিজেকে চ্যালেঞ্জ করার জন্য।
আরো উল্লেখযোগ্য কিছু ল্যাঙ্গুয়েজ হচ্ছে - Shakespeare, Befunge, Fish, L33T ইত্যাদি।
কুইন - Quine
কুইন এক ধরণের স্পেশাল প্রোগ্রাম যেটা রান করলে নিজের কোডটাই স্ক্রিনে দেখায়। নিচের পাইথন কোডের কথা ধরা যাক-
_='_=%r;print (_%%_)';print (_%_)
এই কোডটা রান করলে, স্ক্রিনে একই জিনিস প্রিন্ট হবে।
যে কোন ল্যাঙ্গুয়েজের জন্য কুইন লিখাই অনেক কঠিন কাজ। প্রোগ্রামিং এর সব মেজর আইডিয়া আর ল্যাঙ্গুয়েজটা নিজের নখদর্পনে না থাকলে কুইন লিখা প্রায় আকাশকুসুম ব্যাপার। এজন্য প্রচুর মানুষ কুইন নিয়ে পড়ে থাকে, ট্রাই করে ইনোভেটিভ সব কোড লিখার। আবার কেউ তার হয়ে কুইন লিখার জন্য নিজের অ্যালগোরিদম বানায়!
আবার অনেকে আছে, এসব ঝামেলায় যেতে চায় না। নিজের এসোটেরিক ল্যাঙ্গুয়েজ বানায় শুধু ইজি একটা কুইন লিখার জন্য। যেমন Turkey
নামের ল্যাঙ্গুয়েজে কেবল Turkey
ওয়ার্ডটাই বারবার লিখতে হয়। একবার Turkey
লিখলে সেটাই প্রিন্ট হবে। তার মানে Turkey
এর কুইন হচ্ছে
Turkey
কোড গলফিং - Code Golfing
খেলা হিসাবে গলফ খুব সিম্পল। সব নিয়মকানুন বাদ দিয়ে যেটা দেখা যায় সেটা হচ্ছে - কত কম চেষ্টায় একজন গলফ বলটাকে ডেডিকেটেড হোলে ফেলতে পারে। কোড গলফিং এর নিয়মও তাই! কত কম কোড লিখে একটা প্রোগ্রাম সল্ভ করা যায় সেটা বের করাই কোড গলফিং এর উদ্দেশ্য।
কোড গলফিং এর দুইটা সুবিধা - কোড লিখতে কম সময় লাগে আর যে ভাষায় লিখছি সেটার ইনস এন্ড আউটস সব জানা হয়ে যায়।
যেমন কোন সাল কি অধিবর্ষ নাকি সেটা জানার জন্য নিচের পাইথন কোডটা ব্যবহার করা যায়-
a=input();print ('No','Yes')[a%400<1or(a%4<1and a%100>0)]
অনেকে আবার একটা ভাষার সব ডিটেলস জানতে চায় না। কিন্তু একই সাথে তারা কোড গলফিং কম্পিটিশনেও পার্টিসিপেট করতে চায়। এসব ক্ষেত্রে তাদের জন্য আবার আলাদা ভাষা-ও রয়েছে। এমন একটা ল্যাঙ্গুয়েজ হচ্ছে O Language
. এটা আরেকটা এসোটেরিক ল্যাঙ্গুয়েজ যেটা কোড গলফিং এর জন্য আলাদাভাবে বানানো হয়েছে।
কোড অবফাসকেশন - Code Obfuscation
কোড গলফিং এর একটা ব্যাপার হলো গলফিং করলে কোড আর একটা সময়ে বুঝা যায় না। বুঝা গেলেও পরিবর্তন করা অনেক ঝামেলার। এই ব্যাপারটা থেকে আসে Code Obfuscation নামের আরেকটা টার্ম।
কোড অবফাসকেশন হচ্ছে যখন কোডের কিছু অংশ ইচ্ছা করে দুর্বোধ্য করে দেয়া হয় যেন বাইরের কেউ কোডে কী হচ্ছে সেটা না বুঝে। কোড গলফিং রিক্রিয়েশনাল ব্যাপার হলেও অবফাসকেশন মোটেও রিক্রিয়েশনাল কিছু না, বরং বড় বড় কোম্পানিগুলা তাদের কোড ইচ্ছা করে অবফাসকেট করে। অনেক কোম্পানি অবফাসকেশন সফটওয়্যারও বানায়।
তবে কিছু কিছু ক্ষেত্রে মানুষ নিজেই তার কোড অবফাসকেট করে। দেখার চেষ্টা করে আর কতভাবে তার এই কোডটাকে লিখা যায় - কিংবা কতো ইউনিকভাবে একই সমস্যা সমাধান করা যায়। IOCCC নামের একটা অর্গানাইজেশন প্রতিবছর কোড অবফাসকেশন কম্পিটিশন আয়োজন করে!
এগুলো বাদেও আরো অনেক উপায়ে রিক্রিয়েশনাল প্রোগ্রামিং করা যায়। একটা অনারেবল মেনশোন হচ্ছে Rosetta code. এটা একটা আইডিয়া যেটার গোল হলো একই প্রবলেমের জন্য যত বেশি সম্ভব তত ল্যাঙ্গুয়েজে সমাধান বের করা। এটায় মূলত যারা অনেক প্রোগ্রামিং ল্যাঙ্গুয়েজ জানে কিংবা প্রোগ্রামিং ল্যাঙ্গুয়েজ নিয়ে রিসার্চ করে এরকম লোকেরা সাধারণত পার্টিসিপেট করে। Rosetta এর ওয়েবসাইটে প্রায় সাড়ে চারশ প্রবলেম আছে। আর ৯০০ এর বেশি ভাষায় এই প্রবলেমগুলা সল্ভ করা হয়েছে।
শুরুতে বললাম যে সফটওয়্যার কিংবা ওয়েবসাইট বানানো বাদে কীভাবে মজার জন্য কোড করা যায়। কিন্তু আবার সেখানে ফিরে যাচ্ছি। অনেকে আছে যারা সারাদিন চিন্তা করে একটা কুইন লিখতে আগ্রহী না কিংবা নিজের এসোটেরিক ভাষা বানানোর জন্য আইডিয়াও পায় না। তাছাড়া এসব জিনিস তো মানুষকে দেখানোও যাবে না। সেক্ষেত্রে রিক্রিয়েশনের জন্য ফান প্রজেক্ট বানানো-ই যায়। অনেক সময় আবার এই ফান প্রজেক্ট প্রচুর মানুষ ইউজ করতে থাকলে হয়তো বড়লোকও হয়ে যাওয়া যাবে… বিলিয়ন ডলার কোম্পানি গিটহাব কিন্তু এভাবেই শুরু হয়েছিল!
যাই হোক, এত লম্বা লেখা লিখার একটাই উদ্দেশ্য, কোডিং যে একটা খুবই ফান ব্যাপার এইটা সবাইকে বলা। দাবা কিংবা গণিতের মতো কোডিং দিয়েও যে বুদ্ধি ঝালাই করা যায় এটা যেন মানুষ অনুধাবন করে।
এইতো! হ্যাপি কোডিং!
Additional Resources
- Esolang - The Esoteric Programming Language Wiki - https://esolangs.org/wiki/Main_Page
- The O Programming Language - https://o.readthedocs.io/en/latest/
- IOCCC - https://www.ioccc.org/
- Rosetta Code - https://rosettacode.org/wiki/Rosetta_Code
- JSFuck Compiler - http://www.jsfuck.com/
- Genetic Algorithm to Find Brainfu*k Code- https://github.com/Aluriak/bfia
- Brainfu*k Tic-Tac-Toe - https://github.com/mitxela/bf-tic-tac-toe