1 पॉइंट द्वारा GN⁺ 2023-12-26 | 1 टिप्पणियां | WhatsApp पर शेयर करें

Ruby 3.3.0 जारी

  • Ruby 3.3.0 वर्ज़न जारी किया गया। इसमें नया parser Prism जोड़ा गया है, parser generator के रूप में Lrama का उपयोग किया गया है, pure Ruby में लिखा गया JIT compiler RJIT जोड़ा गया है, और खास तौर पर YJIT के performance में सुधार हुआ है।

Prism parser

  • Prism, Ruby भाषा के लिए एक portable, error-resilient और maintain करने में आसान recursive descent parser है, और इसे default gem के रूप में उपलब्ध कराया गया है।
  • Prism production environment के लिए उपयुक्त है, सक्रिय रूप से maintain किया जा रहा है, और Ripper के विकल्प के रूप में उपयोग किया जा सकता है।
  • Prism के उपयोग के लिए विस्तृत documentation उपलब्ध है।
  • Prism, CRuby के भीतर उपयोग की जाने वाली C library भी है और ऐसा Ruby gem भी है जिसे Ruby code parse करने वाले किसी भी tool में इस्तेमाल किया जा सकता है।
  • Prism API के मुख्य methods में Prism.parse(source), Prism.parse_comments(source), Prism.parse_success?(source) आदि शामिल हैं।
  • Prism repository में सीधे pull request या issue submit करके योगदान दिया जा सकता है।
  • Prism compiler को प्रयोगात्मक रूप से इस्तेमाल करने के लिए ruby --parser=prism या RUBYOPT="--parser=prism" का उपयोग किया जा सकता है, लेकिन इसे केवल debugging के उद्देश्य से ही इस्तेमाल करना चाहिए।

Lrama parser generator

  • Bison को Lrama LALR parser generator से replace किया गया है।
  • Ruby parser के भविष्य के विज़न को संदर्भ के रूप में देखा जा सकता है।
  • maintainability के लिए internal Lrama parser को Racc द्वारा generate किए गए LR parser से replace किया गया है।
  • parameterized rules (?, *, +) का support जोड़ा गया है, और इन्हें Ruby parse.y में इस्तेमाल किया जाएगा।

YJIT

  • Ruby 3.2 की तुलना में बड़े performance improvements किए गए हैं।
  • splat और rest arguments के support में सुधार हुआ है।
  • virtual machine के stack operations के लिए registers assign किए गए हैं।
  • optional arguments वाले अधिक calls अब compile किए जाते हैं। exception handlers भी compile किए जाते हैं।
  • unsupported call types और megamorphic call sites अब interpreter पर वापस नहीं जाते।
  • Rails के #blank? और special-case #present? जैसे base methods को inline किया गया है।
  • Integer#*, Integer#!=, String#!=, String#getbyte, Kernel#block_given?, Kernel#is_a?, Kernel#instance_of?, Module#=== आदि को विशेष रूप से optimize किया गया है।
  • compile speed, Ruby 3.2 की तुलना में थोड़ी तेज़ हुई है।
  • Optcarrot में यह interpreter से 3 गुना से अधिक तेज़ है!
  • Ruby 3.2 की तुलना में memory usage में बड़ा सुधार हुआ है।
  • compiled code का metadata अब बहुत कम memory इस्तेमाल करता है।
  • --yjit-call-threshold को 30 से बढ़ाकर उन applications के लिए अपने-आप 120 कर दिया जाता है जिनमें 40,000 से अधिक ISEQ होते हैं।
  • --yjit-cold-threshold जोड़ा गया है ताकि cold ISEQ की compilation को skip किया जा सके।
  • Arm64 पर अधिक compact code generate होता है।
  • code GC अब default रूप से disabled है।
  • --yjit-exec-mem-size को अब उस hard limit के रूप में माना जाता है जहाँ नया code compile होना बंद हो जाता है।
  • code GC से performance degradation नहीं होता, और Pitchfork का उपयोग करते समय server के refork होने पर copy-on-write behavior बेहतर होता है।
  • चाहें तो --yjit-code-gc के साथ code GC को enable किया जा सकता है।
  • runtime पर YJIT enable करने के लिए RubyVM::YJIT.enable जोड़ा गया है।
  • Rails 7.2 इस तरीके का उपयोग करके default रूप से YJIT enable करेगा।
  • application के boot पूरा होने के बाद ही YJIT enable करना हो तो यह तरीका उपयोग किया जा सकता है।
  • boot के समय YJIT को disabled रखते हुए दूसरे YJIT options का उपयोग करने के लिए --yjit-disable इस्तेमाल किया जा सकता है।
  • अब default रूप से अधिक YJIT stats उपलब्ध हैं।
  • yjit_alloc_size और metadata से जुड़े कई stats default रूप से उपलब्ध हैं।
  • --yjit-stats द्वारा generate किया गया ratio_in_yjit stat अब release build में उपलब्ध है। अब special stats या development build की ज़रूरत नहीं है।
  • अधिक profiling features जोड़े गए हैं।
  • Linux perf के साथ profiling को आसान बनाने के लिए --yjit-perf जोड़ा गया है।
  • --yjit-trace-exits अब --yjit-trace-exits-sample-rate=N के साथ sampling को support करता है।
  • अधिक thorough testing और कई bug fixes किए गए हैं।

