Lecture 2 | We Need Freedom, We have to Stop Technology War । Full Stack Army

Lecture 2 | We Need Freedom, We have to Stop Technology War । Full Stack Army

We Need Freedom, We have to Stop Technology War

লাস্ট ক্লাসে আমরা যে সমস্ত টেকনোলজির নাম দেখেছিলাম তাতে অনেকেরই ভয় পাওয়া স্বাভাবিক যে এত এত জিনিস কিভাবে আমি শিখবো। আপনাদের ভয় পাওয়ার কোনো প্রয়োজন নেই। টেকনোলজি শেখার খুব ভাল উপায় হচ্ছে কোনোকিছুতে মাস্টার হওয়া যাবে না একবারেই। ধীরে ধীরে হতে হবে। ধরেন আপনি এইচটিএমএল দিয়ে শুরু করলেন। এখন আপনি এইচটিএমএলের একদম সমস্ত বিষয় জেনে তারপর সিএসএসে যেতে চান তাহলে আপনার আর যাওয়া হবে না। উপায় কী? উপায় হলো এইচটিএমএলের একটা বেসিক আন্ডারস্ট্যান্ডিং নেয়া। যেমন কিভাবে এইচটিএমএল স্ট্রাকচার লিখতে হয়, কিভাবে লে-আউট করতে হয়, কিভাবে টেক্সট, ইমেজ অ্যাড করতে হয় মানে জাস্ট বেসিকটা নিয়ে সিএসএসে জাম্প করা। আপনি সিএসএস শিখতে গেলে আল্টিমেটলি আপনার এইচটিএমএল লাগবেই। তখন যখন আপনার মনে হবে এইচটিএমএলের এই জিনিসটাতো আমি জানিনা তখন আপনি পিছনে এসে ওটা দেখে আবার সামনে যাবেন। এবার সিএসএসের যে সব শিখতে হবে তা নয়। দৈনন্দিন আপনার যা লাগবে তাই শিখে জাভাস্ক্রিপ্টে জাম্প করেন। কারণ জাভাস্ক্রিপ্ট শিখতে গেলে আপনাকে এইচটিএমএল সিএসএস লিখতেই হবে। সুতরাং কিছু বাদ গেলে তা শেখা যাবেই। চিন্তার কিছু নেই।

আপনি কোনো জিনিস শিখতে গেলে যখন কোনো একটা টপিক বুঝবেন না তখন সেটা স্কিপ করে যান। একসময় গিয়ে দেখবেন যেটা বুঝেননি সেটা বুঝার জন্য যে ধরণের ব্রেইনস্টর্মিং দরকার তা হয়ে যাবে। এরপর একটু ব্যাকে এসে তা শিখে নিন। এভাবে হলে কোনো জিনিস শিখতে আপনার বেশি সময় লাগবে না। এবং ভয়ও লাগবে না।

Today's Agneda

এবার আমাদের আজকের এজেন্ডায় আসা যাক। আজকের এজেন্ডাগুলো হলোঃ

  • We need freedom, we need to stop technology war
  • Why do we need programming language?
  • Why different programming languages for client & server?
  • Understanding programming paradigms.
  • Programming is always same, but the language varies.

Why do we need programming language?

একটা অ্যাপ্লিকেশনের জন্য যে যে স্টেপ লাগবে তা হলোঃ

  • Requirements
  • Design
  • Implementation
    • UI/UX Design
    • Web Design
    • Frontend Development
    • Backend Development
    • Test Code
  • Testing, Deployment
  • Maintenance

উপরোক্ত স্টেপগুলোর মধ্যে থেকে আমাদের Implementation স্টেপে মূলত প্রোগ্রামিং ল্যাঙ্গুয়েজ লাগছে। আরো স্পেসিফিকভাবে বলতে গেলে ফ্রন্টএন্ড এবং ব্যাকএন্ড ডেভেলপমেন্টে প্রোগ্রামিং ল্যাঙ্গুয়েজ লাগছে। এখন প্রশ্ন হলো কেন লাগছে। প্রোগ্রামিং ল্যাঙ্গুয়েজ দিয়ে আমরা কী করি? সহজ ভাষায় বলতে গেলে প্রোগ্রামিং ল্যাঙ্গুয়েজ একটা কাজই করে। সেটা হলো আমরা প্রোগ্রামিং ল্যাঙ্গুয়েজ দিয়ে কিছু কোড লিখি যা দিয়ে আমাদের কম্পিউটার বুঝতে পারে আমরা কি বুঝাতে চাইছি। প্রোগ্রামিং ল্যাঙ্গুয়েজের মাধ্যমে আমরা কোনো রিয়েল লাইফ প্রব্লেম কম্পিউটারকে বুঝাতে পারি। এই কাজ বাদে দুনিয়ার কোনো প্রোগ্রামিং ল্যাঙ্গুয়েজের আর কোনো কাজ নেই। যদিও প্রতিটা ল্যাঙ্গুয়েজ আসার পিছনে বিভিন্ন কারণ আছে। কিন্তু কাজ ঘুরেফিরে একটাই। প্রতিটা ল্যাঙ্গুয়েজ কোনো না কোনোভাবে আমার আর কম্পিউটারের মাঝে একটা ট্রান্সলেটর হিসেবে কাজ করছে। ধরুন, একজন আমেরিকান মানুষ, তার সাথে কমিউনিকেট করতে হবে। এখন চাইনিজরা চাইনিজ ট্রান্সলেটর আনবে, জার্মানরা জার্মান ট্রান্সলেটর, স্প্যানিশরা স্প্যানিশ ট্রান্সলেটর। কিন্তু উদ্দেশ্য একটাই। কম্পিউটাররূপী আমেরিকানের সাথে কমিউনিকেট করা। স্বাভাবিকভাবেই জার্মান, চাইনিজ বা স্প্যানিশদের ইংলিশ একসেন্ট তো আর আমেরিকান একসেন্টের মতো হবে না। ভাষাগত একটু পার্থক্য থাকবে। কিন্তু উদ্দেশ্য যেটা যে আমেরিকানের সাথে কমিউনিকেট করা সেটা সফল।

Why different programming languages for client & server?

