Ruby 4.0 একটি বড় রিলিজ, যা Ruby-এর ৩০তম বর্ষপূর্তি (২৫ ডিসেম্বর, ২০২৫) উপলক্ষে প্রকাশ করা হয়েছে, سهร বড় ব্রেকিং পরিবর্তনের জন্য নয়।
আমি জানতে পেরে বিস্মিত হলাম যে Ruby আসলে সেম্যান্টিক ভার্সনিং অনুসরণ করে না!
বদলে Matz (Ruby-এর স্রষ্টা) মেজর ভার্সন তখন বাড়ান когда পরিবর্তনগুলো তাকে মুগ্ধ করে। এই সংস্করণটি Ruby-এর ৩০ বছর চিহ্নিত করে এবং ভাষা প্রসারিত করার জন্য নতুন বৈশিষ্ট্য যোগ করে।

Ruby 4-এ আপগ্রেড করার ইচ্ছুক Rubyists-এর জন্য ভাল খবর হলো আপগ্রেড করা আপেক্ষাকৃত সহজ হওয়া উচিত। কিছু নতুন বৈশিষ্ট্য যেমন Ruby::Box এবং ZJIT, কনকারেন্সি-তে কিছু উন্নতি, এবং আরও কিছু পরিশোধন আছে যা অধিকাংশ ক্ষেত্রে পেছামুখি সুসংগত।
চলুন Ruby 4-এ কী পরিবর্তন হয়েছে এবং কীভাবে সফলভাবে আপগ্রেড করা যায় তা দেখি।
Ruby::Box কী?
Ruby 4.0-র সবচেয়ে আকর্ষণীয় পরীক্ষামূলক বৈশিষ্ট্যের একটি হলো Ruby::Box, যা Ruby প্রসেসের ভিতরে পৃথক নেমস্পেস বা "কন্টেইনার" (Docker কন্টেইনারের সাথে গুলমিশ্রণ না করুন) পরিচয় করায়।
এটি আপনার Ruby প্রসেসের ভিতরে একটি পৃথক Ruby বিশ্ব তৈরি করার একটি পদ্ধতি। যখন আপনি একটি নতুন Ruby::Box তৈরি করেন, তখন সেই Box-এর ভিতরে আপনি যেসব ক্লাস, মডিউল, গ্লোবাল ভেরিয়েবল, কনস্ট্যান্ট, বা C এক্সটেনশন লোড করবেন, সেগুলো সেটিয়ে সীমাবদ্ধ থাকবে।
এটি ভাষা স্তরে লাইটওয়েট ভার্চুয়ালাইজেশনের মতো, যেখানে প্রতিটি Box-এর নিজস্ব স্টেট থাকে এবং অন্যান্য Box বা মূল পরিবেশে ডেফিনিশন লিক হয় না।
যেহেতু এটি পরীক্ষামূলক, আপনি রফ এজ বা অস্থিরতায় আঘাত খাতে পারেন। পারফরম্যান্স ওভারহেড একটি বিবেচ্য বিষয়। জিনিসগুলা আলাদা রাখতে খরচ হয়, তাই কোর টিম স знает_opt-in করতে বাধ্য করেছে।
Ruby 4.0 পর্যন্ত, Box-ها 진정한 সমান্তরাল এক্সিকিউশন প্রদান করার উদ্দেশ্য রাখে না। এগুলি স্মার্ট কোড লোডিংর ভিত্তি স্থাপন করে এবং ভবিষ্যতে আরও অর্থবহ কিছুতে পরিণত হতে পারে। Rubyকে এত আকর্ষণীয়ভাবে বিকশিত হওয়া দেখে আমি উত্সাহিত। আপনি যদি Ruby Box ব্যবহার করতে চান, তবে প্রথমে এনভায়রনমেন্ট ভেরিয়েবলটি সক্রিয় করতে হবে:
RUBY_BOX=1
ZJIT কেন গুরুত্বপূর্ণ
Ruby 4.0-এ ZJIT নামক একটি নতুন জাস্ট-ইন-টাইম কম্পাইলার সহявля করা হয়েছে, যা YJIT-এর উত্তরাধিকারী হিসেবে উন্নত করা হয়েছে। যদি আপনি গণনা রাখেন, তবে MRI-এ এখন দুইটি JIT কম্পাইলার আছে। ZJIT, YJIT-এর থেকে আলাদা, এবং সেগুলো সমান্তরালভাবে উন্নত হচ্ছে। আপনি যদি ইতিমধ্যে YJIT ব্যবহার করেন, তবে আপনাকে স্যুইচ করার প্রয়োজন নেই।
YJIT সংক্ষেপে
YJIT ("Yet Another JIT") Shopify দ্বারা নির্মিত এবং Ruby 3.1-এ পরিচয় করানো হয়েছে। এটি লেজি বেসিক ব্লক ভার্সনিং পদ্ধতি ব্যবহার করে—রানটাইম টাইপের উপর ভিত্তি করে কোডের ছোট খন্ড (বেসিক ব্লক) অন-দ-ফ্লাই কম্পাইল এবং স്പেশালাইজ করে।
YJIT অনেক Ruby অ্যাপ্লিকেশনের গতিবর্ধন করতে সফল হওয়া প্রমাণিত হয়েছে এবং এটি যুক্ত করা আপেক্ষাকৃত সহজ। এটি রাস্টে লেখা হয়েছে এবং সাম্প্রতিক Ruby সংস্করণগুলোর ডিফল্ট/প্রধান JIT।
ZJIT কিভাবে আলাদা
ZJIT একটি আরও ট্রেডিশনাল মেথড-ভিত্তিক JIT কৌশল গ্রহণ করে। ছোট ব্লকগুলো পিসমিল করে কম্পাইল করার বদলে, ZJIT বড় ইউনিটসমূহ (পুরো মেথড বা বড় কোড খন্ড) SSA (Static Single Assignment) ইন্টারমিডিয়েট রিপ্রেজেন্টেশন এবং একটি আরও परंपरাগত কম্পাইলার পাইপলাইন ব্যবহার করে কম্পাইল করে।
এটি কিছুটা "টেক্সটবুক" JIT কম্পাইলারের মতো ডিজাইন করা হয়েছে, যা কমিউনিটির জন্য বোঝা এবং উন্নতি করা সহজ করে দেবে।
Ruby কোর টিম স্পষ্টভাবে বলেছে, ZJIT-এর দুটি লক্ষ্য: Ruby-এর দীর্ঘমেয়াদী পারফরম্যান্স সিলিং বাড়ানো (YJIT-এর চেয়ে উন্নত অপ্টিমাইজেশন সক্ষম করে) এবং JIT-এর কে আরও হ্যাকযোগ্য বা সংশোধনযোগ্য করা।
Ruby 4.0-এ ZJIT সক্রিয় করা
Ruby 4.0-এ ZJIT উপলব্ধ কিন্তু ডিফল্টভাবে সক্রিয় নয়।
এটি ব্যবহার করতে হলে আপনার সিস্টেমে Rust 1.85 বা উচ্চতর সংস্করণ ইনস্টল থাকতে হবে। যদিও JIT কোড Ruby বাইনরির অংশ, এটি বিল্ড করতে Rust প্রয়োজন। তারপর --zjit ফ্ল্যাগ ব্যবহার করে Ruby চালাতে পারেন।
যদি আপনি JIT ডিফল্ট রেখে দেন, তবে আপনি YJIT-র সুবিধা পাবেন (যা নিজেই ক্রমাগত উন্নত হচ্ছে)। আপনি যদি --rjit ফ্ল্যাগ ব্যবহার করতেন, তবে এই রিলিজে এটি সরানো হয়েছে।
Ruby 4-এ Ractors-এ কিছু উন্নতি
Ruby 3.0-এ Ractors পরিচয় করানো হয়েছিল, একটি পরীক্ষামূলক বৈশিষ্ট্য যা সমান্তরালতার জন্য। Ractors একই প্রসেসে একাধিক Ruby ইন্টারপ্রেটার (আপনার কোড এক্সিকিউট করার সিস্টেমের অংশ) চালু করার অনুমতি দিয়ে GIL (Global Interpreter Lock) এড়াতে সাহায্য করে, যা সাধারণত Ruby কে একক থ্রেডে সীমাবদ্ধ করে। আমি কখনো Ractors ব্যবহার করিনি, কিন্তু এতে অবিচল سرمایه envió Ruby-এর ভবিষ্যতের জন্য এর গুরুত্ব বোঝায়।
Ruby 4.0-এ Ractors এখনও পরীক্ষামূলক চিহ্নিত, কিন্তু তারা কিছু বড় উন্নতি এবং API পরিবর্তন পেয়েছে যা সেগুলোকে মেনস্ট্রিম ব্যবহারযোগ্যতার কাছে নিয়ে এসেছে।
আপনি যদি Ractors ব্যবহার করে থাকেন, তবে জানেন যে মেসেজ পাঠানো এবং গ্রহণ করা কিছুটা ক্লাঙ্কি ছিল। Ruby 4.0-এ বিদ্যমান API-কে একটি আরও শক্তিশালী Ractor::Port মেকানিজমে প্রতিস্থাপন করা হয়েছে। একটি Ractor::Port মূলত একটি পাইপ বা চ্যানেল যা Ractors মান বিনিময় করতে ব্যবহার করতে পারে। এখন প্রতিটি Ractor-এর একটি ডিফল্ট পোর্ট (Ractor.current.default_port) আছে, এবং আপনি কাস্টম Port অবজেক্টও তৈরি করে পাস করতে পারেন।
Ractors-এ পরিবর্তনগুলির মানে কিছু ব্রেকিং পরিবর্তনও আছে। সবচেয়ে উল্লেখযোগ্য, Ractor.yield এবং Ractor#take সরানো হয়েছে।
অন্তর্নিহিতভাবে, Ruby 4.0-এর Ractor ইমপ্লিমেন্টেশন আরও ভাল পারফরম্যান্স এবং সুরক্ষার জন্য টিউন করা হয়েছে। Ractors-এর মধ্যে শেয়ার্ড স্টেট কম করা হয়েছে। Ractors-এর মধ্যে কম শেয়ার্ড স্টেট মানে আইসোলেশন ভাঙতে বাধা এবং মাল্টি-কোর সিস্টেমে ভালো CPU ক্যাশ ইউটিলাইজেশন।
Ractors এখন আরও ভালো স্কেল করা উচিত এবং দ্রুত চলে, যদিও এখনও থ্রেড বা প্রসেস만큼 ব্যাপকভাবে ব্যবহৃত হয় না।
Ruby 4-এ *.nil পরিবর্তন
Ruby 4.0-এ nil স্প্ল্যাটিং আর nil.to_a কল করে না।
পুরনো Ruby সংস্করণে, arr = [*nil] করার সময় পিয়েছে nil.to_a কল হতো (যা [] রিটার্ন করত), তাই আপনি একটি খালি অ্যারে পেতেন। এটি কিছুটা জাদুকরী এবং অসঙ্গতিপূর্ণ ছিল (কেন *nil খালি অ্যারে처럼 বিহेव করে?)।
Ruby 4.0-এ এই অদ্ভুত বিহেভিয়ার দূর করা হয়েছে। nil-এ স্প্ল্যাট (*) ব্যবহার করলে to_a আহ্বান করা হবে না। এটি মূলত "স্প্ল্যাট করার জন্য কিছু নেই" হিসেবে বিবেচিত হয়। এই পরিবর্তনটি ডাবল-স্প্ল্যাট **nil এর সাথে সামঞ্জস্যপূর্ণ যা nil.to_hash কল করে না, যা Ruby 3.4-এ যোগ করা হয়েছিল।
Ruby 4-এ লাইন শুরুতে লজিক্যাল অপারেটর
এটি একটি ছোট সিনট্যাক্স উন্নতি যা অনেক Rubyist-কে হাসতে বাধ্য করবে!
এখন আপনি একটি লাইনের শুরুতে &&, ||, and, বা or ব্যবহার করে পূর্বের লাইন থেকে বুলিয়ান এক্সপ্রেশন চালিয়ে যেতে পারেন। উদাহরণস্বরূপ, আপনি লিখতে পারেন:
if user_signed_in? && user.admin? && feature_enabled?
perform_admin_task
end
এটি একইরকম
if user_signed_in? && user.admin? && feature_enabled?
perform_admin_task
end
আমার খেয়ালে অদ্ভুত যে এগুলো ইতিমধ্যে একই ছিল না, তাই এই আপডেটের জন্য আমি খুশি।
Ruby 4-এ কিছু ক্লাস আপডেট
Ruby 4.0 কিছু ছোট পরিবর্তন এবং কোর ক্লাসগুলোর উন্নতিও 함께 নিয়ে এসেছে।
প্রথমে, Set ক্লাস এখন একটি বিল্ট-ইন কোর ক্লাস, অর্থাৎ আপনি require 'set' ছাড়া এটি ব্যবহার করতে পারেন। এর সাথে set/sorted_set.rb সরানো হয়েছে।
একইভাবে Pathname-ও কোর ক্লাস হিসেবে প্রোমোট করা হয়েছে।
কিছু নতুন Array মেথডও আছে! এই রিলিজে Array#find-এর পারফরম্যান্স উন্নত করা হয়েছে, যা সিম্পল লিনিয়ার সার্চের চেয়ে বেশি বুদ্ধিমানীपूर्णভাবে অ্যারে সার্চ করে। আমরা Array#rfind পেয়েছি—এটি টাইপো নয়! এই মেথডটি অ্যারেতে শেষে শর্ত পূরণকারী উপাদানটি খুঁজে বের করে।
Ruby 4-এ কিছু নতুন ম্যাথ মেথড, ইন্ট্রোস্পেকশন কন্ট্রোল, Enumerator উন্নতি, এবং আরও অনেক কিছু যোগ করা হয়েছে! সম্পূর্ণ তালিকার জন্য অফিসিয়াল ডকুমেন্টেশন দেখুন।
Ruby 4-এ কীভাবে আপগ্রেড করবেন
প্রোডাকশন অ্যাপে Ruby সংস্করণ আপগ্রেড করা সর্বদা সাবধানতার সাথে করা উচিত, কিন্তু আপনি যদি Ruby 3.4 থেকে আসেন, তবে এটি আপনার অভিজ্ঞতাগুলোর মধ্যে সবচেয়ে সহজ আপগ্রেডগুলির একটি হওয়া উচিত।
নিরাপদ ট্রানজিশন নিশ্চিত করার জন্য কিছু টিপস:
রিলিজ নোটস
প্রথমে অফিসিয়াল রিলিজ নোটস পড়ুন! অফিসিয়াল ডিপ্রিকেশন নোটিস দুবার চেক করুন। এখানে কোনো সারপ্রাইজ থাকা উচিত নয়। Ruby 3.4-এ আপনাকে যেকোনো আপকামিং ডিপ্রিকেশনের সতর্কতা দিয়ে থাকা উচিত।
ডিপ্রিকেশন সতর্কতা
আপনি যদি আপনার Ruby ইন্টারপ্রেটার থেকে ডিপ্রিকেশন সতর্কতা উপেক্ষা করে থাকেন, তবে ভাষা আপডেট করার আগে সেগুলো সমাধান করুন।
বেসলাইন টেস্ট
পরবর্তী, নিশ্চিত হন আপনার ভালো টেস্ট আছে। এটি আপনার অ্যাপের বিহেভিয়ার পরিবর্তন হয়নি তা আত্মবিশ্বাস দেবে। আপনার যদি কোনো টেস্ট নেই, তবে এখন আপনার ক্রিটিক্যাল পাথগুলি কভার করে টেস্টে سرمایه নিবেশ করার চমৎকার সময়।
Bundler আপডেট করুন
Bundler আপডেট করা ভালো ধারণা। একবার লেটেস্ট ভার্সনে আসলে bundle install চালান এবং এরর বা সতর্কতা চেক করুন।
আপনার Ruby সংস্করণ বাড়ান
এখন আপনি Ruby-এর নতুন সংস্করণ ইনস্টল এবং স্যুইচ করতে পারেন। rbenv বা asdf এর মত Ruby ভার্সন ম্যানেজার Ruby জগতে আপনার লোকাল ভার্সন কন্ট্রোলের জনপ্রিয়। আপনার অ্যাপ যদি Docker-এ চলে, তবে Dockerfile-এ Ruby সংস্করণ আপডেট করুন। আপনার অ্যাপ যদি Docker ছাড়া অন্য প্ল্যাটফর্মে চলে, তবে সেখানে Ruby সংস্করণ আপডেট করুন।
Gemfile-এ Ruby 4.0-এ আপগ্রেড করুন
আপনার Gemfile-এ Ruby সংস্করণ আপডেট করুন (যদি আপনি ruby ডিরেক্টিভ দিয়ে লক করে থাকেন) এবং শেষবার bundle install চালান।
আপনার টেস্ট চালান
শেষে, আপনার টেস্ট চালান! যদি কিছুই ভাঙা না থাকে, তবে আপনার অ্যাপ্লিকেশনের গুরুত্বপূর্ণ পাথগুলো চলে দেখুন আরও আত্মবিশ্বাস পেতে। আপনার আপগ্রেড শিপ করার আগে, Honeybadger-এর মত একটি এক্সেপশন মনিটরিং সার্ভিস ব্যবহার করার কথা বিবেচনা করুন যাতে আপনি জেনে থাকেন আপনার Ruby 4 আপগ্রেড ব্যবহারকারীদের জন্য কোনো সমস্যা সৃষ্টি করছে কিনা।
আপনি যদি এই ধাপগুলো অনুসরণ করেন, তবে আপনি Ruby-এর সেরা সবುವিধা পাওয়ার জন্য আপ-টু-ডেট থাকার একটি আপেক্ষাকৃত ব্যথামুক্ত অভিজ্ঞতা পাবেন। টেস্টগুলো চালালে Ruby-এর ৩০তম জন্মদিনের শুভেচ্ছা জানানো ভুলবেন না!