RJIT

  • pure Ruby में लिखा गया JIT compiler RJIT पेश किया गया है और यह MJIT की जगह लेता है।
  • RJIT केवल Unix platforms के x86-64 architecture पर support करता है।
  • MJIT के विपरीत, runtime पर C compiler की आवश्यकता नहीं होती।
  • RJIT केवल experimental उद्देश्यों के लिए मौजूद है।
  • production environment में YJIT का ही उपयोग जारी रखना चाहिए।
  • यदि Ruby JIT development में रुचि हो, तो RubyKaigi के day 3 में k0kubun के presentation को देखने की सिफारिश की गई है।

M:N thread scheduler

  • M:N thread scheduler पेश किया गया है।
  • M Ruby threads को N native threads (operating system threads) द्वारा manage किया जाता है, जिससे thread creation और management की लागत घटती है।
  • M:N thread scheduler, C extensions के साथ compatibility तोड़ सकता है, इसलिए यह main Ractor में default रूप से disabled है।
  • main Ractor में M:N threads enable करने के लिए RUBY_MN_THREADS=1 environment variable का उपयोग किया जा सकता है।
  • non-main Ractor में M:N threads हमेशा enabled रहते हैं।
  • RUBY_MAX_CPU=n environment variable, N की अधिकतम संख्या (native threads की अधिकतम संख्या) सेट करता है। default मान 8 है।
  • क्योंकि हर Ractor पर केवल एक Ruby thread चल सकता है, इसलिए single-Ractor applications (ज़्यादातर applications) केवल 1 native thread का उपयोग करते हैं।
  • blocking operations को support करने के लिए N से अधिक native threads का उपयोग किया जा सकता है।

Performance improvements

  • defined?(@ivar) को Object Shapes का उपयोग करके optimize किया गया है।
  • Socket.getaddrinfo जैसी name resolution अब interrupt की जा सकती है (उन environments में जहाँ pthreads उपलब्ध हैं)।
  • garbage collector के लिए कई performance improvements किए गए हैं।
    • जब young objects को old objects refer करते हैं, तो उन्हें अब तुरंत old generation में promote नहीं किया जाता, जिससे major GC collection की frequency काफी कम होती है।
    • major GC collection trigger करने वाले unprotected objects की संख्या को नियंत्रित करने के लिए नया tuning variable REMEMBERED_WB_UNPROTECTED_OBJECTS_LIMIT_RATIO पेश किया गया है। इसका default मान 0.01 (1%) है, जिससे major GC collection की frequency काफी कम होती है।
    • कई core types के लिए, जहाँ Write Barriers गायब थे, implementation जोड़ी गई है। इससे minor GC collection time और major GC collection frequency दोनों में काफी कमी आती है।
    • अब अधिकांश core classes Variable Width Allocation का उपयोग करती हैं। इससे इन classes का allocation और deallocation तेज़ होता है, memory usage घटता है, और heap fragmentation कम होती है।
    • garbage collector में weak reference support जोड़ा गया है।

अन्य उल्लेखनीय बदलाव

  • IRB को कई improvements मिले हैं, जिनमें advanced irb:rdbg integration, ls, show_source और show_cmds commands के लिए pager support, ls और show_source commands द्वारा दी जाने वाली जानकारी की accuracy और usefulness में सुधार, तथा type analysis का उपयोग करने वाला experimental auto-completion शामिल है।
  • IRB ने भविष्य के improvements को आसान बनाने के लिए बड़े पैमाने पर refactoring भी किया है और दर्जनों bug fixes प्राप्त किए हैं।

Compatibility issues

  • block के भीतर बिना arguments के it call का उपयोग अब deprecated है, और Ruby 3.4 में यह पहले block parameter को refer करेगा।
  • unused environment variables हटा दिए गए हैं।

