Ruby 3.2.0 منتشر شد، یک زبان برنامه نویسی شی گرا پویا که در توسعه برنامه بسیار کارآمد است و بهترین ویژگی های Perl، Java، Python، Smalltalk، Eiffel، Ada و Lisp را در خود جای داده است. کد پروژه تحت مجوزهای BSD ("2-clause BSDL") و "Ruby" توزیع شده است که به آخرین نسخه مجوز GPL اشاره دارد و کاملاً با GPLv3 سازگار است.
بهبودهای اصلی:
- یک پورت اولیه از مفسر CRuby اضافه شد که برای اجرا در یک مرورگر وب یا در زمانهای اجرا مستقل مانند wasmtime در کد میانی WebAssembly کامپایل میشود. برای تعامل مستقیم با سیستم عامل هنگام اجرای جداگانه، API WASI (WebAssembly System Interface) استفاده می شود. در میان چیزهای دیگر، یک لفاف VFS در بالای WASI ارائه شده است که به شما امکان می دهد کل برنامه Ruby را در یک ارائه در قالب یک فایل wam واحد بسته بندی کنید. اجرای در مرورگر می تواند برای ایجاد آموزش و خدمات وب نمایشی مانند TryRuby استفاده شود. در مرحله کنونی توسعه، پورت مجموعههای تست پایه و بوت استرپ را با موفقیت پشت سر میگذارد که از Thread API استفاده نمیکنند. این پورت همچنین از فیبرها، استثناها یا جمعآوری زباله پشتیبانی نمیکند.
- کامپایلر JIT در فرآیند YJIT که توسط توسعه دهندگان پلتفرم تجارت الکترونیک Shopify به عنوان بخشی از ابتکار عمل برای افزایش عملکرد برنامههای Ruby که از چارچوب Rails استفاده میکنند و روشهای زیادی را فراخوانی میکنند، ایجاد شده است، پایدار و آماده اعلام شده است. استفاده تولید تفاوت اصلی با کامپایلر MJIT JIT که قبلاً استفاده شده بود، که مبتنی بر پردازش کل روشها است و از یک کامپایلر خارجی در زبان C استفاده میکند، این است که YJIT از نسخهسازی بلوک پایه Lazy (LBBV) استفاده میکند و شامل یک کامپایلر JIT یکپارچه است. با LBBV، JIT ابتدا فقط ابتدای متد را کامپایل می کند و بقیه را مدتی بعد، پس از مشخص شدن انواع متغیرها و آرگومان های مورد استفاده در حین اجرا، کامپایل می کند. YJIT برای معماریهای x86-64 و arm64/aarch64 در لینوکس، MacOS، BSD و سایر پلتفرمهای یونیکس در دسترس است.
برخلاف روبی، کد YJIT به زبان Rust نوشته شده است و برای کامپایل به کامپایلر rustc 1.58.0+ نیاز دارد، بنابراین ساخت YJIT به طور پیش فرض غیرفعال است و اختیاری است. هنگام استفاده از YJIT، 41 درصد افزایش در عملکرد هنگام اجرای آزمون yjit-bench در مقایسه با استفاده از تفسیر ثبت شد.
- حفاظت اضافی در برابر حملات انکار سرویس هنگام پردازش داده های خارجی در عبارات منظم ناکارآمد و وقت گیر (ReDoS) اضافه شده است. الگوریتم تطبیق که از تکنیک به خاطر سپردن استفاده می کند، به طور قابل توجهی بهبود یافته است. برای مثال، زمان اجرای عبارت '/^a*b?a*$/ =~ "a" * 50000 + "x"' از 10 به 0.003 ثانیه کاهش یافت. هزینه بهینه سازی افزایش مصرف حافظه است که مصرف آن تقریباً 10 برابر بیشتر از اندازه داده های ورودی است. دومین اقدام امنیتی، توانایی تعریف یک بازه زمانی است (به عنوان مثال، "Regexp.timeout = 1.0") که در طی آن عبارت منظم باید پردازش شود.
- حالت syntax_suggest گنجانده شده است، که به تشخیص علل خطاهای مرتبط با عبارت "پایان" گم شده یا بسته اضافی کمک می کند. «پایان» بی همتا، کلید واژه گمشده («انجام»، «دف»، «اگر»، و غیره)؟ 1 کلاس سگ > 2 دفبارک > 3 انتهای 4 انتها
- قابلیت علامتگذاری آرگومانها برای خطاهای مربوط به انواع و آرگومانها به حالت نمایش مکان خطا اضافه شده است، به عنوان مثال: test.rb:2:in '+': صفر نمیتواند به Integer (TypeError) sum = ary اضافه شود. [0] + آری [1] ^^^^^^
- دستور جدیدی برای هدایت مجموعههای آرگومان به روشهای دیگر اضافه شد: def foo(*) bar(*) end def baz(**) quux(**) end
- Ruby_vm/mjit/compiler پیشنهاد شده است - نوعی از کامپایلر قدیمی MJIT JIT که به زبان Ruby بازنویسی شده است. اطمینان حاصل شود که MJIT به جای اجرا در یک رشته کارگر MJIT در یک فرآیند جداگانه اجرا می شود.
- در Bundler 2.4، پردازش وابستگی از آشکارساز نسخه PubGrub استفاده میکند که در مدیریت بسته pub برای زبان Dart نیز استفاده میشود. الگوریتم Molinillo که قبلا استفاده شده بود همچنان در RubyGems استفاده می شود، اما در آینده توسط PubGrub نیز جایگزین خواهد شد.
- نسخه های به روز شده ماژول های جواهر داخلی و موارد موجود در کتابخانه استاندارد.
منبع: opennet.ru