Ruby 3.2.0 Preview 1 Dirilis

Kami dengan senang hati mengumumkan rilis dari Ruby 3.2.0-preview1. Ruby 3.2 menambahkan banyak fitur dan perbaikan performa.

Dukungan WebAssembly berbasis WASI

Ini adalah sebuah port awal dari dukungan WebAssembly berbasis WASI. Port ini memperbolehkan sebuah CRuby binary untuk tersedia pada web browser, Serverless Edge environment, dan WebAssembly/WASI embedder lainnya. Saat ini, port melewatkan rangkaian tes dasar dan bootstrap dengan tidak menggunakan Thread API.

Latar belakang

WebAssembly (Wasm) semula diperkenalkan untuk menjalankan program dengan aman dan cepat pada web browser. Tetapi sasarannya

  • menjalankan program secara efisien dengan keamanan pada berbagai macam environment - diinginkan sejak lama tidak hanya oleh web, akan tetapi oleh aplikasi umum.

WASI (The WebAssembly System Interface) didesain untuk berbagai macam kasus penggunaan. Walaupun aplikasi perlu berkomunikasi dengan sistem operasi, WebAssembly berjalan pada sebuah virtual machine yang mana tidak memiliki sebuah system interface. WASI menstandarkan.

Dukungan WebAssembly/WASI pada Ruby bermaksud untuk memanfaatkan proyek-proyek tersebut. Ini memperbolehkan pengembang Ruby untuk memprogram aplikasi yang berjalan pada platform yang menjanjikan.

Kasus penggunaan

Dukungan ini memperbolehkan pengembang untuk memanfaatkan CRuby pada sebuah WebAssembly environment. Sebuah contoh kasus penggunaan adalah dukungan CRuby pada TryRuby playground. Sekarang Anda bisa mencoba CRuby pada web browser.

Poin teknis

WASI dan WebAssembly saat ini memiliki beberapa fitur yang tidak didukung, seperti mengimplementasikan Fiber, exception, dan GC karena ini masih berkembang dan juga untuk alasan keamanan. Oleh sebab itu, CRuby mengisi gap tersebut dengan menggunakan Asyncify, yang mana adalah sebuah teknik transformasi binary untuk mengendalikan eksekusi pada lingkungan pengguna.

Sebagai tambahan, kami membangun sebuah VFS di atas WASI sehingga kami dapat membungkus aplikasi Ruby dengan mudah ke dalam satu berkas .wasm. Teknik ini membuat distribusi aplikasi Ruby sedikit lebih mudah.

Tautan terkait

Regexp timeout

Sebuah fitur timeout pada Regexp matching diperkenalkan.

Regexp.timeout = 1.0

/^a*b?a*$/ =~ "a" * 50000 + "x"
#=> Regexp::TimeoutError is raised in one second

Diketahui bahwa Regexp matching mungkin membutuhkan waktu yang lama. Jika kode Anda mencoba untuk mencocokkan sebuah Regexp yang tidak efisien dengan sebuah masukan yang tidak terpercaya, seorang penyerang bisa mengeksploitasi ini untuk Denial of Service (disebut Regular expression DoS atau ReDoS) yang efisien.

Risiko dari DoS dapat dicegah atau dikurangi secara signifikan dengan mengatur Regexp.timeout berdasarkan kebutuhan dari aplikasi Ruby Anda. Mohon coba fitur ini pada aplikasi Anda. Kami menerima umpan balik Anda.

Catat bahwa Regexp.timeout adalah sebuah pengaturan global. Jika Anda ingin menggunakan pengaturan yang berbeda untuk Regexp tertentu, Anda bisa menggunakan kata kunci timeout pada Regexp.new.

Regexp.timeout = 1.0

# This regexp has no timeout
long_time_re = Regexp.new("^a*b?a*$", timeout: nil)

long_time_re =~ "a" * 50000 + "x" # never interrupted

Proposal asli https://bugs.ruby-lang.org/issues/17837

Fitur penting lainnya

Tidak lagi membundel sumber pihak ketiga

  • Kami tidak lagi membundel sumber pihak ketiga, seperti libyaml, libffi.

    • libyaml telah dihapus dari psych. Anda mungkin butuh untuk memasang libyaml-dev pada platform Ubuntu/Debian. Nama package bisa berbeda pada platform lain.

    • libffi akan dihapus dari fiddle pada preview2

