Ruby 3.3 रिलीज़
(ruby-lang.org)- YJIT ने Ruby 3.2 की तुलना में परफॉर्मेंस और मेमोरी उपयोग में बड़ा सुधार किया है, और Optcarrot में यह इंटरप्रेटर से 3 गुना से भी अधिक तेज़ है
- YJIT का Code GC डिफ़ॉल्ट रूप से निष्क्रिय कर दिया गया है, और
--yjit-exec-mem-sizeनए कोड कंपाइल को रोकने वाली हार्ड लिमिट की तरह काम करता है RubyVM::YJIT.enableजोड़ा गया है, जिससे कमांड लाइन आर्ग्युमेंट या environment variable बदले बिना runtime पर YJIT को सक्रिय किया जा सकता है- डिफ़ॉल्ट gem के रूप में Prism parser जोड़ा गया है, और
Prism.parse(source),Prism.parse_comments(source),Prism.parse_success?(source)API का उपयोग किया जा सकता है ruby --parser=prismयाRUBYOPT="--parser=prism"से Prism compiler का प्रयोग किया जा सकता है, लेकिन यह फ़्लैग केवल debugging के लिए है- parser generator को Bison से Lrama में बदला गया है, और Lrama के internal parser को maintainability के लिए Racc-जनरेटेड LR parser से बदला गया है
- pure-Ruby JIT compiler RJIT अब MJIT की जगह लेता है, लेकिन यह केवल Unix की x86-64 architecture को सपोर्ट करता है और प्रयोगात्मक उपयोग तक सीमित है
- M:N thread scheduler जोड़ा गया है, जिसमें N native threads, M Ruby threads को मैनेज करते हैं, लेकिन यह C extension compatibility को तोड़ सकता है, इसलिए main Ractor में यह डिफ़ॉल्ट रूप से निष्क्रिय है
itको बिना arguments के कॉल करना और सामान्य parameters के बिना block में उसका उपयोग अब deprecated है, और Ruby 3.4 में यह पहले block parameter का reference बन जाएगाRegexp::newअब Ruby 3.2 में deprecated की गई 3-argument call के बजाय अधिकतम 2 arguments ही स्वीकार करता हैext/readlineको रिटायर कर दिया गया है, और आगे चलकरext/readlineAPI के साथ compatible pure Ruby implementationrelineपर निर्भर किया जाएगा- अगर
ext/readlineकी ज़रूरत हो, तो इसे rubygems.org सेgem install readline-extद्वारा इंस्टॉल किया जा सकता है, और अबlibreadlineयाlibeditजैसी लाइब्रेरी इंस्टॉल करने की ज़रूरत नहीं है - RubyGems और Bundler अब कुछ gems को Gemfile या gemspec में जोड़े बिना
requireकरने पर चेतावनी देते हैं, और ये gems भविष्य के Ruby versions में bundled gem बन जाएंगे - bootsnap gem का उपयोग करने पर यह चेतावनी दबा दी जाती है, और इस version की सीमा के कारण application को कम से कम एक बार
DISABLE_BOOTSNAP=1environment variable के साथ चलाने की सिफारिश की जाती है - डिफ़ॉल्ट gem के रूप में
prism 0.19.0जोड़ा गया है, औरracc 1.7.3को default gem से बढ़ाकर bundled gem बनाया गया है
1 टिप्पणियां
Hacker News की राय
मुझे लगता है Ruby 3.3 के साथ Ruby ने जोरदार वापसी की है। यह भाषा developer happiness पर फोकस करती थी, लेकिन धीमी होने के लिए उसका मजाक उड़ाया जाता था; अब यह धीमी नहीं रही
YJIT कमाल की तकनीक है, और object shape व कई तरह के garbage collection optimizations के साथ Ruby काफी तेज हो रही है। Shopify जैसे बड़े Ruby users भी 3.3 pre-release में YJIT चालू करके production में चला रहे हैं और double-digit percentage performance improvement रिपोर्ट कर रहे हैं
निजी तौर पर मैं Ruby और उसके भविष्य को लेकर सच में उत्साहित हूं, और Ruby 3.3 के साथ काम करके इसे customers की production sites पर लागू करके देखना चाहता हूं
https://railsatscale.com/2023-09-18-ruby-3-3-s-yjit-runs-sho...
मैंने इसे Redis-based DNS record store और PowerDNS के बीच glue code के लिए भी इस्तेमाल किया, और पूरा stack 14 छोटे VPS पर महीने में 500 million queries संभालता था, htop में कोई खास असर दिखे बिना। Performance की वजह से PowerDNS नहीं चुना था; वजह यह थी कि public internet पर expose होने वाली encryption, HTTP, DNS जैसी चीजें खुद implement करना आमतौर पर अच्छा नहीं होता
आज के web की विडंबना यह है कि “धीमी” Ruby और server rendering से बना webapp, असल में धीमे eventually consistent databases और भारी-भरकम frontend webapps की तुलना में page loading में ज्यादा तेज होता है। Modern web में छोटे-छोटे काम करते समय भी loading spinner बहुत बार दिखता है
लिंक खोला तो यह 10% के आसपास improvement था। इससे Rust, Java, Go, C++ जैसी “fast” languages की तुलना में Ruby के लगभग 50–200 गुना धीमी होने वाली धारणा में ज्यादा फर्क नहीं पड़ेगा
Ruby 3.3 पिछले 10 वर्षों में सबसे महत्वपूर्ण और feature-rich Ruby releases में से एक लगती है। मुझे नहीं लगा था कि Python से पहले production-ready JIT आ जाएगा, और इसमें Prism, Lrama, IRB भी हैं
लेकिन जिन चीजों पर पर्याप्त चर्चा नहीं हो रही, वे हैं Ractor, M:N thread scheduler, Fiber, Async। खासकर Rails के संदर्भ में, क्या कोई इन features को production environment में इस्तेमाल कर रहा है—उनकी राय सुनना चाहूंगा
फिर भी Ractor को ज्यादा spotlight मिलनी चाहिए। यह बहुत बड़ा feature है
शायद कंपनियों के अंदर RabbitMQ या Redis based हजारों private custom solutions होंगे
हर साल Christmas पर घड़ी की तरह Ruby Lang नई release निकालता है
Heroku पर उपलब्ध है: https://devcenter.heroku.com/changelog-items/2772
अच्छा लग रहा है। नया IRB बेहतर auto-completion और debugging वाला interactive Ruby interpreter है। Ruby 3.3 के ज्यादातर changes developer tools में सुधार की ओर जाते दिखते हैं
Language API मोटे तौर पर पिछली releases के साथ consistent रहती है। कई version managers के notes के साथ मैंने Ruby 3.3 update guide लिखी है: https://mac.install.guide/ruby/update.html
जिज्ञासा है कि किस version manager की सिफारिश करनी चाहिए, यह समझ नहीं आ रहा। पहले asdf, frum, chruby recommend किए थे
Socket.getaddrinfoजैसे name resolution को अब interrupt किया जा सकता है, और कहा जा रहा है कि जब भी name resolution की जरूरत होती है, एक worker pthread बनाकर उसके अंदरgetaddrinfo(3)चलाया जाता हैसोच रहा हूं कि दूसरी language runtimes भी कुछ ऐसा ही करती हैं या नहीं। Thread बनाना बहुत heavy लगता है, लेकिन असल में शायद यह बड़ी समस्या न हो। इनके अपने benchmarks के हिसाब से भी overhead छोटा है, लेकिन zero नहीं
10000.times { Addrinfo.getaddrinfo("www.ruby-lang.org", 80) }patch से पहले 2.3 सेकंड और patch के बाद 3.0 सेकंड था, और100.times { URI.open("https://www.ruby-lang.org").read }patch से पहले 3.36 सेकंड और patch के बाद 3.40 सेकंड थाPython की तरह उसी operation को async “color” में फिर से implement करने के बजाय, मुझे यह impression मिला कि सब कुछ default रूप से asynchronous में ले जाया गया है; पता नहीं यह सही है या नहीं
अगर पहले से Python और NodeJS जानते हैं, तो सोच रहे हैं कि Ruby सीखने लायक है या नहीं। Ruby दिलचस्प है, लेकिन कठिन लगती है
अगर आप Node और Python में दक्ष हैं, तो इसे सीखना काफ़ी आसान होगा। कमी यह है कि अगर आप वे भाषाएँ पहले से जानते हैं, तो यह मूल रूप से कुछ नया नहीं देगी। फायदा मुख्यतः सौंदर्यात्मक है: Ruby कोड को सचमुच खूबसूरती से व्यक्त करने के तरीके देती और प्रोत्साहित करती है, और उसे अनुभव करना मज़ेदार है
मैं मुख्य रूप से TypeScript codebase पर काम करता हूँ, लेकिन log data या semi-structured text संभालते समय, या कई files में regex-आधारित rewrites करते समय, अक्सर Ruby निकालता हूँ। Ruby बहुत मज़ेदार है, और जिन भाषाओं का मैंने नियमित रूप से इस्तेमाल किया है उनमें शायद सबसे मज़ेदार है, इसलिए यह अपने आप में reward है
सबसे बड़ा उदाहरण यह है कि Ruby को blocks वाकई बहुत पसंद हैं। वे standard library में हर जगह हैं, syntax sugar भी बहुत है, और blocks के इर्द-गिर्द बने DSL तो अनगिनत हैं। मानक functional features भी standard library में बहुत पहले से हैं, इसलिए functional style को सहज और पढ़ने योग्य तरीके से लिखा जा सकता है
Python में भी तकनीकी रूप से ज़्यादातर चीजें संभव हैं, लेकिन लिखने और पढ़ने में बहुत ज़्यादा awkward लगती हैं। Python में lambda है, पर लगता है कि उसे मामूली उपयोगों से आगे ज़्यादा पसंद नहीं किया जाता, और उसकी जगह functions हर जगह first-class values के रूप में इस्तेमाल होते हैं
नई तकनीक पर नज़र रखने वाले लोग node.js और AngularJS आधारित API-oriented development की ओर जा रहे थे, जो RoR से बने कामों की तुलना में काफी तेज़ था। 2013 का RoR अब भी standard तरीके से monolithic था, और frontend/backend separation वाले नए paradigm में अच्छी तरह shift नहीं कर पा रहा था, इसलिए पुराना दिखने लगा था
Ruby खुद नहीं, बल्कि Ruby से बने framework की बात इतनी लंबी इसलिए की, क्योंकि मुझे लगता है कि आज भी Ruby development का 95% Rails applications ही होगा। Ruby ज्यादातर Ruby on Rails की वजह से मशहूर हुई, और अगर RoR गिरावट पर है, तो Ruby भी शायद Perl की तरह उसी दिशा में जाएगी, जब तक कि वह एक छोटे लेकिन उत्साही community तक सीमित न हो जाए
भाषा को अलग से देखें, तो Python या TypeScript की जगह Ruby चुनने का कोई कारण याद नहीं आता। भाषा या platform, किसी भी लिहाज़ से Ruby अपने पहले से बेहतर स्थापित competitors से बेहतर कुछ करती हुई नहीं दिखती
Prism दिलचस्प है। सोच रहा हूँ कि क्या इसका इस्तेमाल करने वाले Ruby code analysis tools हैं। मैं company code analysis का तरीका खोज रहा था
कहा गया है कि
RUBY_MAX_CPU=nenvironment variable अधिकतम N, यानी अधिकतम native threads की संख्या सेट करता है, और default 8 हैलगता है default Rust के Tokio या ढेरों M:N runtimes की तरह logical cores की संख्या होना चाहिए
init()याmain()में GO_MAX_PROCS सेट करने की याद हैRuby 4.0 में मौजूदा implicit तरीके से global namespace में gems लाने के बजाय explicit import की अनुमति मिले तो अच्छा होगा
“namespace on read” नाम की अनुमानित/प्रस्तावित feature पर चर्चा भी है: https://bugs.ruby-lang.org/issues/19744
यह बात कि global namespace हर gem के ठीक एक version को ही support करता है, stable ABI और deprecation grace periods को महत्व देने वाली स्वस्थ संस्कृति को भी बढ़ावा देती है। कुछ language ecosystems की तुलना में यह सपने जैसा environment है
या फिर हो सकता है कि मैं पूरी तरह गलत बात कर रहा हूँ
https://youtu.be/4MM5b2F9zrM?si=UT3aUbD6p_uBZehS&t=2347