একটা বড় প্রশ্ন আছে। যদি সব ল্যাঙ্গুয়েজই কম্পিউটারের সাথে কমিউনিকেট করার জন্য হয় তাহলে এত ল্যাঙ্গুয়েজ কেন? এর উত্তর বিভিন্নভাবে দেয়া যায়। ধরেন আমরা বাংলাদেশী। এখন আমরা যখন ইংরেজিতে কিছু বুঝাতে চাইবো তখন আমরা আমাদের মধ্য থেকে একজনকে ট্রান্সলেটর হিসেবে নিয়োগ দিবো। এরকম ভারতীয়রা ভারতীয়দের, জার্মানরা জার্মানদের, চাইনিজরা চাইনিজদের নিয়োগ দিবে। প্রতিটা দেশ তাদের মতো করে তাদের প্রব্লেম সলভ করার জন্য তাদের মতো করে ট্রান্সলেটর নিয়োগ দিবে। সেরকম যখন মাইক্রোসফট একটা প্রোগ্রামিং ল্যাঙ্গুয়েজ তৈরি করেছে তখন তারা তাদের প্রব্লেম সলভ করার জন্য প্রোগ্রামিং ল্যাঙ্গুয়েজটা তৈরি করেছে। যখন অ্যাপল একটা প্রোগ্রামিং ল্যাঙ্গুয়েজ তৈরি করেছে তখন তারা তাদের প্রোডাক্টের সাথে খাপ খায় এমন একটা প্রোগ্রামিং ল্যাঙ্গুয়েজ তৈরি করেছে। যখন ডেনিস রিচি ইউনিক্স অপারেটিং সিস্টেম তৈরি করতে গিয়ে আটকে গেলেন তখন তিনি ঐ সময়কার প্রব্লেম সলভ করার জন্য প্রোগ্রামিং ল্যাঙ্গুয়েজ তৈরি করেছেন। এরপর সি যেসব প্রব্লেম সলভ করতে পারছিল না সেসব সলভ করার জন্য অবজেক্ট অরিয়েন্টেড ভিত্তিক ল্যাংগুয়েজ সি++ আসলো। সান মাইক্রোসিস্টেম যখন আসলো তখন তারা তাদের প্রব্লেম সলভ করার জন্য জাভা প্রোগ্রামিং ল্যাঙ্গুয়েজ তৈরি করলো। তাহলে দেখা যাচ্ছে প্রতিটা কোম্পানি তাদের নিজস্ব প্রব্লেম সলভ করার জন্য বিভিন্ন প্রোগ্রামিং ল্যাঙ্গুয়েজ তৈরি করেছে।

আজকে জাভাস্ক্রিপ্ট নিয়ে এত তোলপাড়। এই জাভাস্ক্রিপ্ট মেইনলি আসার পিছনে কারণ ছিল ব্রাউজারের এইচটিএমএলে কিছু interactivity যোগ করা। এটাই ছিল আসল কারণ। জাভা যখন এসেছিলো তখন উদ্দেশ্য ছিল পোর্টেবল ডিভাইসে (এমবেডেড ডিভাইস, মিডিয়া প্লেয়ার, সিডি প্লেয়ার) প্রোগ্রাম রান করা। সি আসার উদ্দেশ্য অপারেটিং সিস্টেম ডিজাইন করা। সুতরাং দেখা যাচ্ছে একেকটা প্রোগ্রামিং ল্যাঙ্গুয়েজ একেকটা কারণে বাজারে এসেছে। তাই তাদের ফ্লেভারও ভিন্ন ভিন্ন। কিন্তু উদ্দেশ্য একটাই, প্রব্লেম সলভ করা। আমাদের মানুষের সাথে কম্পিউটারের কমিউনিকেশন তৈরি করা।

পিএইচপি আসার একটা সুন্দর ইতিহাস আছে। যখন ওয়েব আসলো তখন ওয়েবসাইট সুন্দর করে তৈরি করার জন্য একটা স্ক্রিপ্টিং ল্যাঙ্গুয়েজের প্রয়োজন ছিল। যেটা এক্সিস্টিং কোনো ল্যাঙ্গুয়েজ সলভ করতে পারছিলো না। তখন ছিল ওয়েব ১.০। শুধু ডাটা পাস হবে। সেই উদ্দেশ্যে ক্রিয়েটর পিএইচপি তৈরি করেন। পরবর্তীতে তা যথেষ্ট জনপ্রিয়তা লাভ করে।

প্রত্যেকটা ল্যাঙ্গুয়েজের একটা নির্দিষ্ট উদ্দেশ্য আছে। কে তৈরি করছে তার প্রয়োজন অনুসারে সামান্য পরিবর্তন হচ্ছে। কিন্তু ঐ যে বললাম উদ্দেশ্য সবার একই। প্রব্লেম সলভ করা।

এখন আমাদের মেইন প্রশ্নে আসি। ডিফারেন্ট ল্যাঙ্গুয়েজ কেন প্রয়োজন ক্লায়েন্ট এবং সার্ভারের জন্য?

প্রথম প্রশ্ন হলো প্রোগ্রামিং ল্যাঙ্গুয়েজ রান করে কোথায়? অবশ্যই একটা মেশিনে। কম্পাইলারে কোড কম্পাইল হওয়ার পর আল্টিমেটলি মেশিনে রান হয়। সেটা হতে পারে কম্পিউটার, সেটা হতে পারে টিভি, সেটা হতে পারে ফ্রিজ। মোটকথা যেখানে প্রসেসর আছে, কিছু র‍্যাম আছে, কিছু মেমোরি স্টোরেজ আছে যেখানে আমার কোডটা রাখা যাবে আর একটা কম্পাইলার ইনস্টল করা যাবে সেখানেই প্রোগ্রাম রান করানো যাবে।

যদি তাই হবে তাহলে আমার ব্রাউজার বা ক্লায়েন্টের জন্য এক ধরণের ল্যাঙ্গুয়েজ আর সার্ভারের জন্য অন্যধরণের ল্যাঙ্গুয়েজ কেন? এই ওয়েবের জগতে ওয়েবসাইটের ফ্রন্টএন্ডের যে সেকশনটা আছে সেটার প্রোগ্রাম রান হবে একটা ব্রাউজারে। এখন ব্রাউজার তো কম্পিউটার না। ব্রাউজার হলো কম্পিউটারের মধ্যে থাকা ছোট একটা সফটওয়্যার। আপনি কম্পিউটারে চাইলে সি, সি++, জাভা, পাইথন ইত্যাদি যেকোনো কম্পাইলার ইনস্টল করতে পারবেন। কিন্তু ব্রাউজারে তো এতো কিছু সম্ভব না। সেজন্য ব্রাউজার বানানোর সময় জাভাস্ক্রিপ্ট নামক একটা ল্যাঙ্গুয়েজ সেখানে দিয়ে দেয়া হয়েছে। সুতরাং আমাদের জাভাস্ক্রিপ্ট শিখতে হবে ব্রাউজারের ইন্টের‍্যাক্টিভ ফিচারগুলো অ্যাড করার জন্য। আর কোনো ল্যাঙ্গুয়েজ এখানে কাজ করবে না। সুতরাং আমাকে ওয়েব অ্যাপ ডেভেলপ করতে হলে অবশ্যই জাভাস্ক্রিপ্ট শিখতেই হবে। যদি কাল এমন কোনো ব্রাউজার বাজারে চলে আসে যে তার কাজ হবে পাইথনে তাহলে আমাদের ফ্রন্টএন্ডের কাজ করার জন্য অবশ্যই পাইথন শিখতে হবে। কিছু করার নাই। কিছু মানুষ সিদ্ধান্ত নিয়েই নিয়েছে ব্রাউজারে জাভাস্ক্রিপ্ট ছাড়া আর কোনো ল্যাঙ্গুয়েজ তারা সহ্য করবে না। তাই আমাদের জাভাস্ক্রিপ্ট শেখার বিকল্প নেই ফ্রন্টএন্ডের জন্য। এবার আসি সার্ভারের ব্যাপারে। এটাই হলো আল্টিমেট মেশিন। আমরা যে রিকোয়েস্টগুলো পাঠাই এটি তা সার্ভ করে, তাই এর নাম হচ্ছে সার্ভার। আমরা যদি বলি এই পেইজটা দাও বা এই ইমেজটা দাও বা এই পোস্ট বা ভিডিওটা দাও, সে সার্ভ করে দিলো। বেসিক্যালি এটা একটা কম্পিউটার। কম্পিউটারে যেকোনো প্রোগ্রামিং ল্যাঙ্গুয়েজ রান করতে পারে।

