การเปิดตัวภาษาโปรแกรม Ruby 3.2

Ruby 3.2.0 เปิดตัวแล้ว ซึ่งเป็นภาษาการเขียนโปรแกรมเชิงวัตถุแบบไดนามิกที่มีประสิทธิภาพสูงในการพัฒนาโปรแกรมและรวมเอาคุณสมบัติที่ดีที่สุดของ Perl, Java, Python, Smalltalk, Eiffel, Ada และ Lisp รหัสโครงการเผยแพร่ภายใต้ใบอนุญาต BSD (“2-clause BSDL”) และ “Ruby” ซึ่งอ้างอิงถึงใบอนุญาต GPL เวอร์ชันล่าสุด และเข้ากันได้กับ GPLv3 โดยสมบูรณ์

การปรับปรุงหลัก:

  • เพิ่มพอร์ตเริ่มต้นของตัวแปล CRuby ซึ่งคอมไพล์เป็นโค้ดระดับกลางของ WebAssembly สำหรับการใช้งานในเว็บเบราว์เซอร์หรือภายใต้รันไทม์แบบสแตนด์อโลน เช่น wasmtime สำหรับการโต้ตอบโดยตรงกับระบบปฏิบัติการเมื่อทำงานแยกกัน จะใช้ WASI (WebAssembly System Interface) API เหนือสิ่งอื่นใด Wrapper VFS มีให้ที่ด้านบนของ WASI ซึ่งช่วยให้คุณสามารถจัดแพคเกจแอปพลิเคชัน Ruby ทั้งหมดเป็นการนำเสนอในรูปแบบของไฟล์ Wasm ไฟล์เดียว การทำงานในเบราว์เซอร์สามารถใช้เพื่อสร้างการฝึกอบรมและการสาธิตบริการเว็บ เช่น TryRuby ในขั้นตอนการพัฒนาปัจจุบัน พอร์ตสามารถผ่านชุดทดสอบพื้นฐานและบูตสแตรป ซึ่งไม่ได้ใช้ Thread API ได้สำเร็จ พอร์ตยังไม่รองรับไฟเบอร์ ข้อยกเว้น หรือการรวบรวมขยะ
  • คอมไพเลอร์ JIT ในกระบวนการ YJIT สร้างขึ้นโดยนักพัฒนาแพลตฟอร์มอีคอมเมิร์ซของ Shopify โดยเป็นส่วนหนึ่งของความคิดริเริ่มในการเพิ่มประสิทธิภาพของโปรแกรม Ruby ที่ใช้เฟรมเวิร์ก Rails และเรียกใช้วิธีการมากมาย ได้รับการประกาศว่ามีเสถียรภาพและพร้อมสำหรับ การใช้การผลิต ข้อแตกต่างที่สำคัญจากคอมไพเลอร์ MJIT JIT ที่ใช้ก่อนหน้านี้ ซึ่งอิงตามการประมวลผลวิธีทั้งหมดและใช้คอมไพเลอร์ภายนอกในภาษา C คือ YJIT ใช้ Lazy Basic Block Versioning (LBBV) และมีคอมไพเลอร์ JIT ที่ผสานรวม เมื่อใช้ LBBV JIT จะคอมไพล์เฉพาะส่วนเริ่มต้นของเมธอด และคอมไพล์ส่วนที่เหลือในภายหลัง หลังจากกำหนดประเภทของตัวแปรและอาร์กิวเมนต์ที่ใช้ระหว่างการดำเนินการแล้ว YJIT พร้อมใช้งานสำหรับสถาปัตยกรรม x86-64 และ arm64/aarch64 บน Linux, MacOS, BSD และแพลตฟอร์ม UNIX อื่นๆ

    ต่างจาก Ruby ตรงที่โค้ด YJIT เขียนด้วยภาษา Rust และต้องใช้คอมไพเลอร์rustc 1.58.0+ สำหรับการคอมไพล์ ดังนั้น YJIT build จะถูกปิดใช้งานตามค่าเริ่มต้นและเป็นทางเลือก เมื่อใช้ YJIT ประสิทธิภาพจะเพิ่มขึ้น 41% เมื่อทำการทดสอบ yjit-bench เมื่อเทียบกับการใช้การตีความ

    การเปิดตัวภาษาโปรแกรม Ruby 3.2

  • เพิ่มการป้องกันเพิ่มเติมจากการปฏิเสธการโจมตีบริการเมื่อประมวลผลข้อมูลภายนอกด้วยนิพจน์ทั่วไป (ReDoS) ที่ไม่มีประสิทธิภาพและใช้เวลานาน อัลกอริธึมการจับคู่ซึ่งใช้เทคนิคการท่องจำได้รับการปรับปรุงอย่างมีนัยสำคัญ ตัวอย่างเช่น เวลาดำเนินการของนิพจน์ '/^a*b?a*$/ =~ "a" * 50000 + "x"' ลดลงจาก 10 เป็น 0.003 วินาที ต้นทุนของการเพิ่มประสิทธิภาพคือการเพิ่มขึ้นของการใช้หน่วยความจำ ซึ่งปริมาณการใช้นั้นสูงกว่าขนาดของข้อมูลที่ป้อนประมาณ 10 เท่า มาตรการรักษาความปลอดภัยประการที่สองคือความสามารถในการกำหนดการหมดเวลา (เช่น "Regexp.timeout = 1.0") ซึ่งในระหว่างนั้นจะต้องประมวลผลนิพจน์ทั่วไป
  • รวมโหมด syntax_suggest ไว้ด้วย ซึ่งจะช่วยวินิจฉัยสาเหตุของข้อผิดพลาดที่เกี่ยวข้องกับนิพจน์ "สิ้นสุด" ที่ขาดหายไปหรือเกินมา `end' ที่ไม่ตรงกัน ไม่มีคำหลัก (`do', `def`, `if` ฯลฯ) ? สุนัขคลาส 1 > defbark 2 > 3 end 4 end
  • เพิ่มความสามารถในการทำเครื่องหมายอาร์กิวเมนต์สำหรับข้อผิดพลาดที่เกี่ยวข้องกับประเภทและอาร์กิวเมนต์ในโหมดแสดงตำแหน่งข้อผิดพลาดแล้ว ตัวอย่างเช่น: test.rb:2:in `+': nil can't be coerced into 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

เพิ่มความคิดเห็น