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:

  1. Melakukan resolusi nama IPv6 dan IPv4 secara bersamaan
  2. Coba koneksi ke alamat IP yang telah diselesaikan, prioritaskan IPv6, dengan upaya paralel yang dilakukan secara bertahap pada interval 250 ms
  3. 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 lingkungan RUBY_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 menggunakan make modular-gc MODULAR_GC=default dan diaktifkan menggunakan variabel lingkungan RUBY_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 lingkungan RUBY_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 pengaturan Warning(: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 kapan Warning(:deprecated). (Fitur #20884)

Pembaruan kelas inti

Catatan: Kami hanya mencantumkan pembaruan penting dari kelas Inti.

  • Pengecualian

    • Exception#set_backtrace sekarang menerima array Thread::Backtrace::Location.
      Kernel#raise, Thread#raise Dan Fiber#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. Kapan false
      GC hanya akan menandai objek muda. Standarnya adalah true. (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.() Dan Ractor.()= 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 meningkat TypeError 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
  • 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
  • JSON

    • Peningkatan kinerja JSON.parse sekitar 1,5 kali lebih cepat dari json-2.7.x.
  • 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)
  • 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::LocationMetodenya, 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}'
  • 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()= Dan DidYouMean::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 Dan rb_newobj_of (dan makro yang sesuai RB_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 atau Integer#+ sekarang mengeluarkan peringatan kelas kinerja (-W:performance atau Warning(: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.

Sumber

Krystian Wiśniewski
Krystian Wiśniewski is a dedicated Sports Reporter and Editor with a degree in Sports Journalism from He graduated with a degree in Journalism from the University of Warsaw. Bringing over 14 years of international reporting experience, Krystian has covered major sports events across Europe, Asia, and the United States of America. Known for his dynamic storytelling and in-depth analysis, he is passionate about capturing the excitement of sports for global audiences and currently leads sports coverage and editorial projects at Agen BRILink dan BRI.