তাহলে দেখা যাচ্ছে ব্রাউজার বা ক্লায়েন্টের জন্য আমরা জাভাস্ক্রিপ্টের বাইরে যেতে পারি না। কিন্তু যেহেতু সার্ভার একটি কম্পিউটার আর কম্পিউটারে যেকোনো ল্যাঙ্গুয়েজ রান করানো যায় সুতরাং আমরা সার্ভারের ল্যাঙ্গুয়েজ সিলেক্টের ব্যাপারে উন্মুক্ত। আমরা সি, সি++, জাভা, গো, পাইথন, এমনকি অ্যাসেম্বলি ল্যাঙ্গুয়েজ ব্যবহার করেও একটা সার্ভার সাইড অ্যাপ্লিকেশন বানিয়ে ফেলতে পারি। কিন্তু ডিফারেন্ট ল্যাঙ্গুয়েজের দিন ছিল ২০০৯ সাল পর্যন্ত। ২০০৯ সালের আগ পর্যন্ত জাভাস্ক্রিপ্টকে ব্রাউজারের বাইরে কেউ কল্পনাও করতে পারেনি। তাই একরকম বাধ্য হয়েই তখন ব্রাউজার বা ক্লায়েন্টের জন্য জাভাস্ক্রিপ্ট আর সার্ভারের জন্য পাইথন, পিএইচপি, রুবি ইত্যাদি ল্যাঙ্গুয়েজ শিখতে হতো। এজন্য আমাদের মাল্টিপল ল্যাঙ্গুয়েজের প্রয়োজন ছিল। কিন্তু রায়ান ডেলকে ধন্যবাদ তিনি Nodejs ক্রিয়েট করার কারণে এখন আর ক্লায়েন্ট আর সার্ভারের জন্য মাল্টিপল ল্যাঙ্গুয়েজ শিখতে হয় না। এক জাভাস্ক্রিপ্ট শিখলেই ফ্রন্টএন্ডের কাজও করা যায়, আবার API বানানো যায়, ব্যাকএন্ড বানিয়ে ফেলা যায়। নোড জেএস একটা রেভ্যুলেশন। ডেভেলপমেন্ট জগতকে আরো সহজ করার পাশাপাশি জাভাস্ক্রিপ্টকে সার্ভার সাইড ল্যাঙ্গুয়েজ হিসেবে শক্ত অবস্থানে আজ পৌঁছে দেয়ার কৃতিত্ব নোড জেএস এবং অবশ্যই রায়ান ডেলের।

তবে একটা ল্যাঙ্গুয়েজ দিয়ে দুইদিকেই কাজ করতে পারলেও সার্ভার সাইডের জন্য আমরা উন্মুক্ত। আমরা যেকোনো ল্যাঙ্গুয়েজ দিয়েই সার্ভার সাইড অ্যাপ্লিকেশন বানাতে পারি।

এখন আমি ব্রাউজারের জায়গায় যদি মোবাইল নিয়ে আসি তাহলে কী হবে? মোবাইলের নরমালি আমরা দুইটা অপারেটিং সিস্টেমের সাথে পরিচিত। অ্যান্ড্রয়েড এবং আইওএস। আইওএস বানিয়েছে অ্যাপল। সে রেস্ট্রিক্টেড করে দিলো আমার অপারেটিং সিস্টেমে সুইফট (Swift) আর অবজেক্টিভ সি ছাড়া কোনো ল্যাঙ্গুয়েজ আমি ঢুকতে দিবো না। কিন্তু অ্যান্ড্রয়েডের কোনো ব্যারিয়ার নাই। সেখানে সি++, কটলিন, জাভা যেকোনো ল্যাঙ্গুয়েজ দিয়েই অ্যাপ বানানো যেতে পারে। শুধু এই তিন ধরণের ল্যাঙ্গুয়েজ দিয়েই যে অ্যান্ড্রয়েড অ্যাপ বানানো যায় তা নয়। আমরা যদি অপারেটিং সিস্টেম ভাংতে পারি, মানে অ্যান্ড্রয়েড ফোন রুট করতে পারি তাহলে পুরো সিস্টেমের এক্সেস মেশিনের কাছে চলে আসবে। আর এক্সেস আসার পরে যেহেতু মোবাইল একটা মেশিন, এর প্রসেসর, র‍্যাম, হার্ডডিস্ক সব আছে সুতরাং এখানে যেকোনো বাইনারি কোড রান করানো যাবে। এখন আমরা অ্যান্ড্রয়েডে লিনাক্স ইউজ করতে পারি, প্রোগ্রামিং করতে পারি কারণ এটা একটা মেশিন। এতে যেকোনো ল্যাঙ্গুয়েজ রান করানো যাবে। কিন্তু আইওএসের ক্ষেত্রে ওরা ব্যারিয়ার তৈরি করে রেখেছে, সেখানে কিছু করার নেই।

সারমর্মঃ ক্লায়েন্টের জন্য শুধুই জাভাস্ক্রিপ্ট আর সার্ভারের জন্য জাভাস্ক্রিপ্টসহ যেকোনো ল্যাঙ্গুয়েজ। আর মোবাইলের ক্ষেত্রে আইওএসে সুইফট আর অবজেক্টিভ সি ছাড়া অন্য ল্যাঙ্গুয়েজ ব্যবহার করা যায় না, আর অ্যান্ড্রয়েডের ক্ষেত্রে কোনো ব্যারিয়ার নেই।

Understanding programming paradigms

এই যে প্রোগ্রামিং এর যুদ্ধ তার মূলে হলো এই প্রোগ্রামিং প্যারাডাইম। এখন প্যারাডাইম মানে কী? বইয়ের ভাষায় বলতে গেলে অনেক কমপ্লেক্স হয়ে যাবে। সহজ ভাষায় বললে বলতে হয় এটা অনেকটা ক্যাটাগরির মতো। যেমন এই প্রোগ্রামিং ল্যাঙ্গুয়েজ এই ধরণের কাজ করবে, ঐ প্রোগ্রামিং ল্যাঙ্গুয়েজ ঐ ধরণের কাজ করবে। এভাবে সব ল্যাঙ্গুয়েজকে বিভিন্ন ক্যাটাগরির মধ্যে ফেলাকে প্রোগ্রামিং প্যারাডাইম বলে।

