ভূমিকা
সবাইকে শুভেচ্ছা। নভেম্বরে স্বাগতম। আশা করি সবাই ভালো আছেন।
আমাদের অক্টোবরটা ছিল ভীষণ ব্যস্ত। আমরা এইমাত্র কমিউনিটি সলিউশনে একটি বড় উন্নতি চালু করেছি। এখন আমরা একইরকম সলিউশন ডুপ্লিকেট সরিয়ে ফেলি, যাতে কাছাকাছি সলিউশনগুলো একবারই দেখানো হয়; এর সাথে নতুন সাজানোর অপশন, কোড দিয়ে সার্চ করার সুবিধা যোগ করেছি, আর আপনি যদি C# দেখেন, তাহলে দেখবেন বিভিন্ন প্রোগ্রামিং কনসেপ্ট দিয়ে ফিল্টার করার সুবিধাও আমরা যোগ করেছি। তাই আপনি বিট শিফটিং, রিকার্সন বা আপনার পছন্দমতো অন্য যেকোনো কিছু ব্যবহার করা সলিউশন খুঁজতে পারেন। কমিউনিটি সপ্তাহে আমরা এটা অন্য ট্র্যাকেও চালু করব।
তবে আপাতত চলুন #12in23-এ মনোযোগ দিই। অক্টোবর ছিল একটি মজার মাস, আমরা অবজেক্ট-ওরিয়েন্টেড ভাষা ঘুরে দেখেছি, কিন্তু এ মাসে আমরা একেবারে গভীরে যাচ্ছি। আমরা অ্যাসেম্বলি ভাষাগুলোর দিকে মনোযোগ দিচ্ছি, বিশেষভাবে MIPS অ্যাসেম্বলি, x86-64 অ্যাসেম্বলি আর WebAssembly। বরাবরের মতো এরিক আমাদের বলে দেবেন এই ভাষাগুলোকে কী এত মজার আর অনন্য করে তোলে।
ব্যাজগুলো
সবসময়ের মতো, এই ভাষাগুলোর যেকোনো ৫টি অনুশীলনী সম্পন্ন করে আপনি নিবলি নভেম্বর ব্যাজ অর্জন করতে পারেন। আমাদের একটা বছরব্যাপী ব্যাজও আছে, যেটার দিকে অনেকে এগিয়ে চলেছেন বলে আমি জানি। সেটার জন্য আপনার সম্পন্ন করার মতো ৫টি ফিচার্ড অনুশীলনী আছে। সেগুলো হলো:
- পপ কাউন্ট: একটি সংখ্যায় কতগুলো ১ বিট আছে তা গণনা করুন
- গ্রেইন্স: প্রতি ঘরে দ্বিগুণ হতে হতে একটি দাবাবোর্ডে কতগুলো দানা জমে তা হিসাব করুন
- রেজিস্টর কালার: একটি রেজিস্টরের ব্যান্ডের রংকে তার সাংখ্যিক রূপে রূপান্তর করুন
- রোটেশনাল সাইফার: রোটেশনাল সাইফার (যা সিজার সাইফার নামেও পরিচিত) তৈরি করুন
- নিউক্লিওটাইড কাউন্ট: একটি DNA স্ট্রিংয়ে প্রতিটি নিউক্লিওটাইড কতবার আসে তা হিসাব করুন
পটভূমি
কেন নামটা নিবল নভেম্বর?
আপনি নিশ্চয়ই জানেন, একটি বাইট হলো ৮ বিট। আর একটি নিবল হলো ৪ বিট। byte-এর y-কে i দিয়ে বদলে দিলে যেটা হয়, সেটা নিয়ে ভাবলে নামটার মানে বোঝা শুরু হয়: bite। তাহলে একটা নিবল মানে এক কামড়।
অ্যাসেম্বলি ভাষা কী?
আচ্ছা, চলুন কিছু মৌলিক বিষয় দিয়ে শুরু করি। একটি CPU নির্দেশনা চালায়, যেমন “দুটি সংখ্যা যোগ করুন” বা “বিট বামে সরান” ইত্যাদি। এসব নির্দেশনাকে মেশিন কোড ইনস্ট্রাকশন বলা হয়, আর এগুলো আসলে বিটের নির্দিষ্ট কোনো ক্রম ছাড়া আর কিছুই নয়। একটি প্রোগ্রাম চালানো মানে “সহজ কথায়” (উদ্ধৃতি চিহ্নেই) CPU-এর এই বিটের ক্রমগুলো প্রসেস করা আর চালানো।
বিটের ক্রম হিসেবে সরাসরি নির্দেশনা লিখে রাখা ঝামেলার আর ভুলের সম্ভাবনা বেশি, তাই ১৯৪৭ সালেই ক্যাথলিন আর অ্যান্ড্রু ডোনাল্ড বুথ মেশিন কোড ইনস্ট্রাকশন প্রকাশ করার জন্য মানুষের জন্য আরও বন্ধুত্বপূর্ণ একটি ভাষা বানালেন। মেশিন কোড ইনস্ট্রাকশন প্রকাশ করে এমন ভাষাকে অ্যাসেম্বলি ভাষা বলা হয়। এরপর একটি “অ্যাসেম্বলার” দিয়ে এই অ্যাসেম্বলি ভাষাকে মেশিন কোড ইনস্ট্রাকশনে রূপান্তর করা হয়।
অ্যাসেম্বলি ভাষার একটি মজার দিক হলো এগুলো সরাসরি একটি CPU আর্কিটেকচারের সাথে বাঁধা, যদিও সাধারণত এগুলো অপারেটিং সিস্টেম থেকে স্বাধীন।
যাই হোক, আপনার যদি পাঞ্চ কার্ড মনে থাকে, অর্থাৎ শুরুর দিকের কম্পিউটারে প্রোগ্রাম চালানোর জন্য ব্যবহৃত কার্ডের সেই বড় টুকরো, সেটাও এক ধরনের অ্যাসেম্বলি ভাষাই ছিল!
আমরা এখন যে ভাষায় প্রোগ্রাম করি, তার থেকে অ্যাসেম্বলি ভাষা কীভাবে আলাদা?
মূল পার্থক্য হলো, অ্যাসেম্বলি ভাষা খুবই লো-লেভেল। আপনি যেসব অ্যাবস্ট্রাকশনে অভ্যস্ত হয়ে পড়েছেন, তার অনেকগুলোই এখানে পাবেন না। ক্লাস বা অবজেক্টের কোনো চিহ্ন নেই। লুপ? জাম্প দিয়ে নিজেই লিখতে হবে। ফাংশন? নেই-ই! অ্যাসেম্বলি কোড লিখতে গিয়ে আমি বেশ নম্র হয়ে গিয়েছিলাম, কারণ তখন বুঝতে পারেন আধুনিক ভাষাগুলো আপনার জীবন কত সহজ করে দেয়। তবে অ্যাসেম্বলি কোড লেখা ভীষণ কাজেরও, কারণ এতে জিনিসগুলো আসলে কীভাবে কাজ করে তা আপনি অনেক ভালোভাবে বুঝতে পারবেন।
মজার তথ্য: RollerCoaster Tycoon-এর সোর্স কোডের ৯৯% ছিল হাতে লেখা অ্যাসেম্বলি কোড! এটা এক বিস্ময়কর কীর্তি, আর আপনি নিজে একটু অ্যাসেম্বলি লিখলে এটার মূল্য আরও বেশি বুঝতে পারবেন।
মানুষ কি এখনো অ্যাসেম্বলি কোড লেখে?
আগের তুলনায় কম, সেটা ঠিক। একসময় হাতে লেখা অ্যাসেম্বলি অনেক সময় কম্পাইলার-উৎপন্ন মেশিন কোডের চেয়ে ভালো পারফরম্যান্স দিত (এই একটা কারণেই C++ ভাষায় সরাসরি অ্যাসেম্বলি কোড এমবেড করার সুযোগ আছে), কিন্তু কম্পাইলার এখন মেশিন কোড বানানোয় এত ভালো হয়ে গেছে যে এটা আর খুব একটা সত্যি নয়। তবুও, পারফরম্যান্স-সংবেদনশীল বা সীমিত রিসোর্সের পরিবেশে অ্যাসেম্বলি ভাষা এখনো ব্যবহৃত হতে দেখবেন।
এক নজরে
MIPS
- MIPS (Microprocessor without Interlocked Pipelined Stages) হলো রিডিউসড ইনস্ট্রাকশন সেট কম্পিউটার (RISC) ইনস্ট্রাকশন সেট আর্কিটেকচারের একটি পরিবার
- MIPS Computer Systems তৈরি করেছে এবং এটি প্রথম ১৯৮৫ সালে প্রকাশ পায়
- একাধিক সংস্করণ: MIPS I, II, III, IV, V এবং MIPS32/64। প্রথম দুটি সংস্করণ শুধু ৩২-বিট ছিল, কিন্তু MIPS III ৬৪-বিট সাপোর্ট নিয়ে আসে।
- বেশ কিছু ঐচ্ছিক এক্সটেনশন, যেমন SIMD ইনস্ট্রাকশন আর কম্প্রেশন
- পরবর্তী RISC আর্কিটেকচারগুলোতে এর গভীর প্রভাব আছে
- MIPS ২০২১ সালে ঘোষণা করে যে MIPS আর্কিটেকচার আর উন্নত করা হচ্ছে না, এবং তারা RISC-V-তে (যা একটি ওপেন-সোর্স, রয়্যালটি-মুক্ত আর্কিটেকচার) চলে যায়
- বেশিরভাগ ক্ষেত্রে এমবেডেড সিস্টেমে (যেমন রাউটার) আর সার্ভারে ব্যবহৃত হয় (Silicon Graphics-এর কম্পিউটারে এটি ছিল, যা সিনেমার SFX-এ ব্যবহারের জন্য বিখ্যাত), NEC Cenju-4 সুপারকম্পিউটারে, টেসলার Model S গাড়িতে, NASA-র New Horizons প্রোবেও, আর বিশ্ববিদ্যালয়ে অ্যাসেম্বলি পড়ানোর জন্য এবং বেশ কিছু গেমিং কনসোলে (যেমন আসল PlayStation, Playstation Portable আর Nintendo 64)
x86-64 অ্যাসেম্বলি
- AMD ডিজাইন করেছে এবং ১৯৯৯ সালে AMD64 আর্কিটেকচার হিসেবে প্রকাশ পায়
- এটি x86 ইনস্ট্রাকশন সেটের ৬৪-বিট সংস্করণ, যার শুরুটা ১৯৭৮ সালে Intel-এর 8086 মাইক্রোপ্রসেসর চালু করার সময়। সেটি ছিল একটি ১৬-বিট প্রসেসর, তবে পরে 80386 ৩২-বিট ইনস্ট্রাকশন যোগ করে, আর সেই ইনস্ট্রাকশন সেটই x86-এর সমার্থক হয়ে দাঁড়ায়।
- ৬৪-বিটের মূল সুবিধা ছিল বেশি মেমোরি অ্যাড্রেস করা (৩২-বিট অ্যাড্রেসিং ৪GB পর্যন্ত সীমিত), যা তখন বাধা হয়ে দাঁড়িয়েছিল। তত্ত্বগতভাবে ৬৪-বিট ১৬ এক্সাবাইট পর্যন্ত অ্যাড্রেস করতে পারে, কিন্তু এখন শুধু ৪৮ বিট ব্যবহৃত হয়, যা দিয়ে ২৫৬ TB অ্যাড্রেস করা যায় (প্রয়োজনে পরে বাড়ানো যায়)
- AMD64 x86 ইনস্ট্রাকশন সেটকে বাড়ায় এবং একটি কম্প্যাটিবিলিটি মোডের মাধ্যমে আগের ১৬- ও ৩২-বিট অ্যাপ্লিকেশনের সাথে পুরোপুরি সামঞ্জস্যপূর্ণ হওয়ার জন্য ডিজাইন করা হয়
- Intel, AMD-কে ছাড়াই IA-64 ডিজাইন করেছিল। এটি ছিল একটি নতুন, খুবই আলাদা এবং পেছনের দিকে অসামঞ্জস্যপূর্ণ ৬৪-বিট ইনস্ট্রাকশন সেট। শেষ পর্যন্ত AMD64 জিতে যায় আর Intel নিজেরাই এর একটি সংস্করণ বানায় (শুধু সামান্য অর্থগত পার্থক্য নিয়ে)
- সব জায়গাতেই ব্যবহৃত। ওয়ার্কস্টেশন থেকে সার্ভার (সুপারকম্পিউটারসহ), এমবেডেড সিস্টেম থেকে গেমিং কনসোল (যেমন PS5 আর Xbox Series X) পর্যন্ত।
WebAssembly
- W3C ডিজাইন করেছে, যেটি ওয়েব প্রযুক্তির একটি স্ট্যান্ডার্ড সংস্থা
- ডিজাইনের লক্ষ্য:
- দ্রুত, নিরাপদ আর পোর্টেবল
- দক্ষ ও পোর্টেবল রূপ
- আগের দিনগুলোতে ওয়েবে দ্রুত এক্সিকিউশন সাধারণত Flash আর Silverlight-এর মতো বিশেষ ব্রাউজার প্লাগইনের মাধ্যমে হতো, কারণ JavaScript নিজে উচ্চ-পারফরম্যান্স কম্পিউটিংয়ের জন্য খুব একটা উপযুক্ত নয়। এই প্লাগইনগুলোর বড় অসুবিধা ছিল, এগুলোর সাধারণত অনেক সিকিউরিটি সমস্যা থাকত আর এগুলো স্ট্যান্ডার্ডও ছিল না।
- Mozilla ডিজাইন করে asm.js, JavaScript-এর একটি সাবসেট, যার লক্ষ্য ছিল ব্রাউজারে দুর্দান্ত পারফরম্যান্স-বৈশিষ্ট্য নিয়ে কোড চালানো; এটি তারা অর্জন করেছিল টাইপ কনসিস্টেন্সি (টাইপ হঠাৎ বদলে না যাওয়া) আর গারবেজ কালেকশন ছাড়া। এরপর ভাষাগুলো asm.js-এ কম্পাইল করে ওয়েবে চালালেও ভালো পারফরম্যান্স পেত। তবে এটা এখনো JS-ই ছিল, তাই যা করা যেত তা সীমিত। তাই নতুন একটি ভাষার প্রস্তাব আসে: WASM।
- অ্যাসেম্বলির মতো ভাষা, কারণ এটি চালানোর জন্য একগুচ্ছ ইনস্ট্রাকশন দেয়। সবচেয়ে গুরুত্বপূর্ণ হলো, এটি কোনো নির্দিষ্ট CPU-এর সাথে বাঁধা নয়, তাই এটি প্ল্যাটফর্ম-নিরপেক্ষ এবং প্রতিটি প্ল্যাটফর্মের জন্য আলাদা ইমপ্লিমেন্টেশন (একটি ভার্চুয়াল মেশিন) দরকার। এর মানে WebAssembly আসলে বাইটকোড, মেশিন কোড নয়
- স্ট্যাটিক টাইপড (JS থেকে এটাই মূল পার্থক্য)
- সাধারণত অ্যাহেড-অব-টাইম বা জাস্ট-ইন-টাইম কম্পাইলেশন ব্যবহার করে (তবে ইন্টারপ্রেটও করা যায়)
- ওপেন স্ট্যান্ডার্ড এবং দুটি জিনিস নির্ধারণ করে:
- একটি বাইনারি ফরম্যাট
- একটি টেক্সট ফরম্যাট (যা বাইনারি ফরম্যাটে কম্পাইল হয়)
- সব বড় ব্রাউজারে এর ইমপ্লিমেন্টেশন আছে
- উচ্চ পারফরম্যান্স দরকার হয় এমন অনেক ওয়েব পেজে ব্যবহৃত, যেমন Google Earth, Figma, Unity আর Autocad। সার্ভার-সাইডেও এর কদর বাড়ছে, যেমন মাইক্রোসার্ভিস চালানো, SaaS প্ল্যাটফর্মে (যেমন CloudFlare workers) বা Docker-এ চালানো
আর প্রোগ্রামিংয়ের দৃষ্টিকোণ থেকে এগুলো কীভাবে আলাদা?
MIPS
- লোড-স্টোর আর্কিটেকচার (অর্থাৎ রেজিস্টার-রেজিস্টার) ব্যবহার করে, যেখানে ইনস্ট্রাকশন হয় মেমোরি অ্যাক্সেস করে, নয় গাণিতিক কাজ, কিন্তু এগুলো শুধু রেজিস্টারে থাকা ডেটা নিয়েই কাজ করে
x86-64 অ্যাসেম্বলি
- রেজিস্টার-মেমোরি আর্কিটেকচার ব্যবহার করে, যা রেজিস্টারের পাশাপাশি মেমোরির উপরও (বা মেমোরি থেকে) অপারেশন করার সুযোগ দেয়
WebAssembly
- স্ট্যাক-ভিত্তিক প্রোগ্রামিং ব্যবহার করে (কোনো রেজিস্টার নেই), সাথে মেমোরি থেকে ডেটা পড়া বা মেমোরিতে লেখার সুবিধা
কোন জিনিসগুলো এই ভাষাগুলোকে দুর্দান্ত করে তোলে?
MIPS
- ছোট। MIPS ইনস্ট্রাকশন সেটের সব ইনস্ট্রাকশন একটি পাতাতেই ধরে যায়
- প্রতিষ্ঠিত কলিং কনভেনশন বুঝতে সাহায্য করে কীভাবে উপলব্ধ রেজিস্টার ব্যবহার করবেন, যেমন আর্গুমেন্ট পাঠাতে কোনটা আর ফলাফল রিটার্ন করতে কোনটা ব্যবহার করবেন।
- স্থিতিশীল। সর্বশেষ সংস্করণ প্রকাশ পায় ২০১৪ সালে
- ব্যাপকভাবে ডকুমেন্টেড, বিশেষ করে অ্যাকাডেমিক বইপত্রে
- বাস্তব জগতে এর ব্যবহার অনেক। শত কোটি ডিভাইস
x86-64 অ্যাসেম্বলি
- x64-এর এক্সটেনশন হলেও অনেক নতুন ফিচার যোগ করা হয়েছে, যেমন:
- ৬৪-বিট ইন্টিজার সাপোর্ট
- অতিরিক্ত রেজিস্টার
- SSE ইনস্ট্রাকশন (ভেক্টর ইনস্ট্রাকশন)
- রিলেটিভ ডেটা অ্যাক্সেস (শেয়ারড লাইব্রেরি ব্যবহারের সময় আরও দক্ষ)
- No-Execute Bit (মেমোরির নির্দিষ্ট কিছু পেজে কোড চালানো আটকানোর সিকিউরিটি ফিচার)
- পরিচিত। যেহেতু এটি x86 ইনস্ট্রাকশন সেটকে বাড়ায়, যারা x86 ইনস্ট্রাকশন সেটের সাথে পরিচিত তাদের জন্য শেখা তুলনামূলক সহজ হবে বিস্তারিত ও বিশদ ডকুমেন্টেশন
- স্থিতিশীল। নিয়মিত নতুন সংস্করণ যোগ হলেও মূল অংশটি চরমভাবে স্থিতিশীল এবং পেছনের দিকে সামঞ্জস্যপূর্ণ
WebAssembly
- স্ট্যাক-ভিত্তিক WebAssembly ভার্চুয়াল মেশিন বাস্তব প্রসেসরের (RISC-সহ) অ্যাসেম্বলি ভাষার তুলনায় হালকা ও সহজ। তাই এর জন্য কম্পাইল করা তুলনামূলক সহজ।
- WebAssembly টেক্সট ফরম্যাট পরিচিত ইম্পারেটিভ স্টাইল পেতে S-এক্সপ্রেশন “শুগার” ব্যবহার করে, যা পরে স্ট্যাক-ভিত্তিক কোডে রূপান্তরিত হয়। S-এক্সপ্রেশনযুক্ত রূপটাকে বলা হয় “sugared form”, আর এটি “desugar” হয়ে বাইনারিতে থাকা রূপের সমতুল্য অন্য রূপে পরিণত হয়। LISP নিয়ে কখনো কাজ করেছেন এমন যে কেউ S-এক্সপ্রেশন চিনবেন
- JavaScript-এর সাথে শক্তিশালী ইন্টারঅপ। JavaScript থেকে ও JavaScript-এ ডেটা পাঠানো সহজ। তবে গুরুত্বপূর্ণ একটি সতর্কতা: WASM (এখনো) DOM-এর সাথে ইন্টারঅ্যাক্ট করার সুযোগ দেয় না
- ক্রমাগত উন্নত হচ্ছে। শুধু WASM ভার্চুয়াল মেশিনই নয়, স্ট্যান্ডার্ডটাও সক্রিয়ভাবে উন্নত হচ্ছে। SIMD-সম্পর্কিত ইনস্ট্রাকশন, গারবেজ কালেকশন, থ্রেড, টেইল-কল অপটিমাইজেশনসহ আরও অনেক নতুন ফিচার ডিজাইন ও নিয়ে কাজ চলছে
- নিরাপদ। কোড যাচাই করা হয় এবং একটি স্যান্ডবক্স পরিবেশে চালানো হয়, যা JavaScript বা নেটিভ অ্যাসেম্বলি ভাষার তুলনায় বেশি মাত্রার স্ট্যাটিক ভ্যালিডেশন দেয়। সিম্যান্টিকস ভালোভাবে সংজ্ঞায়িত, তাই যাচাই করা আর বিচার-বিশ্লেষণ করা সহজ
বিশেষ বৈশিষ্ট্য
MIPS
- দক্ষতা। MIPS প্রসেসর খুবই দক্ষ, তাই এমবেডেড সিস্টেমের জন্য দারুণ।
- পারফরম্যান্স। দুর্দান্ত পারফরম্যান্স, তাই সুপারকম্পিউটারে MIPS ব্যবহৃত হয়েছে
- শেখা সহজ। ইনস্ট্রাকশন কম আর প্রতিটি ইনস্ট্রাকশন শুধু একটি সহজ কাজ করে, তাই শেখা সহজ। পড়ানোর জন্য দারুণ।
x86-64 অ্যাসেম্বলি
- শক্তিশালী। দশকের পর দশক ধরে x86-64 টিউন করা হয়েছে, পারফরম্যান্সে সাহায্য করে এমন অসংখ্য ইনস্ট্রাকশন নিয়ে। এর একটি উদাহরণ SIMD (Single Instruction, Multiple Data), অর্থাৎ এমন ইনস্ট্রাকশন যেগুলো, আচ্ছা, একটা ইনস্ট্রাকশন দিয়েই একাধিক ডেটার উপর সমান্তরালে কাজ করাতে পারে।
- সর্বব্যাপী। x86-64 চালায় এমন ডিভাইস সব জায়গায়। Intel আর AMD-এর CPU এগুলো ইমপ্লিমেন্ট করে। অনেক দিন ধরেই এটি ডি-ফ্যাক্টো স্ট্যান্ডার্ড
- নিয়মিত আপডেট হয়। যেমন SSE3-5, AVX, AVX-512 আরও অনেক নিয়ে নতুন ভেক্টর ইনস্ট্রাকশন
WebAssembly
- দক্ষ। বাইনারি ফরম্যাট কমপ্যাক্ট এবং দ্রুত একটি পাসেই ডিকোড, ভ্যালিডেট আর কম্পাইল করা যায়। এটি স্ট্রিমেবলও, তাই সব ডেটা দেখার আগেই যত দ্রুত সম্ভব ডিকোডিং, ভ্যালিডেশন আর কম্পাইলেশন শুরু করা যায়। আর এটি সমান্তরালেও চালানো যায়। এ কারণে উচ্চ-পারফরম্যান্স ওয়েব অ্যাপ্লিকেশনের জন্য এটি একেবারে উপযুক্ত।
- দুর্দান্ত কম্পাইলেশন টার্গেট। অনেক ভাষার কোড ওয়েবে চালানোর সুযোগ দেয়। বেশিরভাগ বড় ভাষাই WebAssembly বাইনারিতে কম্পাইল করতে পারে, অর্থাৎ JavaScript না লিখেও আপনার কোড ওয়েবে চলতে পারে। কিছু ভাষা আপনার কোডকে WebAssembly-তে কম্পাইল না করে বরং রানটাইমকে WebAssembly-তে কম্পাইল করে, যা পরে অপরিবর্তিত বাইটকোড চালাতে পারে।
- ডিপ্লয় আর চালানো সহজ। বাইটকোড ইন্টারপ্রেট করতে পারে এমন একটি ভার্চুয়াল মেশিন থাকলেই হয়, আর সব বড় ব্রাউজারেই একটা থাকে।
- শুধু ওয়েবে নয়, সার্ভার-সাইডেও চালানো যায়। WebAssembly System Interface (WASI) হলো যেকোনো প্ল্যাটফর্মে পোর্টেবল হওয়ার জন্য ডিজাইন করা একটি ইন্টারফেস (ABI আর API)। এটি POSIX-এর (Unix সিস্টেমের স্ট্যান্ডার্ড ইন্টারফেস) মতো এবং I/O-এর মতো সুবিধা দেয়। সিকিউরিটি এর ডিজাইনের একটি মূল অংশ, যার মধ্যে আছে স্যান্ডবক্সিং আর ক্যাপাবিলিটি-ভিত্তিক হওয়া (ফাইল বা সকেটের মতো জিনিসের জন্য স্পষ্টভাবে অনুমতি চাইতে হয়)। বিভিন্ন ভাষার মধ্যে সহজে যোগাযোগ করানোর সম্ভাবনাও WASI-র আছে। Docker-এর সহপ্রতিষ্ঠাতা Solomon Hykes ২০১৯ সালে লিখেছিলেন, “২০০৮ সালে যদি WASM+WASI থাকত, তাহলে আমাদের Docker বানানোর দরকারই পড়ত না।”
কোনটি বেছে নেবেন
- আপনি যদি কখনো অ্যাসেম্বলি ভাষা নিয়ে কাজ না করে থাকেন, তাহলে শুরু করার জন্য WebAssembly সম্ভবত সবচেয়ে সহজ ভাষা। তবে আপনি যদি মেশিন কোডে কম্পাইল হয় এমন কোনো অ্যাসেম্বলি ভাষা শিখতে চান, তাহলে MIPS অ্যাসেম্বলি চেষ্টা করে দেখুন
- আপনি যদি x86-64 মেশিনে কাজ করেন (খুব সম্ভবত তাই), তাহলে x86-64 অ্যাসেম্বলি চেষ্টা করে দেখুন
- আপনি যদি LISP-এর সাথে পরিচিত হন, তাহলে WebAssembly যে S-এক্সপ্রেশন ব্যবহার করে সেটা আপনার ভালো লাগবে
- আপনি যদি ওয়েব অ্যাপ নিয়ে কাজ করেন, তাহলে WebAssembly-ই সবচেয়ে যুক্তিসঙ্গত পছন্দ
- পারফরম্যান্স নিয়ে ভাবলে x86-64 আর MIPS দারুণ পছন্দ। আর ওয়েব পারফরম্যান্স নিয়ে ভাবলে WebAssembly চেষ্টা করে দেখুন