Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Ruby

Ruby 4.0: मुख्य फीचर, रिलीज़ हाइलाइट्स, और अपग्रेड गाइड

Ruby 4.0 एक प्रमुख रिलीज़ है, जिसे Ruby की 30वीं वर्षगांठ (25 दिसंबर, 2025) पर लॉन्च किया गया ताकि समुदाय के तीन दशकों का जश्न मनाया जा सके, न कि प्रमुख ब्रेकिंग परिवर्तनों के कारण।

मुझे यह जानकर आश्चर्य हुआ कि Ruby वास्तव में सेमेंटिक वर्जनिंग का पालन नहीं करता!

इसके बजाय, Matz (Ruby के निर्माता) प्रमुख संस्करण बढ़ाते हैं जब परिवर्तन उन्हें प्रभावित करते हैं। यह संस्करण Ruby के 30 वर्षों को चिह्नित करता है और भाषा का विस्तार करने के लिए फीचर पेश करता है।

Ruby 4.0: मुख्य फीचर, रिलीज़ हाइलाइट्स, और अपग्रेड गाइड

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 या मुख्य वातावरण में परिभाषाओं को लीक नहीं करेगा।

क्योंकि यह प्रयोगात्मक है, आप रफ एज या अस्थिरता का सामना कर सकते हैं। प्रदर्शन ओवरहेड एक विचार है। चीजों को अलग करना मुफ़्त नहीं है, इसलिए कोर टीम ने जानबूझकर इसे ऑप्ट-इन बनाया है।

Ruby 4.0 तक, Boxes का तत्काल वास्तविक समानांतर निष्पादन प्रदान करने का इरादा नहीं है। वे स्मार्ट कोड लोडिंग के लिए एक नींव रखते हैं और कुछ और सार्थक विकसित हो सकते हैं। मैं 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 ऐप को काफी तेज करने के लिए सिद्ध हुआ है जबकि अपेक्षाकृत जोड़ना आसान है। यह Rust में लिखा गया है और हाल के Ruby संस्करणों में डिफ़ॉल्ट/प्राथमिक JIT रहा है।

ZJIT कैसे अलग है

ZJIT एक अधिक पारंपरिक मेथड-आधारित JIT रणनीति अपनाता है। छोटे ब्लॉकों को टुकड़े-टुकड़े में संकलित करने के बजाय, ZJIT SSA (स्टेटिक सिंगल असाइनमेंट) इंटरमीडिएट प्रतिनिधित्व और एक अधिक पारंपरिक कंपाइलर पाइपलाइन का उपयोग करके बड़ी इकाइयों (पूरे मेथड या बड़े कोड चंक्स) को संकलित करता है।

यह थोड़ा अधिक "टेक्स्टबुक" JIT कंपाइलर की तरह डिज़ाइन किया गया है, जो इसे योगदानकर्ताओं के लिए समझने और सुधारने में आसान बनाना चाहिए।

Ruby कोर टीम स्पष्ट रूप से ZJIT के साथ अपने दो लक्ष्यों को बताती है: Ruby की दीर्घकालिक प्रदर्शन सीमा को बढ़ाना (YJIT की तुलना में अधिक उन्नत ऑप्टिमाइज़ेशन सक्षम करके) और JIT को समुदाय द्वारा अधिक हैकेबल बनाना।

Ruby 4.0 में ZJIT सक्षम करना

ZJIT Ruby 4.0 में उपलब्ध है लेकिन डिफ़ॉल्ट रूप से सक्षम नहीं है।

इसे आज़माने के लिए, आपको अपने सिस्टम पर Rust 1.85 या उच्चतर इंस्टॉल करके Ruby बिल्ड करने की आवश्यकता है। जबकि JIT कोड Ruby बाइनरी का हिस्सा है, इसे बनाने के लिए Rust की आवश्यकता होती है। फिर, आप ZJIT का उपयोग करने के लिए '--zjit' फ्लैग के साथ Ruby चला सकते हैं।

यदि आप JIT को डिफ़ॉल्ट पर छोड़ते हैं, तो आप अभी भी YJIT से लाभान्वित हो रहे हैं (जो खुद में सुधार करता रहता है)। यदि आप --rjit फ्लैग का उपयोग कर रहे थे, तो आप देखेंगे कि इसे इस रिलीज़ में हटा दिया गया है।