আমদেরকে যখন প্রোগ্রামিং শেখানো হয় তখন প্রোগ্রামিং এর মতো করে শেখানো হয় না। হয় ল্যাঙ্গুয়েজ স্পেসিফিকভাবে। এখন অনেকদিন ধরে একটা ল্যাঙ্গুয়েজ শিখতে শিখতে তার প্রতি ভালবাসা থেকে বলেন বা অন্য ল্যাঙ্গুয়েজ শেখার প্রতি অনীহা থেকেই বলেন আমরা একটা ল্যাঙ্গুয়েজের উপর স্পেসিফিক হয়ে যাই। কিন্তু যদি abstractly আমাদের প্রোগ্রামিং শেখানো হতো তাহলে আর ল্যাঙ্গুয়েজ নিয়ে আমাদের ভাবতে হতো না। নিজেদের প্রয়োজনে যেকোনো ল্যাঙ্গুয়েজ আমরা সহজেই বুঝে নিয়ে ব্যবহার করতে পারতাম। এখন সেটার জন্য দরকার প্রোগ্রামিং ল্যাঙ্গুয়েজগুলো কি কি প্রব্লেম সলভ করে তার একটা শ্রেণীবিন্যাস করা। আর এক্ষেত্রে তা হলো প্রোগ্রামিং প্যারাডাইম।

প্রোগ্রামিং এর মূলত দুইটা প্যারাডাইম আছে। যথাঃ ১. ইম্পেরেটিভ প্যারাডাইম ২. ডেক্লারেটিভ প্যারাডাইম উইকিপিডিয়ার মতে ইম্পেরেটিভ প্যারাডাইম হলো, in which the programmer instructs the machine how to change its state এবং ডেক্লারেটিভ প্যারাডাইম হচ্ছে, in which the programmer merely declares properties of the desired result, but not how to compute it

এখন একটু সহজ করে বুঝানো যাক। ধরেন আপনি কাউকে বললেন, ভাই আমি এই বইয়ের নামটা লিখে দিলাম। আপনি নীলক্ষেত থেকে কষ্ট করে বইটা কিনে আনেন। আমি শুধু বলেছি নীলক্ষেত থেকে বই কিনে আনতে। আমি বলিনি কিভাবে যাবে। সেটা যে যাবে তার উপর নির্ভর করবে। এটা হলো ডেক্লারেটিভ প্যারাডাইম। তাহলে এবার সংজ্ঞা থেকে বুঝুন যেখানে প্রোগ্রামার জাস্ট রেজাল্টটা আসার জন্য প্রোপার্টিজ ডিক্লেয়ার করবে, কিন্তু বলবে না কিভাবে সেটা করতে হবে।

এবার আসা যাক ইম্পেরেটিভ প্যারাডাইমের কাছে। ধরেন আমি সেই বই কিনে আনতে বললাম কিন্তু প্রোপার ইনস্ট্রাকশন দিয়ে। ইনস্ট্রাকশনগুলো নিচে দেয়া হলোঃ

  • ধরলাম আমার বাসা ফার্মগেইট। বললাম আপনি ফার্মগেটের গোল চত্ত্বরে যাবেন।
  • সেখানে ১০ নম্বর বাস পাবেন। সেটাতে উঠে ১০ টাকা ভাড়া দিবেন।
  • এরপর নীলক্ষেতের ঠিক মোড়ে নামবেন।
  • মোড়ে নামার পরে বামদিকে তাকাবেন।
  • তাকানোর পর একটা লাইব্রেরি পাবেন।
  • লাইব্রেরিতে ঢুকে যাবেন।
  • ঢুকার পর দেখবেন অমুক বুক হাউজ নামে একটা হাউজ আছে
  • সেই হাউজে ঢুকে এই বইয়ের দাম জিজ্ঞেস করবেন।
  • বইয়ের দাম যদি ২০০ টাকার মধ্যে হয় তাহলে কিনবেন।
  • যদি বেশি হয় পাশের দোকান যাবেন।
  • গিয়ে দেখবেন বইটা আছে কিনা।
  • যদি থাকে দাম জিজ্ঞেস করে যদি ২০০ টাকার মধ্যে হয় তাহলে কিনবেন।
  • কিনে এরপর আবার নীলক্ষেত মোড়ে আসবেন।
  • এসে ১০নাম্বার বাসে উঠে আগের মতো ফার্মগেইট চত্ত্বরে নামবেন।
  • এরপর আমার বাসায় বইটা নিয়ে আসবেন। এবার সংজ্ঞা থেকে বুঝুন ইম্পেরেটিভ প্যারাডাইমে প্রোগ্রামার মেশিনকে সুনির্দিষ্ট নির্দেশনা দিয়ে দিচ্ছে কিভাবে কী করতে হবে। এটাকে বলে ইম্পেরেটিভ প্যারাডাইম।

Imperative Paradigm

ধরেন কেউ গ্রাম থেকে আসছে। সে ঢাকা চেনে না। তাকে স্টেপ বাই স্টেপ ইনস্ট্রাকশন দিয়ে যেতে হবে। মানে মেশিনের খুব কাছাকাছি ল্যাঙ্গুয়েজ যেগুলো সেগুলোকে ইনস্ট্রাক্টশন দিয়ে যেতে হবে লাইন বাই লাইন। সেক্ষেত্রে সি, সি++, জাভা এগুলোকে বলে লো লেভেল ল্যাঙ্গুয়েজ মানে মেশিনের খুব কাছাকাছি। জেনারেশনের দিক দিয়ে ভাবলে এগুলো সবই হাই লেভেল। কিন্তু যেহেতু এগুলো সব মেশিনের কাছাকাছি তাই এদের লো লেভেল ল্যাঙ্গুয়েজ হিসেবে গণ্য করার যায়। এগুলো উপর ভিত্তি করে ইম্পেরেটিভ প্যারাডাইমের ল্যাঙ্গুয়েজকে দুইভাগে ভাগ করা যায়- প্রোসিডিউরাল প্রোগ্রামিং এবং অবজেক্ট অরিয়েন্টেড প্রোগ্রামিং।

  • প্রোসিডিউরাল - প্রোসিডিউরাল হলো কোনো গ্রুপ নাই, স্টেট নাই, কারো সাথে কারো সম্পর্ক নাই, একটা ফাইল ক্রিয়েট করে ইনস্ট্রাকশন লেখা শুরু করলাম টপ টু বটম। এটাই হচ্ছে প্রোসিডিউরাল। উইকিপিডিয়ার ভাষায় - which groups instructions into procedures

  • অবজেক্ট অরিয়েন্টেড - আমরা আগের মতোই একটা ফাইল ক্রিয়েট করবো। প্রোসিডিউরালে শুধু আমরা বিভিন্ন ভ্যারিয়েবল ডিক্লেয়ার করে বর্ণনা করেছি। কোনো লজিক্যাল গ্রুপ ছিল না। অবজেক্ট অরিয়েন্টেডেও আমরা বর্ণনা দিবো। কিন্তু লজিক্যাল গ্রুপে ভাগ করে। এখন আগের উদাহরণই যদি আমরা ধরি, তাহলে আমরা সেখানে বই কেনার জন্য একটা ক্লাস তৈরি করতে পারি। যেমন বই কোথায় পাওয়া যাবে, কোন বই, কিভাবে দাম করতে হবে ইত্যাদি। এরপর আমরা ট্রান্সপোর্টেশনের জন্য আমরা একটা ক্লাস বানাবো। কিভাবে ফার্মগেইট থেকে নীলক্ষেত যেতে হবে সেই ইনস্ট্রাকশন দিয়ে। এই যে দুইটা ভিন্ন ক্লাস বানালাম সেখানে একটা ক্লাসের অন্য ক্লাসের ইনফরমেশনের কোনো দরকার নেই। দুইটা ভিন্ন ভিন্ন গ্রুপ। অবজেক্ট অরিয়েন্টেডের সুবিধা হলো ক্লাসগুলো আমরা পুনরায় ব্যবহার করতে পারি। এখন ক এবং খ দুইজন ব্যক্তি। ক ঢাকায় থাকে, খ গ্রামে থাকে। এখন ক এর জন্য আমার ট্রান্সপোর্টেশনের ক্লাসটা সম্পূর্ণ ইনভ্যালিড। কারণ তাকে ঢাকা চেনাতে হচ্ছে না। তাকে শুধু বইয়ের ইনস্ট্রাকশন দিলেই হচ্ছে। সেক্ষেত্রে শুধু বইয়ের ক্লাস কাজে লাগবে। কিন্তু খ এর ক্ষেত্রে ট্রান্সপোর্টেশন এবং বই দুইটা ক্লাসই দরকার হবে। কারণ সে ঢাকা চেনে না। এক্ষেত্রে বইয়ের ক্লাস পুনরায় ইউজ করা যাচ্ছে। যদি প্রোসিডিউরাল হতো তাহলে ক এর জন্য কিছু কোড যুক্তিহীন হয়ে যাবে, কারণ তার জন্য ট্রান্সপোর্টেশনের কোড খাটবে না। আবার ধরা যাক গ ঢাকার বাইরে থাকেন, কিন্তু নীলক্ষেতে উনার পরিচিত মানুষ আছেন। তাহলে তার ক্ষেত্রে বই কেনার ইন্সট্রাকশন প্রয়োজন নাই। তার দরকার শুধু ট্রান্সপোর্টেশনের ইন্সট্রাকশন। তাহলে আপনারা বুঝতে পারছেন যে অবজেক্ট অরিয়েন্টেডের কি কি সুবিধা।

