Ruby 3.3.0-preview3 Dirilis

Kami dengan senang hati mengumumkan rilis dari Ruby 3.3.0-preview3. Ruby 3.3 menambahkan sebuah parser baru yang bernama Prism, menggunakan Lrama sebagai parser generator, menambahkan pure-Ruby JIT compiler baru yang bernama RJIT, dan memperbaiki performa khususnya YJIT.

Prism

  • Memperkenalkan the Prism parser sebagai default gem
    • Prism adalah sebuah parser yang portable, error tolerant, dan maintainable recursive descent untuk Ruby
  • Prism siap digunakan di production dan aktif dirawat, Anda dapat menggunakannya sebagai pengganti Ripper
    • Ada extensive documentation untuk menggunakan Prism
    • Prism adalah sebuah pustaka bahasa C yang digunakan secara internal oleh CRuby dan sebuah Ruby gem yang digunakan untuk mem-parse kode Ruby
    • Beberapa method penting pada Prism API:
      • Prism.parse(source) yang mengembalikan AST sebagai bagian dari ParseResult
      • Prism.dump(source) yang mengembalikan serialized AST sebagai sebuah String
      • Prism.parse_comments(source) yang mengembalikan komentar pada kode
  • Anda dapat membuat pull request atau melaporkan isu secara langsung pada the Prism repository jika Anda tertarik untuk berkontribusi

Menggunakan Lrama ketimbang Bison

RJIT

  • Memperkenalkan sebuah pure-Ruby JIT compiler dan menggantikan MJIT.
    • RJIT hanya mendukung arsitektur x86-64 pada platform Unix.
    • Berbeda dengan MJIT, RJIT tidak memerlukan sebuah compiler C saat runtime.
  • RJIT ada hanya untuk tujuan eksperimen.
    • Anda seharusnya tetap menggunakan YJIT pada production.
  • Jika Anda tertarik untuk mengembangkan JIT pada Ruby, silakan cek k0kubun’s presentation on Day 3 of RubyKaigi.

YJIT

  • Peningkatan performa yang signifikan dibanding Ruby 3.2
    • Dukungan splat dan rest argument telah ditingkatkan.
    • Register dialokasikan untuk operasi stack dari virtual machine.
    • Pemanggilan dengan optional argument dikompilasi.
    • Exception handler juga dikompilasi.
    • Instant variable tidak lagi keluar ke intepreter dengan Object Shapes yang sangat besar.
    • Call type yang tidak didukung tidak lagi keluar ke interpreter.
    • Integer#!=, String#!=, Kernel#block_given?, Kernel#is_a?, Kernel#instance_of?, Module#=== dioptimisasi.
    • Sekarang 3x lebih cepat dibanding interpreter pada optcarrot!
  • Peningkatan penggunakan memory secara signifikan
    • Metadata dari kode yang dikompilasi menggunakan memory lebih sedikit.
    • Peningkatan code generation pada ARM64
  • Kecepatan kompilasi sedikit lebih cepat dibanding Ruby 3.2
  • Menambahkan RubyVM::YJIT.enable untuk mengaktifkan YJIT saat run-time
    • Anda dapat menjalankan YJIT tanpa memodifikasi argumen command-line atau environment variable
    • Ini dapat digunakan untuk mengaktifkan YJIT saat aplikasi Anda selesai booting. --yjit-disable dapat digunakan jika Anda tidak ingin mengaktifkan YJIT ketika aplikasi booting.
  • Opsi untuk menonaktifkan kode GC dan memperlakukan --yjit-exec-mem-size sebagai sebuah batas keras
    • Dapat menghasilkan perilaku copy-on-write lebih baik pada server yang menggunakan unicorn dan forking
  • ratio_in_yjit yang dihasilkan oleh --yjit-stats sekarang tersedia pada rilis build, data khusus atau dev build tidak lagi diperlukan.
  • Opsi exit tracing sekarang mendukung sampling
    • --trace-exits-sample-rate=N
  • --yjit-perf ditambahkan untuk memfasilitasi profiling dengan Linux perf.
  • Pengujian lebih saksama dan perbaikan beberapa bug