Standard library updates

  • RubyGems और Bundler अब warning दिखाते हैं यदि user Gemfile या gemspec में जोड़े बिना नीचे दिए गए gems को require करता है। ऐसा इसलिए है क्योंकि ये gems Ruby के future versions में bundled gems बनने वाले हैं।
  • निम्न default gems जोड़े गए या update किए गए हैं: prism 0.19.0, RubyGems 3.5.3, abbrev 0.1.2 आदि कई।
  • निम्न bundled gems को default gems से promote किया गया है या update किया गया है: racc 1.7.3, minitest 5.20.0 आदि कई।

GN⁺ की राय

  • Prism parser का परिचय: Ruby 3.3.0 की सबसे महत्वपूर्ण विशेषताओं में से एक नया Prism parser है। यह Ruby code को अधिक कुशलता से parse करता है, errors के प्रति अधिक resilient है, और maintain करना आसान है, जिससे Ruby developers को बड़ा लाभ मिलेगा।
  • YJIT के performance improvements: YJIT में बड़े performance improvements, Ruby applications की execution speed को काफी बढ़ाएंगे। खास तौर पर memory usage में कमी और GC optimization, बड़े Ruby applications के performance और stability पर सकारात्मक असर डालेंगे।
  • M:N thread scheduler: M:N thread scheduler का परिचय multithreaded Ruby applications के performance को बेहतर बनाने की क्षमता रखता है। यह thread management cost को घटाएगा और अधिक कुशल parallel processing संभव करेगा।

1 टिप्पणियां

 
GN⁺ 2023-12-26
Hacker News राय
  • Ruby 3.3 के आने से, डेवलपर की खुशी को महत्व देने वाली भाषा Ruby ने अपनी पहले वाली धीमी छवि से बाहर निकलकर तेज़ प्रदर्शन दिखाया है.

    • YJIT तकनीक, object shapes, GC optimization जैसी नवाचारों के जरिए Ruby की performance में बड़ा सुधार हुआ है.
    • Shopify जैसी बड़ी Ruby उपयोग करने वाली कंपनियां Ruby 3.3 के performance improvements का अनुभव कर रही हैं.
    • Ruby के भविष्य को लेकर व्यक्तिगत रूप से बहुत उत्साहित हैं, और Ruby 3.3 को ग्राहकों की production sites पर लागू करने को लेकर भी उत्सुकता जताई गई है.
  • Ruby 3.3 को पिछले 10 वर्षों का सबसे महत्वपूर्ण और feature-rich release बताया गया है, और इस बात पर हैरानी जताई गई है कि उसने Python से पहले JIT जारी किया.

    • Prism, Lrama, IRB जैसी कई सुविधाओं पर पहले के Hacker News submissions में चर्चा हो चुकी है.
    • Ractor, M:N thread scheduler, Fibre, Async जैसी सुविधाओं का Rails के संदर्भ में पर्याप्त उल्लेख नहीं हुआ, और इन्हें production में इस्तेमाल करने वालों के अनुभव सुनने की इच्छा जताई गई है.
  • बताया गया है कि Heroku पर Ruby 3.3 उपलब्ध है.

  • Ruby भाषा हर साल Christmas पर नया release जारी करती है.

  • सवाल उठाया गया है कि अगर Python और NodeJS पहले से आते हों, तो क्या Ruby सीखना अब भी सार्थक है. Ruby आकर्षक लगती है, लेकिन साथ ही कठिन भी.

  • Socket.getaddrinfo जैसी name resolution रुक सकती है. जब भी name resolution की ज़रूरत होती है, एक worker pthread बनाया जाता है और getaddrinfo(3) चलाया जाता है.

    • यह भी पूछा गया है कि क्या दूसरी language runtimes भी ऐसा ही करती हैं. Thread creation भारी लग सकता है, लेकिन benchmarks के अनुसार overhead बहुत कम है.
  • Prism दिलचस्प लग रहा है. पूछा गया है कि क्या Ruby code analysis tools में Prism का उपयोग करने के कोई उदाहरण हैं.

  • RUBY_MAX_CPU=n environment variable native threads की अधिकतम संख्या सेट करता है. इसका default 8 है.

    • इस पर सवाल उठाया गया है कि क्या default logical cores की संख्या के बराबर होना चाहिए, जैसे Rust के Tokio और कई अन्य M:N runtimes में होता है.
  • Prism का उपयोग करने वाले अच्छे examples के लिंक खोजे जा रहे हैं. Release page पर "notable APIs" के अलावा ज़्यादा कुछ न देखकर निराशा जताई गई है.

  • इसे एक परफेक्ट Christmas gift बताया गया है.