এখন যদি আপনি অবজেক্ট অরিয়েন্টেড ভালভাবে বুঝে নেন, ল্যাঙ্গুয়েজ স্পেসিফিকভাবে না, তাহলে যেকোনো ল্যাঙ্গুয়েজেই আমরা অবজেক্ট অরিয়েন্টেড অ্যাপ্লাই করতে পারবে। ল্যাঙ্গুয়েজ কোনো বিষয় না। থিওরি বুঝলে আপনি যেকোনো ল্যাঙ্গুয়েজেই ঐ থিওরি অ্যাপ্লাই করতে পারবেন। শুধু সিনট্যাক্স শিখলেই হবে।

Declarative Paradigm

ডেক্লারেটিভ প্রোগ্রামিং হলো আগে যেটা বলেছিলাম শুধু বই কিনে নিয়ে আসতে বলবো। এবার সে কিভাবে যাবে, কিভাবে দরাদরি করবে সেটা তার বিষয়। আমার তাতে কোনো মাথাব্যাথা নেই। আমার বই পেলেই হলো।

ডেক্লারেটিভ প্যারাডাইমে আছে ফাংশনাল প্রোগ্রামিং, লজিক প্রোগ্রামিং, ম্যাথমেটিক্যাল প্রোগ্রামিং এবং রিয়্যাক্টিভ প্রোগ্রামিং।

  • লজিক প্রোগ্রামিংঃ সিস্টেম ডিজাইন রিলেটেড কোনো কাজ থাকলে এটা নিয়ে কাজ করা হয়। উইকিপিডিয়ার ভাষায়, in which the desired result is declared as the answer to a question about a system of facts and rules
  • ম্যাথমেটিক্যাল প্রোগ্রামিংঃ এটা তারা ব্যবহার করে যারা অপটিমাইজ সল্যুশন আনার জন্য কাজ করেন। উইকিপিডিয়ার ভাষায়, in which the desired result is declared as the solution of an optimization problem

ডেভেলপমেন্টের জন্য এই দুইটা জিনিস আমাদের কখনও দরকার হয় না। তার জন্য দরকার ফাংশনাল এবং কিছু কিছু ক্ষেত্রে রিয়্যাক্টিভ।

  • ফাংশনাল প্রোগ্রামিংঃ এটা অনেকটা অবজেক্ট অরিয়েন্টেডের মতোই। কিন্তু অবজেক্ট অরিয়েন্টেডে আমরা যেভাবে ডিটেইলস ইন্সট্রাকশন লিখে রাখি একটা গ্রুপের জন্য এখানে সেটা তা আমাদের জন্য কেউ না কেউ আগেই লিখে রেখেছে। আমাদের কাজ হচ্ছে জাস্ট কি করতে হবে সেটা কল করা। ডেক্লারেটিভ প্যারাডাইমের বেলায় একটা জিনিস খেয়াল রাখতে হবে আমাদের জন্য ইন্সট্রাকশন কেউ ইম্পেরেটিভ ওয়েতে লিখে রেখেছে আমরা শুধু তা ইউজ করব। সেজন্যই একে বলে ডেক্লারেটিভ। যেমন আমরা যখন array.map() বা array.reduce() ব্যবহার করি আমরা জানিনা এর পিছনের কোডটা কিভাবে লেখা আছে। আমাদের জানতেও হবে না। আমরা শুধু ডিক্লেয়ার করবো। উইকিপিডিয়ার ভাষায়, in which the desired result is declared as the value of a series of function applications

  • রিয়্যাক্টিভ প্রোগ্রামিংঃ এটা মূলত ব্যবহার করা হয় Asynchronous টাস্কের ক্ষেত্রে। উইকিপিডিয়ার ভাষায়, in which the desired result is declared with data streams and the propagation of change। এখানে যে data streams and the propagation of change এর কথা বলা হচ্ছে এগুলো সবই Asynchronous tasks. যেমন আপনি কোনো একটা বাটনে ক্লিক করলেন। সেটার জন্য একটা রেসপন্স পেলেন, সেই রেসপন্সের কারণে একটা জায়গার স্টেট চেইঞ্জ হলো। সেটার ফলে আরো দশটা জায়গায় চেইঞ্জ হলো। এটা হলো রিয়্যাক্টিভ প্রোগ্রামিং। svelte, vue, angular এরা সবই রিয়্যাক্টিভ ওয়েতে কাজ করে। কিন্তু react ভিন্ন ওয়েতে কাজ করে। সেটা অন্য কোনো জায়গায় আলোচনা করা হবে। রিয়্যাকশনের মানে হলো কিছু একটা ঘটার কারণে অন্য কোনো জায়গায় ডাটা চেইঞ্জ হচ্ছে। এটাই রিয়্যাক্টিভ প্রোগ্রামিং এর কনসেপ্ট। আর এটাও ডেক্লারেটিভ, কারণ আমার বিহাইন্ড দ্য সীন কি হচ্ছে জানার দরকার নেই। আমি শুধু ডিক্লেয়ার করবো।