Ruby 4 में Ractors में कुछ सुधार हैं

Ruby 3.0 ने Ractors पेश किए, समानांतरता के लिए एक प्रयोगात्मक सुविधा। Ractors एक ही प्रक्रिया में कई Ruby इंटरप्रेटर (सिस्टम का वह हिस्सा जो आपका कोड निष्पादित करता है) चलाने की अनुमति देते हैं ताकि GIL (ग्लोबल इंटरप्रेटर लॉक) को बायपास किया जा सके, जो आमतौर पर Ruby को एक समय में एक थ्रेड तक सीमित रखता है। जबकि मैंने कभी Ractors का उपयोग नहीं किया, उनमें निरंतर निवेश एक स्पष्ट संकेत है कि वे 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 में लाइन की शुरुआत में तार्किक ऑपरेटर

यह एक छोटा सा सिंटैक्स सुधार है जो कई Rubyists को मुस्कुराएगा!

अब आप बूलियन अभिव्यक्ति को पिछली लाइन से जारी रखने के लिए &&, ||, 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 इंटरप्रेटर से डिप्रिकेशन चेतावनियों को नजरअंदाज किया है, तो भाषा में किसी भी अपडेट से पहले उन्हें संबोधित करें।

बेसलाइन टेस्ट

अगला, सुनिश्चित करें कि आपके पास अच्छे टेस्ट हैं। इससे आपको विश्वास बनाने में मदद मिलेगी कि आपके ऐप का व्यवहार नहीं बदला है। यदि आपके पास कोई टेस्ट नहीं हैं, तो अब अपने महत्वपूर्ण पथों को कम से कम कवर करने के लिए टेस्ट में निवेश करने का एक अच्छा समय है।

बंडलर अपडेट करें

बंडलर को आगे अपडेट करना एक अच्छा विचार है। एक बार जब आप नवीनतम संस्करण पर हैं, तो 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 को 30वें जन्मदिन की शुभकामनाएं देना न भूलें!


  1. SQL सर्वर मैनेजमेंट स्टूडियो 18.7 में नया क्या है? SQL सर्वर मैनेजमेंट स्टूडियो 18.7 में नया क्या है?

    रिलीज़ 18.7 2020 में SSMS का तीसरा प्रमुख रिलीज़ है और डेटाबेस एडमिनिस्ट्रेशन के लिए गुणवत्ता टूल्स प्रदान करने की अपनी प्रतिबद्धता को बढ़ाता है। मुख्य परिवर्तनों में शामिल हैं: Azure Data Studio के साथ इंस्टॉल करें SQL सर्वर मैनेजमेंट स्टूडियो Microsoft डेटा समाधानों के साथ काम करने वाले कई लोगों क

  1. JavaScript फंक्शन परिभाषा: घोषणा vs अभिव्यक्ति JavaScript फंक्शन परिभाषा: घोषणा vs अभिव्यक्ति

    JavaScript में फंक्शन बनाने के दो मुख्य तरीके हैं: फंक्शन डिक्लेरेशन (घोषणा) और फंक्शन एक्सप्रेशन (अभिव्यक्ति)। दोनों के अलग-अलग व्यवहार और उपयोग के मामले हैं। उदाहरण { sampleEle.innerHTML = helloWorld (डिक्लेरेशन):\n + helloWorld.toString() + \n\n; sampleEle.innerHTML += testFun

  1. पायथन मैटप्लॉटलिब में Y-एक्सिस पर मान कैसे निर्दिष्ट करें? पायथन मैटप्लॉटलिब में Y-एक्सिस पर मान कैसे निर्दिष्ट करें?

    पायथन में Y-एक्सिस पर मान निर्दिष्ट करने के लिए, हम निम्नलिखित चरण अपना सकते हैं: नम्पाई का उपयोग करके x और y डेटा पॉइंट्स बनाएं। एक्सिस के मान निर्दिष्ट करने के लिए, कैरेक्टर्स की एक सूची बनाएं। xticks और yticks मेथड का उपयोग करके क्रमशः x और y टिक्स डेटा पॉइंट्स के साथ एक्सिस पर टिक्स निर्दिष्ट