Ditulis oleh naruse tanggal 2022-04-03
Diterjemahkan oleh meisyal
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 constantSet
atau sebuah pemanggilanEnumerable#to_set
.
- Set sekarang tersedia sebagai sebuah builtin class tanpa membutuhkan
- 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
padaStruct.new
[[Feature #16806]]
- Sebuah class Struct juga dapat diinisialisasi dengan argumen kata kunci
tanpa
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.