এইচটিএমএলও ডেক্লারেটিভ প্যারাডাইমের মধ্যে পড়ে। কারণ আমি h1 ট্যাগ লেখার পর কোনোভাবেই বলে দিচ্ছি না তা কিভাবে কাজ করতে হবে। আমি জাস্ট ট্যাগটা লিখলাম। বাকিটা বিহাইন্ড দ্য সীন হয়ে যাচ্ছে। আরো ডিটেইলসের জন্য এই লিংক ভিজিট করতে পারেন।

এখন প্রশ্ন হলো জাভাস্ক্রিপ্ট, পাইথন এগুলো কোন ধরণের ল্যাঙ্গুয়েজ। এই বিষয় জানার আগে আমাদের একটু এই আর্টিকেল এ যেতে হবে। এটা একটা লিস্ট। ডিফারেন্ট প্রোগ্রামিং ল্যাঙ্গুয়েজ আছে ডিফারেন্ট টাইপের। যদিও এত ল্যাঙ্গুয়েজ আমাদের ডেভেলপমেন্টের জন্য লাগে না। তাও একবার চোখ বুলিয়ে নেয়া দরকার। কত টাইপের ল্যাঙ্গুয়েজ আছে, কোন ল্যাঙ্গুয়েজ কোন টাইপের মধ্যে পড়ে এসব।

এখন এখানে খেয়াল করলে দেখা যাবে যে, সি, সি++, সি#, জাভাস্ক্রিপ্ট, পাইথন এগুলো সব ইম্পেরেটিভ ল্যাঙ্গুয়েজের মধ্যে দেয়া আছে।

আবার এগুলো ফাংশনাল প্রোগ্রামিং এর মধ্যে আছে। ঘটনাটা পুরোই কনফিউজিং।

ফাংশনাল প্রোগ্রামিং ল্যাঙ্গুয়েজ দুই প্রকার। পিওর এবং ইম্পিওর। এ সমস্ত ল্যাঙ্গুয়েজ ইম্পিওর ফাংশনাল প্রোগ্রামিং ল্যাঙ্গুয়েজের মধ্যে আছে। আগে আমাদের বুঝতে হবে তাহলে পিওর এবং ইম্পিওর ফাংশনাল প্রোগ্রামিং ল্যাঙ্গুয়েজ বলতে কী বোঝায়?

  • ইম্পিওর ফাংশনাল ল্যাঙ্গুয়েজঃ এসব ল্যাঙ্গুয়েজ চাইলে আমরা ফাংশনাল, অবজেক্ট অরিয়েন্টেড, রিয়্যাক্টিভ যেকোনো ওয়েতে ব্যবহার করতে পারি। আমাদের যা ইচ্ছা আমরা সেভাবে ব্যবহার করবো। এজন্য এগুলো ইম্পিওর ফাংশনাল ল্যাঙ্গুয়েজ। মানে আমরা ফাংশনালের বাইরেও অন্যভাবে এদের ইউজ করতে পারি
  • পিওর ফাংশনাল ল্যাঙ্গুয়েজঃ এগুলো পুরোপুরিই ফাংশনাল।

তার মানে আমাদের কোন ল্যাঙ্গুয়েজে এগুলো কিভাবে অ্যাপ্লাই করবো তা নিয়ে ভাবার দরকার নাই। আমাদের দরকার শুধু এগুলো কিভাবে কাজ করে তার কনসেপ্ট এবং যেকোনো একটা ল্যাঙ্গুয়েজে এগুলোর ইমপ্লিমেন্টেশন। যদি তা পারি তাহলে যেকোনো ল্যাঙ্গুয়েজে গিয়ে আমরা এগুলো অ্যাপ্লাই করতে পারবো। জাস্ট শুধু সিনট্যাক্স শিখলেই হবে। তবে আপনি ৫ দিন ধরে গোল্যাং দেখে, ৫ বছর ধরে যিনি গোল্যাং নিয়ে কাজ করছে তার মতো করতে পারবেন না। কিন্তু প্রব্লেম সলভ করতে পারবেন ডেফিনিটলি।

এখন এই প্রোগ্রামিং প্যারাডাইম থেকে আমরা দেখলাম মূলত ৩ ধরণের প্রব্লেম সলভ করার জন্য বিভিন্ন ল্যাঙ্গুয়েজ এসেছে। যখন কিছুই ছিল না তখন প্রোসিডিউরাল ওয়েতে কোড লেখার জন্য আসলো সি। এরপর যখন কোড রিইউজের দরকার পড়লো, এন্টারপ্রাইজ লেভেলের অ্যাপ্লিকেশন তৈরির জন্য তখন আসলো জাভা, সি++ বা সহজ ভাষায় অবজেক্ট অরিয়েন্টেড প্রোগ্রামিং। এটা আমাদের অনেক প্রব্লেম সলভ করছে। আজকের দুনিয়ায় আমরা যেস বড় বড় অ্যাপ্লিকেশন দেখতে পারি এগুলো সবই হচ্ছে OOP এর ফল। এখন যেহেতু OOP ইম্পেরেটিভ প্যারাডাইম, তাই আমাদের প্রতিটা কোড লিখে লিখে ইন্সট্রাকশন দিতে হয়। সেক্ষেত্রে অনেক কোড লিখতে হয়। এই সমস্যার সমাধান করতে এসেছে ডেক্লারেটিভ প্যারাডাইমের ল্যাঙ্গুয়েজগুলো। যদিও কেউ না কেউ আমাদের জন্য লিখে রেখেছে, কিন্তু আমরা শুধু কমান্ড দিলেই কাজ হয়ে যাচ্ছে অনেক কম কোড লিখে। তাই এখন পাইথন, জাভাস্ক্রিপ্টের মতো ল্যাঙ্গুয়েজগুলো খুবই জনপ্রিয়।

