Ditulis oleh naruse tanggal 2022-09-09
Diterjemahkan oleh meisyal
Kami dengan senang hati mengumumkan rilis dari Ruby 3.2.0-preview2. Ruby 3.2 menambahkan banyak fitur dan memperbaiki 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 menstandarkannya.
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 mendorong pengembang untuk memanfaatkan CRuby pada 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 terus 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 mengemas aplikasi Ruby ke dalam sebuah berkas .wasm dengan mudah. 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 akan muncul dalam waktu satu detik
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 yang efisien (disebut Regular expression DoS atau ReDoS).
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
# regexp ini tidak memiliki timeout
long_time_re = Regexp.new("^a*b?a*$", timeout: nil)
long_time_re =~ "a" * 50000 + "x" # tidak pernah diinterupsi
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
-
Argumen dari anonymous rest dan keyword rest sekarang dapat dilewatkan sebagai argumen daripada sekadar digunakan pada parameter method. [Feature #18351]
def foo(*) bar(*) end def baz(**) quux(**) end
-
Sebuah proc yang menerima sebuah positional argument dan keyword tidak akan lagi autosplat. [Bug #18633]
proc{|a, **k| a}.call([1, 2]) # Ruby 3.1 dan sebelumnya # => 1 # Ruby 3.2 dan setelahnya # => [1, 2]
-
Urutan evaluasi dari constant assignment pada objek eksplisit telah dibuat konsisten dengan urutan evaluasi tunggal. Pada kode berikut:
foo::BAR = baz
foo
sekarang dipanggil sebelumbaz
. Demikian pula, untuk multiple assignment pada constant, urutan evaluasi left-to-right digunakan. Pada kode berikut:foo1::BAR1, foo2::BAR2 = baz1, baz2
Urutan evaluasi berikut sekarang digunakan:
foo1
foo2
baz1
baz2
-
Pencarian pattern tidak lagi eksperimental. [Feature #18585]
-
Method mengambil sebuah parameter lain (seperti
*args
) dan mengharapkan untuk mendelegasikan keyword argument melaluifoo(*args)
sekarang harus ditandai denganruby2_keywords
(jika belum terjadi). Dengan kata lain, semua method mengharapkan untuk mendelegasikan keyword argument melalui*args
sekarang harus ditandai denganruby2_keywords
, tanpa kecuali. Ini akan membuat transisi lebih mudah ke bentuk delegasi lain saat sebuah pustaka memerlukan Ruby 3+. Sebelumnya, penandaruby2_keywords
dijaga jika method penerima mengambil*args
, tetapi ini adalah sebuah bug dan ketidakkonsistenan. Sebuah teknik yang bagus untuk menemukan potensi hilang dariruby2_keywords
adalah menjalankan rangkaian tes, menggunakanputs nil, caller, nil
, dan mengecek setiap method/block pada rantai pemanggilan yang harus mendelegasikan keyword ditandai dengan benar sebagairuby2_keywords
. [Bug #18625] [Bug #16466]def target(**kw) end # Secara tidak sengaja, berjalan tanpa ruby2_keywords pada Ruby 2.7-3.1, # ruby2_keywords dibutuhkan pada 3.2+. Sama halnya dengan (*args, **kwargs) # atau (...) yang juga dibutuhkan baik #foo maupun #bar ketika migrasi # dari ruby2_keywords. ruby2_keywords def bar(*args) target(*args) end ruby2_keywords def foo(*args) bar(*args) end foo(k: 1)
Perbaikan performa
YJIT
- Dukungan arm64 / aarch64 pada platform UNIX.
- Membangun YJIT memerlukan Rust 1.58.1+. [Feature #18481]
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 ditambahkan. [Feature #13110]
- Module
- Module.used_refinements telah ditambahkan. [Feature #14332]
- Module#refinements telah ditambahkan. [Feature #12737]
- Module#const_added telah ditambahkan. [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 ditambahkan. [Feature #12737]
- Set
- Set sekarang tersedia sebagai sebuah builtin class tanpa membutuhkan
require "set"
. [Feature #16989] Ini dimuatkan secara otomatis melalui constantSet
atau sebuah pemanggilanEnumerable#to_set
.
- Set sekarang tersedia sebagai sebuah builtin class tanpa membutuhkan
- String
- String#byteindex dan String#byterindex telah ditambahkan. [Feature #13110]
- Memperbarui versi Unicode ke 14.0.0 dan Emoji ke 14.0. [Feature #18037] (juga diaplikasikan pada Regexp)
- String#bytesplice telah ditambahkan. [Feature #18598]
- Struct
- Sebuah class Struct juga dapat diinisialisasi dengan argumen keyword
tanpa
keyword_init: true
padaStruct.new
[Feature #16806]
- Sebuah class Struct juga dapat diinisialisasi dengan argumen keyword
tanpa
Isu kompatibilitas
Catatan: tidak termasuk perbaikan bug.
Constant terhapus
Berikut ini adalah constant yang telah dihapus.
Fixnum
danBignum
[Feature #12005]Random::DEFAULT
[Feature #17351]Struct::Group
Struct::Passwd
Method terhapus
Berikut ini adalah method yang telah dihapus.
Dir.exists?
[Feature #17391]File.exists?
[Feature #17391]Kernel#=~
[Feature #15231]Kernel#taint
,Kernel#untaint
,Kernel#tainted?
[Feature #16131]Kernel#trust
,Kernel#untrust
,Kernel#untrusted?
[Feature #16131]
Isu kompatibilitas Stdlib
Psych
tidak lagi membundel libyaml. Pengguna perlu memasang pustakan libyaml sendiri melalui package system. [Feature #18571]
Pembaruan C API
C API terhapus
Berikut ini adalah API yang telah dihapus.
- Variabel
rb_cData
. - Function “taintedness” dan “trustedness”. [Feature #16131]
Pembaruan pustaka standar
-
Berikut ini adalah default gem yang telah diperbarui.
- TBD
-
Berikut ini adalah bundled gem yang telah diperbarui.
- TBD
-
Berikut ini adalah default gem yang sekarang menjadi bundled gem. Anda perlu menambahkan pustaka berikut ke
Gemfile
pada bundler environment.- TBD
Lihat NEWS atau commit logs untuk lebih detail.
Dengan perubahan tersebut, 2393 berkas berubah, 168931 sisipan(+), 113411 terhapus(-) sejak Ruby 3.1.0!
Unduh
-
https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.0-preview2.tar.gz
SIZE: 19816780 SHA1: 2106c77fc1600daf41ae137ecc4cf7937e27f67f SHA256: 8a78fd7a221b86032f96f25c1d852954c94d193b9d21388a9b434e160b7ed891 SHA512: 5e9ddcb1a43cff449b0062cc716bfb80a9ebbb14a1b063f34005e2998c2c5033badb44e882232db9b2fceda9376f6615986e983511fda2575d60894752b605cc
-
https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.0-preview2.tar.xz
SIZE: 14578112 SHA1: 538b3ea4dc0d99f60f8bd6f71e65a56ceeb41c18 SHA256: 01fac0929dccdabc0686c1109da6c187897a401da9ff8851242befa92f7fd430 SHA512: 0f4cc919284fdfa1a42b6381760d1b3a4660da4b0fcdd2adf01ea04a425548b3c5ac090866915675db73964a1055090e54dd97cf4628cbb69403e541c71c28ff
-
https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.0-preview2.zip
SIZE: 24150109 SHA1: 69ffffc52cad626166f73f21f25c29c9d73fe0e8 SHA256: 67f9ad3110be1975b3ce547c0a6e2c910dfc1945fd6e9bb1bd340568897c6554 SHA512: 1447e099e7a8da0ff206fda6f4e466640d6e86e9da8148315ab0154684b1fd22c02c0022b5a2f4d3fc00103b4e8cef8e35a770174921fd8c6abeca9ad41c1818
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.