2.4  কম্পাইলিং বনাম পলিফিলিং

 

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

const getProfile = username=>{
    return fetch(`https://api.github.com/users/${username}`)
    .then((response)=> response.json())
    .then(({data})=>({
        name: data.name,
        location: data.location,
        company: data.company,
        blog: data.blog.includes('https') ? data.blog : null
    }))
    .catch((e)=> console.warn(e))
}

 

কোডটি Babel দ্বারা কম্পাইল হবার পর এমন দেখাবে

var getProfile = function getProfile(username) {
    return fetch('https://api.github.com/users/' + username).then(function (response) {
        return response.json();
    }).then(function (_ref) {
        var data = _ref.data;
        return {
            name: data.name,
            location: data.location,
            company: data.company,
            blog: data.blog.includes('https') ? data.blog : null
        };
    }).catch(function (e) {
        return console.warn(e);
    });
};
 

আপনি লক্ষ্য করবেন যে বেশিরভাগ ES6 কোড যেমন অ্যারো ফাংশন এবং টেমপ্লেট স্ট্রিং গুলা পুরানো ES5 জাভাস্ক্রিপ্টে কম্পাইল করা হয়েছে। দুটি বৈশিষ্ট্য রয়েছে যা কম্পাইল হয়নি, fetch এবং includes. Babel-এর লক্ষ্য হল আমাদের পরবর্তী প্রজন্মের কোডগুলোকে নিয়ে সকল ব্রাউজার উপযোগী কোডে রুপান্তর করা। আপনি মনে করতে পারেন যে fetch এবং includes কে indexOf এবং XMLHttpRequest এর মতো নেটিভ কিছুতে কম্পাইল করা যেত কিন্তু বিষয়টি মোটেও এমন নয়। Babel কখনও কম্পাইল করার  সময় ব্রাউজারের গ্লোবাল অবজেক্ট বা জাভাস্ক্রিপ্ট প্রিমিটিভে  নতুন ফাংশনালিটি যোগ করে না।

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

অ্যারো ফাংশন, কম্পাইল বা পলিফিল করা হবে? Babel অ্যারো ফাংশনগুলিকে নিয়মিত ফাংশনে রূপান্তর করতে পারে, তাই সেগুলি কম্পাইল করা যেতে পারে। ক্লাস সম্পর্কে কি? কম্পাইল বা পলিফিলড? অ্যারো ফাংশনের মতো ক্লাসগুলি প্রোটোটাইপগুলির সাথে ফাংশনে রূপান্তরিত হতে পারে, তাই সেগুলিও কম্পাইল করা যেতে পারে। তাহলে  প্রমিস কি?এটি  কম্পাইল বা পলিফিল করা হবে? Babel এ কোনোভাবেই প্রমিসগুলিকে  এমনকোনো  নেটিভ সিনট্যাক্সে রূপান্তর করতে পারে না যা ব্রাউজারগুলি বুঝতে পারে। তারমানে এটি পলিফিলিং হবে। তাহলে ডিস্ট্রাকচারিং কি কম্পাইল বা পলিফিল? Babel ডট নোটেশন ব্যবহার করে প্রতিটি ডিস্ট্রাকচার অবজেক্টকে রেগুলার ভেরিয়েবলে পরিণত করতে পারে। সুতরাং, ডিস্ট্রাকচারিং কম্পাইল হবে। তাহলে includes কি কম্পাইল বা পলিফিল? এটি একটু কঠিন কারণ এটি আমাদের সাধারণ নিয়ম অনুসরণ করে না। কেউ যুক্তি দিতে পারে যে includes, indexOf ব্যবহার করে includes কে রূপান্তরিত করতে পারে যা সমস্ত ব্রাউজার সমর্থন করবে। আর আমরা জানি কম্পাইল কোন নতুন মেথড বা অতিরিক্ত ফাংশনালিটি যোগ করে না। সুতরাং, includes পলিফিল হবে।

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