এখন বুঝলাম যে ৩ ধরণের প্রব্লেম সলভ করার জন্য ল্যাঙ্গুয়েজগুলো আসছে। তাহলে ৩টা ল্যাঙ্গুয়েজ থাকলেই তো হতো। এত এত ল্যাঙ্গুয়েজ কেন? সি এর সিনট্যাক্সের সাথে তো সি++ পুরোই মিলে, জাভা, জাভাস্ক্রিপ্টের কিছু কিছু মিলে। তাহলে কি এমন দরকার পড়লো যে আমাদের নতুন ল্যাঙ্গুয়েজ ক্রিয়েট করতে হলো? এই জায়গায় আমরা বিগিনাররা একটা ভুল করে ফেলি কারণ আমরা সিনট্যাক্স দিয়ে একটা ল্যাঙ্গুয়েজ বিচার করি। সিনট্যাক্স হলো আপনার কম্পিউটারের কীবোর্ডের মতো। এখন কোন কীবোর্ডে লাইট জ্বলে, কোনোটাতে জ্বলে না, কোনোটা মেকানিক্যাল, কোনোটা সেমিমেকানিক্যাল, কোনোটাতে নামপ্যাড আছে, কোনোটাতে নেই, কোনোটাতে মিডিয়া প্লেয়ার বাটন আছে ইত্যাদি। কিন্তু কীবোর্ডের কাজটা কিন্তু সেইম। নরমাল কীবোর্ড যেগুলো সেগুলো দেখলে দেখা যাবে একই রকম। শুধু কিছু ফিচার কম বেশি। তাহলে একটা কীবোর্ড দিলেই তো হয়ে যেতো। বাজারে এত কীবোর্ড কেন? সেরকম সিনট্যাক্স হচ্ছে অনেকটা কীবোর্ডের কী এর মতো। কিছু কমবেশি থাকতে পারে কীবোর্ড ভেদে, কিন্তু ম্যাক্সিমাম কী সেইম, তার ফাংশনালিটিজও সেইম। সেরকম সিনট্যাক্সও ল্যাঙ্গুয়েজ ভেদে মিল থাকতে পারে। মূল বিষয় হচ্ছে ইমপ্লিমেন্টেশন। আমি কিভাবে ইমপ্লিমেন্ট করছি কোনো ল্যাঙ্গুয়েজ। ইমপ্লিমেন্ট বলতে বুঝাচ্ছে এই ল্যাঙ্গুয়েজটা যারা তৈরি করেছে তারা কি ভেবে তৈরি করেছে। তাদের কম্পাইলার তারা কিভাবে ডিজাইন করেছে। এটা হচ্ছে ব্যাপার। কম্পাইলার অনেকভাবে ডিজাইন করা যায়। এই কম্পাইলারের ডিজাইন এর উপর ডিপেন্ড করে আমার প্রোগ্রাম কত কম সময়ে রান করবে। এই এক্সিকিউশন টাইম, মেমোরি, গারবেজ কালেকশন মানে কপ্লাইলার আর্কিটেকচারের উপর ভিত্তি করেই এই প্রোগ্রামিং ল্যাঙ্গুয়েজগুলো চেইঞ্জ হয়। আরেকটা বিষয় আছে সেটা হলো কনকারেন্সি। কনকারেন্সি মানে হলো ধরেন আপনার কম্পিউটারে ৮টা কোর আছে। আপনি সেই ৮টি কোর ব্যবহার করেই একই সময়ে কোড রান করাতে চাচ্ছেন। এটাই কনকারেন্সি। আগে কম্পিউটার প্রসেসর ছিল সিঙ্গেল কোর। এখন মাল্টিকোর। ৩০ বছর আগের কম্পিউটারের প্রসেসিং পাওয়ার আর আজকের কম্পিউটারের প্রসেসিং পাওয়ার তো এক না। সেক্ষেত্রে কম্পাইলার বারবার চেইঞ্জ করতে হয়েছে, আপগ্রেড করতে হয়েছে, ক্ষেত্রবিশেষে নতুন ল্যাঙ্গুয়েজ তৈরি করতে হয়েছে। যেমন সি কিন্তু গারবেজ কালেক্টর না। গারবেজ কালেক্টর বলতে বুঝায় আমরা যে ভ্যারিয়েবলের মধ্যে ডেটা রাখলাম, এ্যারে তৈরি করলাম, মেমোরিতে কিছু স্টোর করলাম, এগুলো নির্দিষ্ট সময় পরপর ক্লিন করতে হয়। সি সেটা পারে না। সেজন্য আমাদের নতুন করে মেমোরি কিভাবে কাজ করছে সেটা শিখতে হচ্ছে, সেভাবে মেমোরি ক্লিন করতে হচ্ছে। এরপর যখন আমরা জাভাতে আসলাম সেখানে কিন্তু আমাদের আর গারবেজ কালেক্ট করতে হচ্ছে না। সে অটোমেটিক গারবেজ কালেক্ট করে ক্লিন করে ফেলে। সুতরাং অনেক কিছুর উপর ভিত্তি করে প্রোগ্রামিং ল্যাঙ্গুয়েজ তৈরি হয়, তেমনি কম্পাইলার ডিজাইনের উপর ভিত্তি করে ভিন্ন ভিন্ন প্রোগ্রামিং ল্যাঙ্গুয়েজ তৈরি হয়েছে। একেকটা নির্দিষ্ট কাজের জন্য একেকটা প্রোগ্রামিং ল্যাঙ্গুয়েজ তৈরি হয়েছে। কম্পাইলারের উপর ভিত্তি করে মূলত ৩ ধরণের প্রোগ্রামিং ল্যাঙ্গুয়েজ তৈরি হয়েছে। এরা হলো কম্পাইল্ড, ইন্টারপ্রেটেড, জাস্ট ইন টাইম (JIT)

  • কম্পাইল্ডঃ কম্পাইল্ড হলো আমি যে কোড লিখেছি সেটা পিওর মেশিন কোডে রূপান্তরিত হবে। মেশিন কোড বলতে বুঝানো হচ্ছে বাইনারি কোড। কম্পাইল্ড ল্যাঙ্গুয়েজগুলো বেশি ফাস্ট হয়। সি, সি++ এরা হলো কম্পাইল্ড। জাভা এক হিসাবে কম্পাইল্ড। কিন্তু পিওর কম্পাইল্ড না। কারণ মাঝখানে জেভিএম নামে একটা ভার্চুয়াল মেশিন আছে যেটাতে জাভা রান হয়। তাই জাভা সি++ এর চেয়ে অনেক স্লো। সি এর থেকে আরো স্লো। কম্পাইল্ড ল্যাঙ্গুয়েজের স্টেপ ৩টা। প্রথমে আপনি কোড লিখবেন, এরপর আপনি বিল্ড করবেন exe বা class ফাইলে, এরপর আপনি রান করবেন। এতে আপনার কম্পাইলে টাইম লাগবে কিন্তু এক্সিকিউশনে খুব কম টাইম লাগছে। তাই প্রোগ্রাম অনেক দ্রুত রান হয়। আরেকটা সুবিধা হলো কম্পাইল করার সময় যদি আপনার কোডে কোনো ভুল থাকে সে আপনাকে ধরিয়ে দেবে। এটাকে বলে কম্পাইল টাইম এরর। এগুলোতে বুট করতে টাইম বেশি লাগে, যেহেতু একটা ইন্টারমিডিয়েট প্রসেস আছে কম্পাইল করতে, কিন্তু এক্সিকিউশনে টাইম কম লাগে।
  • ইন্টারপ্রেটেডঃ এর কাজ হলো এ শুরুতেই কোড রান করে দিবে। এরপর যখন যেটা লাগবে সেটা সেভাবে রীড করে সে অনুযায়ী এক্সিকিউট করবে। যেমন পাইথন। ধরেন আপনি পাইথন কোড লিখলেন, রান বাটনে ক্লিক করলেন, সে লাইন বাই লাইন পড়বে না। তাই পুরো কোডের কোথাও যদি কোথাও ভুল থাকে সে রান করে ফেলবে, সে ধরতে পারবে না কারণ সে তো কম্পাইলই করছে না। যখন দরকার তখন সে সেই কোড পড়ে সেটা কম্পাইল করে মেশিনকে বুঝিয়ে দী। তাই এগুলোতে রানটাইম এরর বেশি পাওয়া যায়। এ সমস্ত ল্যাঙ্গুয়েজের অসুবিধা হলো এরা একটা কোড বারবার কম্পাইল করবে। তাই আমার এক্সিকিউশন টাইম অনেক বেশি লাগবে। সে কারণে ইন্টারপ্রেটেড ল্যাঙ্গুয়েজগুলো অনেক স্লো হয় কম্পাইল্ড ল্যাঙ্গুয়েজের তুলনায়। এগুলোতে বুট করতে টাইম কম লাগে, কিন্তু এক্সিকিউশনে টাইম বেশি লাগে।
  • JIT: এক্ষেত্রে ফাইলটা ইনস্ট্যান্টলি রীড করে ফেলবে। এরপর যখন যা দরকার হবে তখন সে ইন্টারপ্রেট করবে না, সরাসরি কম্পাইল করে মেশিন কোডে রূপান্তর করে ফেলবে। তাহলে কোডগুলো থেকে যাচ্ছে, বারবার আর কম্পাইল করতে হচ্ছে না। আমি রিইউজ করতে পারছি। এটাই বেসিক কনসেপ্ট।