M:N thread scheduler

  • M:N thread scheduler diperkenalkan. [Feature #19842]
    • M Ruby thread diatur oleh N native thread (OS thread) sehingga pembuatan thread dan manajemen berkurang.
    • Ini dapat merusak kompatibilitas dengan C-extension sehingga M:N thread dinonaktifkan pada main dari Ractor secara default. * Environment variable RUBY_MN_THREADS=1 mengaktifkan M:N thread pada main dari Ractor. * M:N thread diaktifkan pada selain main dari Ractor.
    • Environment variable RUBY_MAX_CPU=n menetapkan jumlah maksimum dari N (jumlah maksimum dari native thread). Nilai default adalah 8. * Karena hanya ada satu Ruby thread untuk setiap Ractor yang dapat berjalan bersamaan, jumlah native thread yang digunakan, yang mana lebih kecil dari jumlah yang dispesifikasikan pada RUBY_MAX_CPU dan jumlah dari Ractor yang sedang berjalan. Sehingga, aplikasi Ractor tunggal (mayoritas aplikasi) akan menggunakan satu native thread. * Untuk mendukung operasi blocking, lebih dari N native thread dapat digunakan.

Fitur Penting Lainnya

Bahasa

Perbaikan performa

  • defined?(@ivar) dioptimisasi dengan Object Shapes.
  • Name resolution seperti Socket.getaddrinfo sekarang dapat diinterupsi (pada environment di mana pthread tersedia). Feature #19965
    • Untuk tujuan ini, sebuah pthread sekarang dibuat setiap kali ada pemanggilan getaddrinfo atau getnameinfo. Ini menimbulkan overhead pada name resolution (sekitar 2.5x pada eksperimen kami). Kami tidak mengharapkan overhead menjadi sebuah masalah pada kebanyakan aplikasi, namun jika Anda menemui atau melihat hasil yang tidak diharapkan karena perubahan tersebut, mohon laporkan.
  • Environment variable RUBY_GC_HEAP_REMEMBERED_WB_UNPROTECTED_OBJECTS_LIMIT_RATIO telah ditambahkan. Feature #19571
  • Children dari object lama tidak lagi dipromosikan ke generasi lama pada garbage collector. Feature #19678
  • Dukungan untuk weak reference telah ditambahkan pada garbage collector. Feature #19783

Perubahan penting lainnya sejak 3.2

IRB

IRB mendapatkan beberapa peningkatan berikut, namun tidak terbatas pada:

  • Integrasi irb:rdbg yang menyediakan pengalaman deugging setara dengan pry-byebug (doc).
  • Dukungan pager untuk perintah, seperti ls, show_source, dan show_cmds.
  • Menyediakan informasi yang lebih akurat dan membantu dengan perintah ls dan show_source.
  • Eksperimen autocompletion menggunakan type analysis (doc).
  • Sekarang memungkinkan untuk mengubah warna dan gaya font pada completion dialog dengan mengenalkan class Reline::Face (doc)

Sebagai tambahan, IRB telah menjalani refactoring yang ekstensif dan menerima perbaikan bug untuk memfasilitasi peningkatan ke depan dengan lebih mudah.

Isu kompatibilitas

Catatan: Tidak termasuk perbaikan bug dari fitur.

Constant terhapus

Berikut ini adalah constant yang telah dihapus.

Method terhapus

Berikut ini adalah method yang telah dihapus.

Environment variable terhapus

Berikut adalah environment variable yang telah dihapus.

  • Environment variable RUBY_GC_HEAP_INIT_SLOTS tidak digunakan lagi. Mohon gunakan RUBY_GC_HEAP_{0,1,2,3,4}_INIT_SLOTS. Feature #19785

Isu kompatibilitas Stdlib

ext/readline dipensiunkan

  • Kami memiliki reline yang merupakan implementasi Ruby murni dan kompatibel dengan ext/readline API. Kami bergantung pada reline di masa depan. Jika Anda perlu untuk menggunakan ext/readline, Anda dapat memasang ext/readline melalui rubygems.org dengan gem install readline-ext.
  • Kami tidak lagi memasang pustaka, seperti libreadline atau libedit.

Pembaruan C API

C API diperbarui

Berikut adalah API yang telah diperbarui.

C API terhapus

Berikut adalah API yang telah dihapus.

Pembaruan pustaka standar

RubyGems dan Bundler memperingatkan jika pengguna membutuhkan gem yang dijadwalkan akan menjadi bundled gem pada Ruby versi berikutnya.

Pustaka yang ditargetkan:

  • abbrev
  • base64
  • bigdecimal
  • csv
  • drb
  • getoptlong
  • mutex_m
  • nkf
  • observer
  • racc
  • resolv-replace
  • rinda
  • syslog

Berikut adalah default gem yang telah ditambahkan.

  • prism 0.15.1

Berikut adalah default gem yang telah diperbarui.

  • RubyGems 3.5.0.dev
  • base64 0.2.0
  • benchmark 0.3.0
  • bigdecimal 3.1.5
  • bundler 2.5.0.dev
  • cgi 0.4.0
  • csv 3.2.8
  • date 3.3.4
  • delegate 0.3.1
  • drb 2.2.0
  • english 0.8.0
  • erb 4.0.3
  • etc 1.4.3.dev.1
  • fcntl 1.1.0
  • fiddle 1.1.2
  • fileutils 1.7.2
  • find 0.2.0
  • getoptlong 0.2.1
  • io-console 0.6.1.dev
  • irb 1.8.3
  • logger 1.6.0
  • mutex_m 0.2.0
  • net-http 0.4.0
  • net-protocol 0.2.2
  • nkf 0.1.3
  • observer 0.1.2
  • open-uri 0.4.0
  • open3 0.2.0
  • openssl 3.2.0
  • optparse 0.4.0
  • ostruct 0.6.0
  • pathname 0.3.0
  • pp 0.5.0
  • prettyprint 0.2.0
  • pstore 0.1.3
  • psych 5.1.1.1
  • rdoc 6.6.0
  • reline 0.3.9
  • rinda 0.2.0
  • securerandom 0.3.0
  • shellwords 0.2.0
  • singleton 0.2.0
  • stringio 3.0.9
  • strscan 3.0.7
  • syntax_suggest 1.1.0
  • tempfile 0.2.0
  • time 0.3.0
  • timeout 0.4.1
  • tmpdir 0.2.0
  • tsort 0.2.0
  • un 0.3.0
  • uri 0.13.0
  • weakref 0.1.3
  • win32ole 1.8.10
  • yaml 0.3.0
  • zlib 3.1.0

Berikut adalah bundled gem yang dipromosikan dari default gem.

  • racc 1.7.3

Berikut adalah bundled gem yang telah diperbarui.

  • minitest 5.20.0
  • rake 13.1.0
  • test-unit 3.6.1
  • rexml 3.2.6
  • rss 0.3.0
  • net-imap 0.4.4
  • net-smtp 0.4.0
  • rbs 3.2.2
  • typeprof 0.21.8
  • debug 1.8.0

Lihat rilis GitHub, seperti Logger atau changelog untuk detail dari default gem atau bundled gem.

Lihat NEWS atau commit logs untuk lebih detail.

Dengan perubahan tersebut, 5207 berkas berubah, 284820 sisipan(+), 174773 terhapus(-) sejak Ruby 3.2.0!

Unduh

  • https://cache.ruby-lang.org/pub/ruby/3.3/ruby-3.3.0-preview3.tar.gz

    SIZE: 21550473
    SHA1: 2811f191d66dffee0206771873bd990857ae4ed6
    SHA256: 0969141be92e67e0edb84a8fb354acc98f01bd78e602a23a0f136045c82f4809
    SHA512: 94db07a6958c09809b2e5b597fa55a121074e8bacb3bf588c83cf0d35b07a8b070172035a49d1abf0d8ee364a9ace824f34e677f7327ffe1acdbab0938ac49c4
    
  • https://cache.ruby-lang.org/pub/ruby/3.3/ruby-3.3.0-preview3.tar.xz

    SIZE: 15970144
    SHA1: 496600612605f8ebeb955255e98bac73a4cbc045
    SHA256: f79afcf122dc7d04fe26cfa4436b9c488b21766fc54b0d2dfb2ba41cd0cdd355
    SHA512: d7ab0d703e7884efd31045933409cd68fac1d9941963537ccc8e309ca7c8bee8500a68182135acba22cbdbf4a8ae99f39bf7f0925273eb4fbc3728c0c1ba0c19
    
  • https://cache.ruby-lang.org/pub/ruby/3.3/ruby-3.3.0-preview3.zip

    SIZE: 26618303
    SHA1: 6a13e08c7e484d42037c1e2c87c5d0e220f893a0
    SHA256: c35bf637a647c2f60148368ffb374db5c258570911794f46b6dfdb98ebfe95d9
    SHA512: c4ef2cdcdadeb85ad1d42aedc97f9f3d609b3b01eea2319451cf92c81bd31ae8129b7c91fc68571469dd888c01ea0f48f73234b965db17f6a87404ca382f7794
    

Apa itu Ruby

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