Diposting oleh naruse pada 25 Des 2024
Kami dengan bangga mengumumkan rilis Ruby 3.4.0. Ruby 3.4 menambahkan it
memblokir referensi parameter, mengubah Prism sebagai parser default, menambahkan dukungan Happy Eyeballs Versi 2 ke perpustakaan soket, meningkatkan YJIT, menambahkan Modular GC, dan seterusnya.
it
diperkenalkan
it
ditambahkan untuk mereferensikan parameter blok tanpa nama variabel. (Fitur #18980)
ary = ("foo", "bar", "baz")
p ary.map { it.upcase } #=> ("FOO", "BAR", "BAZ")
it
sangat banyak berperilaku sama seperti _1
. Bila niatnya hanya ingin dipakai _1
dalam satu blok, potensi parameter bernomor lainnya seperti _2
juga tampak memberikan beban kognitif ekstra pada pembaca. Jadi it
diperkenalkan sebagai alias praktis. Menggunakan it
dalam kasus sederhana di mana it
berbicara sendiri, seperti dalam blok satu baris.
Prism sekarang menjadi parser default
Ganti parser default dari parse.y ke Prism. (Fitur #20564)
Ini merupakan perbaikan internal dan seharusnya hanya ada sedikit perubahan yang terlihat oleh pengguna. Jika Anda melihat ada masalah kompatibilitas, harap laporkan kepada kami.
Untuk menggunakan parser konvensional, gunakan argumen baris perintah --parser=parse.y
.
Perpustakaan soket sekarang menampilkan Happy Eyeballs Versi 2 (RFC 8305)
Perpustakaan soket sekarang dilengkapi Bola Mata Bahagia Versi 2 (RFC 8305)versi standar terbaru dari pendekatan yang diadopsi secara luas untuk konektivitas yang lebih baik dalam banyak bahasa pemrograman, di TCPSocket.new
(TCPSocket.open
) Dan Socket.tcp
. Peningkatan ini memungkinkan Ruby menyediakan koneksi jaringan yang efisien dan andal, disesuaikan dengan lingkungan internet modern.
Hingga Ruby 3.3, metode ini melakukan resolusi nama dan upaya koneksi secara serial. Dengan algoritma ini, mereka sekarang beroperasi sebagai berikut:
- Melakukan resolusi nama IPv6 dan IPv4 secara bersamaan
- Coba koneksi ke alamat IP yang telah diselesaikan, prioritaskan IPv6, dengan upaya paralel yang dilakukan secara bertahap pada interval 250 ms
- Kembalikan koneksi pertama yang berhasil sambil membatalkan koneksi lainnya
Hal ini memastikan penundaan koneksi diminimalkan, bahkan jika protokol atau alamat IP tertentu tertunda atau tidak tersedia. Fitur ini diaktifkan secara default, sehingga konfigurasi tambahan tidak diperlukan untuk menggunakannya. Untuk menonaktifkannya secara global, atur variabel lingkungan RUBY_TCP_NO_FAST_FALLBACK=1
atau menelepon Socket.tcp_fast_fallback=false
. Atau untuk menonaktifkannya berdasarkan per metode, gunakan argumen kata kunci fast_fallback: false
.
YJIT
TL;DR
- Performa lebih baik di sebagian besar benchmark pada platform x86-64 dan arm64.
- Mengurangi penggunaan memori melalui metadata terkompresi dan batas memori terpadu.
- Berbagai perbaikan bug: YJIT kini lebih kuat dan diuji secara menyeluruh.
Fitur baru
- Opsi baris perintah
--yjit-mem-size
memperkenalkan batas memori terpadu (default 128MiB) untuk melacak total penggunaan memori YJIT, memberikan alternatif yang lebih intuitif dibandingkan yang lama--yjit-exec-mem-size
pilihan.--yjit-log
memungkinkan log kompilasi untuk melacak apa yang dikompilasi.
- API Ruby
RubyVM::YJIT.log
menyediakan akses ke bagian akhir log kompilasi pada saat run-time.
- Statistik YJIT
RubyVM::YJIT.runtime_stats
sekarang selalu menyediakan statistik tambahan tentang pembatalan validasi, inlining, dan pengkodean metadata.
Pengoptimalan baru
- Konteks terkompresi mengurangi memori yang dibutuhkan untuk menyimpan metadata YJIT
- Alokasikan register untuk variabel lokal dan argumen metode Ruby
- Saat YJIT diaktifkan, gunakan lebih banyak primitif Inti yang ditulis dalam Ruby:
Array#each
,Array#select
,Array#map
ditulis ulang dalam Ruby untuk kinerja yang lebih baik (Fitur #20182).
- Kemampuan untuk menyelaraskan metode kecil/sepele seperti:
- Metode kosong
- Metode mengembalikan konstanta
- Metode kembali
self
- Metode yang mengembalikan argumen secara langsung
- Codegen khusus untuk lebih banyak metode runtime
- Optimalkan
String#getbyte
,String#setbyte
dan metode string lainnya - Optimalkan operasi bitwise untuk mempercepat manipulasi bit/byte tingkat rendah
- Mendukung konstanta yang dapat dibagikan dalam mode multi-raktor
- Berbagai optimasi tambahan lainnya
GC modular
-
Implementasi pengumpul sampah (GC) alternatif dapat dimuat secara dinamis melalui fitur pengumpul sampah modular. Untuk mengaktifkan fitur ini, konfigurasikan Ruby dengan
--with-modular-gc
pada waktu pembangunan. Pustaka GC dapat dimuat saat runtime menggunakan variabel lingkunganRUBY_GC_LIBRARY
. (Fitur #20351) -
Pengumpul sampah bawaan Ruby telah dipecah menjadi file terpisah di
gc/default/default.c
dan berinteraksi dengan Ruby menggunakan API yang ditentukan di
gc/gc_impl.h
. Pengumpul sampah bawaan sekarang juga dapat dibangun sebagai perpustakaan menggunakanmake modular-gc MODULAR_GC=default
dan diaktifkan menggunakan variabel lingkunganRUBY_GC_LIBRARY=default
. (Fitur #20470) -
Perpustakaan GC eksperimental disediakan berdasarkan MMTk. Pustaka GC ini dapat dibangun menggunakan
make modular-gc MODULAR_GC=mmtk
dan diaktifkan menggunakan variabel lingkunganRUBY_GC_LIBRARY=mmtk
. Hal ini memerlukan toolchain Rust pada mesin build. (Fitur #20860)
Perubahan bahasa
-
String literal dalam file tanpa a
frozen_string_literal
komentar sekarang mengeluarkan peringatan penghentian ketika mereka bermutasi. Peringatan ini dapat diaktifkan dengan-W:deprecated
atau dengan pengaturanWarning(:deprecated) = true
. Untuk menonaktifkan perubahan ini, Anda dapat menjalankan Ruby dengan--disable-frozen-string-literal
argumen baris perintah. (Fitur #20205) -
Percikan kata kunci
nil
saat metode pemanggilan sekarang didukung.
**nil
diperlakukan serupa dengan**{}
tidak meneruskan kata kunci, dan tidak memanggil metode konversi apa pun. (Bug #20064) -
Pengoperan blok tidak lagi diperbolehkan di index. (Bug #19918)
-
Argumen kata kunci tidak lagi diperbolehkan dalam indeks. (Bug #20218)
-
Nama tingkat atas
::Ruby
dicadangkan sekarang, dan definisinya akan diperingatkan kapanWarning(:deprecated)
. (Fitur #20884)
Pembaruan kelas inti
Catatan: Kami hanya mencantumkan pembaruan penting dari kelas Inti.
-
Pengecualian
Exception#set_backtrace
sekarang menerima arrayThread::Backtrace::Location
.
Kernel#raise
,Thread#raise
DanFiber#raise
juga menerima format baru ini. (Fitur #13557)
-
GC
-
GC.config
ditambahkan untuk memungkinkan pengaturan variabel konfigurasi pada Pengumpul Sampah. (Fitur #20443) -
Parameter konfigurasi GC
rgengc_allow_full_mark
diperkenalkan. Kapanfalse
GC hanya akan menandai objek muda. Standarnya adalahtrue
. (Fitur #20443)
-
-
Raktor
-
require
di Ractor diperbolehkan. Proses yang membutuhkan akan dijalankan di Ractor utama.
Ractor._require(feature)
ditambahkan untuk menjalankan proses yang membutuhkan pada Ractor utama. (Fitur #20627) -
Ractor.main?
ditambahkan. (Fitur #20627) -
Ractor.()
DanRactor.()=
ditambahkan untuk mengakses penyimpanan lokal Ractor dari Ractor saat ini. (Fitur #20715) -
Ractor.store_if_absent(key){ init }
ditambahkan untuk menginisialisasi variabel lokal ractor di keamanan thread. (Fitur #20875)
-
-
Jangkauan
Range#size
sekarang meningkatTypeError
jika rentangnya tidak dapat diubah. (Lain-lain #18984)
Pembaruan Perpustakaan Standar
Catatan: Kami hanya mencantumkan pembaruan penting dari perpustakaan Standar.
- Permata Ruby
- Menambahkan
--attestation
pilihan untuk mendorong permata. Ini diaktifkan untuk menyimpan tanda tangan ke sigstore.dev
- Menambahkan
- Bundel
- Tambahkan sebuah
lockfile_checksums
konfigurasi untuk memasukkan checksum dalam file kunci baru - Tambahkan kunci bundel
--add-checksums
untuk menambahkan checksum ke file kunci yang ada
- Tambahkan sebuah
-
JSON
- Peningkatan kinerja
JSON.parse
sekitar 1,5 kali lebih cepat dari json-2.7.x.
- Peningkatan kinerja
-
File Tempel
- Argumen kata kunci
anonymous: true
diimplementasikan untuk Tempfile.create.
Tempfile.create(anonymous: true)
segera menghapus file sementara yang dibuat. Jadi aplikasi tidak perlu menghapus file tersebut. (Fitur #20497)
- Argumen kata kunci
-
win32/sspi.rb
Masalah kompatibilitas
Catatan: Tidak termasuk perbaikan bug fitur.
- Pesan kesalahan dan tampilan penelusuran balik telah diubah.
- Gunakan kutipan tunggal sebagai pengganti tanda kutip balik sebagai kutipan pembuka. (Fitur #16495)
- Menampilkan nama kelas sebelum nama metode (hanya jika kelas tersebut memiliki nama permanen). (Fitur #19117)
Kernel#caller
,Thread::Backtrace::Location
Metodenya, dll. juga diubah.
Old: test.rb:1:in `foo': undefined method `time' for an instance of Integer from test.rb:2:in `
' New: test.rb:1:in 'Object#foo': undefined method 'time' for an instance of Integer from test.rb:2:in ' ' -
Render hash#inspect telah diubah. ((Kesalahan #20433))
- Tombol simbol ditampilkan menggunakan sintaks kunci simbol modern:
"{user: 1}"
- Kunci lain sekarang memiliki ruang di sekitarnya
=>
:'{"user" => 1}'
padahal sebelumnya mereka tidak:'{"user"=>1}'
- Tombol simbol ditampilkan menggunakan sintaks kunci simbol modern:
-
Kernel#Float() sekarang menerima string desimal dengan bagian desimal dihilangkan. (Fitur #20705)
Float("1.") #=> 1.0 (previously, an ArgumentError was raised) Float("1.E-1") #=> 0.1 (previously, an ArgumentError was raised)
-
String#to_f sekarang menerima string desimal dengan bagian desimal dihilangkan. Perhatikan bahwa hasilnya berubah ketika eksponen ditentukan. (Fitur #20705)
"1.".to_f #=> 1.0 "1.E-1".to_f #=> 0.1 (previously, 1.0 was returned)
- Penyempurnaan#kelas_halus telah dihapus. (Fitur #19714)
Masalah kompatibilitas perpustakaan standar
-
Apakah Maksud Anda
DidYouMean::SPELL_CHECKERS()=
DanDidYouMean::SPELL_CHECKERS.merge!
dihapus.
-
Bersih::HTTP
-
Batas waktu
- Tolak nilai negatif untuk Timeout.timeout. (Bug #20795)
-
URI
- Mengalihkan parser default ke sesuai RFC 3986 dari sesuai RFC 2396. (Bug #19266)
pembaruan API C
rb_newobj
Danrb_newobj_of
(dan makro yang sesuaiRB_NEWOBJ
,RB_NEWOBJ_OF
,NEWOBJ
,NEWOBJ_OF
) telah dihapus. (Fitur #20265)- Menghapus fungsi yang tidak digunakan lagi
rb_gc_force_recycle
. (Fitur #18290)
Perubahan lain-lain
-
Meneruskan blok ke metode yang tidak menggunakan blok yang diteruskan akan menampilkan peringatan pada mode verbose (
-w
). (Fitur #15554) -
Mendefinisikan ulang beberapa metode inti yang dioptimalkan secara khusus oleh interpeter dan sejenisnya JIT
String.freeze
atauInteger#+
sekarang mengeluarkan peringatan kelas kinerja (-W:performance
atauWarning(:performance) = true
). (Fitur #20429)
Melihat BERITA
atau melakukan log
untuk lebih jelasnya.
Dengan perubahan tersebut, 4942 file diubah, 202244 penyisipan(+), 255528 penghapusan(-)
sejak Ruby 3.3.0!
Selamat Natal, Selamat Liburan, dan nikmati pemrograman dengan Ruby 3.4!
Unduh
-
SIZE: 23153022 SHA1: 8ccb561848a7c460ae08e1a120a47c4a88a79335 SHA256: 068c8523442174bd3400e786f4a6952352c82b1b9f6210fd17fb4823086d3379 SHA512: bc70ecba27d1cdea00879f03487cad137a7d9ab2ad376cfb7a65780ad14da637fa3944eeeede2c04ab31eeafb970c64ccfeeb854c99c1093937ecc1165731562
-
SIZE: 17215572 SHA1: eb25447cc404e8d2e177c62550d0224ebd410e68 SHA256: 0081930db22121eb997207f56c0e22720d4f5d21264b5907693f516c32f233ca SHA512: 776a2cf3e9ccc77c27500240f168aa3e996b0c7c1ee1ef5a7afc291a06c118444016fde38b5b139c0b800496b8eb1b5456562d833f0edc0658917164763b1af7
-
SIZE: 28310193 SHA1: 26254ca5d3decc28a4e5faec255995265e5270b5 SHA256: c120228038af04554f6363e716b0a32cbf53cf63c6adf9f2c22a24f43dc8b555 SHA512: 4d535ed10db76a6aa74f8a025df319deb28483a7a781c24045906ee7663f1cff9d9f9e71dbc993c9e050113a34b37c7fa2143c355a0a6e1e1029bf2c92213ecc
Apa itu Ruby
Ruby pertama kali dikembangkan oleh Matz (Yukihiro Matsumoto) pada tahun 1993, dan kini dikembangkan sebagai Open Source. Ini berjalan pada berbagai platform dan digunakan di seluruh dunia terutama untuk pengembangan web.