Bahasa

  • Pencarian pattern tidak lagi eksperimental.

Perbaikan performa

Perubahan penting lainnya sejak 3.1

  • Hash
    • Hash#shift sekarang selalu mengembalikan nil jika hash kosong dibandingkan mengembalikan nilai default atau memanggil default proc. [[Bug #16908]]
  • MatchData
    • MatchData#byteoffset telah ditambakan. [[Feature #13110]]
  • Module
    • Module.used_refinements telah ditambakan. [[Feature #14332]]
    • Module#refinements telah ditambakan. [[Feature #12737]]
    • Module#const_added telah ditambakan. [[Feature #17881]]
  • Proc
    • Proc#dup mengembalikan sebuah instance dari subclass. [[Bug #17545]]
    • Proc#parameters sekarang menerima kata kunci lambda. [[Feature #15357]]
  • Refinement
    • Refinement#refined_class telah ditambakan. [[Feature #12737]]
  • Set
    • Set sekarang tersedia sebagai sebuah builtin class tanpa membutuhkan require "set". [[Feature #16989]] Ini dimuatkan secara otomatis melalui constant Set atau sebuah pemanggilan Enumerable#to_set.
  • String
    • String#byteindex dan String#byterindex telah ditambakan. [[Feature #13110]]
    • Memperbarui versi Unicode ke 14.0.0 dan Emoji ke 14.0. [[Feature #18037]] (juga diterapkan pada Regexp)
    • String#bytesplice telah ditambahkan. [[Feature #18598]]
  • Struct
    • Sebuah class Struct juga dapat diinisialisasi dengan argumen kata kunci tanpa keyword_init: true pada Struct.new [[Feature #16806]]

Pembaruan pustaka standar

  • Berikut adalah default gem yang diperbarui.

    • TBD
  • Berikut adalah bundled gem yang diperbarui.

    • TBD
  • Berikut adalah default gem yang sekarang bundled gem. Anda perlu untuk menambahkan pustaka ini pada Gemfile dalam bundler environment.

    • TBD

Lihat NEWS atau commit logs untuk lebih detail.

Dengan perubahan tersebut, 1058 berkas berubah, 34946 sisipan(+), 29962 terhapus(-) sejak Ruby 3.1.0!

Unduh

  • https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.0-preview1.tar.gz

    SIZE: 20728782
    SHA1: 7c4197e67f230b0c5d011f4efb9b9158743a61c8
    SHA256: 6946b966c561d5dfc2a662b88e8211be30bfffc7bb2f37ce3cc62d6c46a0b818
    SHA512: d24e77161996c2085f613a86d1ed5ef5c5bf0e18eb459f6a93a0014a5d2ce41079283b4283d24cb96448a0986c8c6c52a04584abd4e73911ea59cefeb786836e
    
  • https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.0-preview1.tar.xz

    SIZE: 15011400
    SHA1: 6bcc30ac670ab391997e0d68ba97b451db078934
    SHA256: 6d28477f7fa626b63bf139afd37bcfeb28fce6847b203fa10f37cb3615d0c35d
    SHA512: 0eca2c346b995d265df2659b4215ff96e515c29926c2a6256caad99db9c4c51fec1a2d899ca63a00010d4111060dc0fdd4f591be84c0a2c43b6303879de3c5de
    
  • https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.0-preview1.zip

    SIZE: 25370458
    SHA1: 3c93c2e775366eec6e93cf670fc8677934cb4e48
    SHA256: 24f8ae73d56366453defb0654de624bd1c063921a1d7ac780e4da56bb8fbf7e4
    SHA512: 9754f11aa167df167d1b336e5c660aab1bd9e12421c093e0fe96e9a2da4ffb9859b7ea5263473bbc7b57ac8b5568cf7ac3116c0abdc647e1ff97a8d060ff7eae
    

Apa itu Ruby

Ruby pertama kali dikembangkan oleh Matz (Yukihiro Matsumoto) pada 1993 dan sekarang dikembangkan sebagai Open Source. Ruby berjalan di berbagai platform dan digunakan di seluruh dunia, khususnya untuk pengembangan web.