জাভাস্ক্রিপ্ট একটা সময় ইন্টারপ্রেটেড ছিল। জাভাস্ক্রিপ্টের এই রেভ্যুলিউশনের জন্য দুইজন লোককে ক্রেডিট দিতে হয়। একজন হলেন সুন্দর পিচাই। তিনি যদি v8 engine এবং গুগল ক্রোম তৈরির কথা না ভাবতেন তাহলে আজকে জাভাস্ক্রিপ্টের এই জয়জোয়ার আসতো না। জাভাস্ক্রিপ্টকে ইন্টারপ্রেটেড থেকে JIT কম্পাইলারে নিয়ে আসার পিছনে কৃতিত্ব হচ্ছে গুগল এবং ঐ সময় তার লীডে থাকা সুন্দর পিচাই। দ্বিতীয় জন হলেন রায়ান ডেল। ঐ v8 এর উপর ভিত্তি করে তিনি জাভাস্ক্রিপ্টকে ব্রাউজারের বাইরে নিয়ে আসেন। এই JIT কম্পাইলারের কারণে জাভাস্ক্রিপ্টের ইতিহাস পালটে গেছে। কারণ একই ল্যাঙ্গুয়েজ যদি আপনি দুই জায়গায় ব্যবহার করতে চান তাহলে সেই ল্যাঙ্গুয়েজকে অনেক দ্রুত এক্সিকিউট হতে হবে। আগে সেটা জাভাস্ক্রিপ্টের ছিল না। কিন্তু v8 ইঞ্জিন আসার পর তা সম্ভব হয়েছে। এই সুযোগ আসায় জাভাস্ক্রিপ্ট দিয়ে অনেক বড় অ্যাপ্লিকেশন তৈরি করা সম্ভব হয়েছে।

গো ল্যাং এর ইতিহাস যদি আমরা দেখি, সি এর কো-অথর কেন থম্পসন চিন্তা করলেন বড় অ্যাপ্লিকেশন তৈরির জন্য সি এর সিনট্যাক্সগুলো খুব ভাল না। তাই সি খুব সুবিধা করতে পারবে না। তাই আমাদের সি এর মতো সেইম পারফরম্যান্স থাকতে হবে, কিন্তু সহজে কোড করা যায়, গারবেজ কালেক্ট করা যায়, কনকারেন্সির বিষয়বস্তু সহজ এরকম একটা ল্যাঙ্গুয়েজ আনতে হবে। গো নামটা এসেছে গো রুটিন থেকে। গো রুটিনে কনকারেন্সি এত সহজ তা কল্পনা করা যায় না। সবদিক বিবেচনা করে তিনি গো নামক একটি লো লেভেল ল্যাঙ্গুয়েজ তৈরি করলেন যা আমাদের কাছে গো ল্যাং নামে পরিচিত। এটা একটা গেইম চেইঞ্জার। কারণ আমরা পাওয়ার পাচ্ছি সি এর মতো, কিন্তু কোড লিখছি পাইথনের মতো সহজ।

তাহলে দেখেন যে সি জানে সে গো তে এসে কি আটকে যাওয়ার কথা? এত এত ল্যাঙ্গুয়েজ আসার পিছনে কারণ হচ্ছে কোনো একটা প্রব্লেম আমি এই ল্যাঙ্গুয়েজ দিয়ে সলভ করতে পারছি না সেজন্য নতুন একটা ল্যাঙ্গুয়েজ এসেছে। সি অনেক বছর আগের। তখন সেভাবে প্রব্লেম সলভ হতো। কিন্তু এখনকার দ্রুত দুনিয়ায় খাপ খাওয়াতে গো ল্যাং এর আবির্ভাব। মেইন রিজন হচ্ছে এটাই। কেউ কারো প্রতিদ্বন্ধী না। প্রত্যেকেই প্রত্যেকের উত্তরসূরী বা পূর্বসূরী।

এখন ডার্টের কথা বলি। সব ল্যাঙ্গুয়েজের বেস্ট ফিচার্স নিয়ে তারা একটা ল্যাঙ্গুয়েজ তৈরি করেছে সহজে অ্যাপ্লিকেশন ডেভেলপমেন্টের জন্য যার নাম দিয়েছে ডার্ট।

আরেকটা প্রশ্ন আসতে পারে এত আলোচনার পর। নতুন ল্যাঙ্গুয়েজ সৃষ্টি না করে কি বর্তমান ল্যাঙ্গুয়েজকে আপগ্রেড করা যেতো না? অবশ্যই যেতো, এবং করা হয়ও। ধরেন আপনি ৩০ বছর আগে ১৫ তলা একটা বিল্ডিং তৈরি করলেন। এখন আপনি কালার চেইঞ্জ করা, দরজা, জানালা চেইঞ্জ করা ছাড়া বর্তমান জমানার বিল্ডিং এ কী কনভার্ট করতে পারবেন? সম্ভব না। কারণ ৩০ বছর আগে সেটা তৈরি হয়েছিল তখনকার আর্কিটেকচার দিয়ে। এখন সেই পুরনো আর্কিটেকচার ভেঙেচুরে নতুন আর্কিটেকচারের বিল্ডিং বানানো সম্ভব না। যেমন নোড জেএস অল্প কিছদিন হলো এসেছে, তার আর্কিটেকচারই ভাঙতে পারলো না, ডেনো আনতে হলো। এটাই হলো মূল ব্যাপার।

Conclusion

আমাদেরকে শিখতে হবে থিওরি। অবজেক্ট অরিয়েন্টেড, ফাংশনাল প্রোগ্রামিং, গারবেজ কালেকশন, কনকারেন্সি এসব আমরা যখন জানবো এবং যেকোনো একটা ল্যাঙ্গুয়েজ দিয়ে ইমপ্লিমেন্ট করতে পারবো অন্য যেকোনো ল্যাঙ্গুয়েজে গিয়ে আমাদের কষ্ট করতে হবে না। আমরা যেকোনো কিছু শিখতে গেলে ল্যাঙ্গুয়েজ স্পেসিফিক হবো না, ফ্রেমওয়ার্ক স্পেসিফিক হবো না। আমরা চেষ্টা করবো abstractly তার কোর নলেজ শেখার জন্য। এরপর আমরা চেষ্টা করবো যে ল্যাঙ্গুয়েজে আছি তাতে কিভাবে অ্যাপ্লাই করবো।

References