Ruby 3.1.0 Dirilis

Kami dengan senang hati mengumumkan rilis dari Ruby 3.1.0. Ruby 3.1 menjaga kompatibilitas dengan Ruby 3.0 dan menambahkan banyak fitur.

YJIT: Compiler JIT eksperimental baru

Ruby 3.1 menggabungkan YJIT, sebuah compiler JIT baru yang dikembangkan oleh Shopify.

Sejak Ruby 2.6 mengenalkan MJIT pada 2018, kinerjanya sangat meningkat dan akhirnya kami mecapai Ruby3x3 tahun lalu. Meskipun Optcarrot telah menunjukkan peningkatan luar biasa, JIT belum memberikan manfaat untuk aplikasi dunia nyata.

Baru-baru ini Shopify berkontribusi banyak memperbaiki Ruby dengan meningkatkan kinerja aplikasi Rails mereka. YJIT adalah sebuah kontribusi penting dan bertujuan untuk memperbaiki kinerja dari aplikasi Rails.

Walaupun MJIT adalah sebuah method-based compiler JIT dan menggunakan sebuah compiler C eksternal, YJIT menggunakan Basic Block Versioning dan memasukkan compiler JIT ke dalamnya. Dengan Lazy Basic Block Versioning (LBBV), pertama ini akan meng-compile awal dari sebuah method dan secara bertahap meng-compile sisanya ketika argument types dan variabel ditentukan secara dinamis. Lihat YJIT: a basic block versioning JIT compiler for CRuby untuk pengenalan.

Dengan teknologi ini, YJIT meraih waktu warmup cepat dan peningkatan kinerja pada kebanyakan aplikasi dunia nyata hingga 22% pada railsbench dan 39% pada liquid-render.

YJIT merupakan sebuah fitur yang masih eksperimental dan dinonaktifkan secara default. Jika Anda ingin menggunakannya, tetapkan --yjit pada opsi command-line. Fitur ini terbatas pada Unix-like platform dengan arsitektur x86-64 saat ini.

debug gem: Sebuah debugger baru

Sebuah debugger yang telah ditulis ulang dengan lengkap debug.gem di-bundle dengan Ruby. debug.gem memiliki fitur-fitur berikut:

  • Meningkatkan kinerja debugging (ini tidak memperlambat aplikasi meskipun dengan debugger).
  • Mendukung remote debugging.
  • Mendukung rich debugging frontend (VS Code dan Chrome browser yang didukung saat ini).
  • Mendukung multi-process/multi-thread debugging.
  • Colorful REPL.
  • dan fitur bermanfaat lainnya, seperti record & replay, tracing, dan sebagainya.

Ruby telah mem-bundle lib/debug.rb, tetapi pustaka ini tidak dipelihara dengan baik karena memiliki masalah kinerja dan fitur. debug.gem menggantikan lib/debug.rb secara keseluruhan.

error_highlight: Lokasi fine-grained error pada backtrace

Sebuah built-in gem, error_highlight, diperkenalkan. Gem ini memberikan lokasi fine-grained error pada backtrace:

$ ruby test.rb
test.rb:1:in `<main>': undefined method `time' for 1:Integer (NoMethodError)

1.time {}
 ^^^^^
Did you mean?  times

Saat ini, hanya NameError yang didukung.

Gem ini diaktifkan secara default. Anda dapat menonaktikannya dengan menggunakan opsi command-line --disable-error_highlight. Lihat repositori untuk detail.

IRB Autocomplete dan Documentation Display

IRB sekarang memiliki sebuah fitur autocomplete di mana Anda dapat mengetik kode dan dialog kandidat autocomplete akan muncul. Anda bisa menggunakan Tab dan Shift+Tab untuk memilih kandidat ke atas dan ke bawah.

Jika dokumentasi terpasang ketika Anda memilih sebuah kandidat autocomplete, sebuah dialog akan muncul disamping dialog kandidat autocomplete, menampilkan bagian dari dokumentasi. Anda dapat membaca dokumentasi sepenuhnya dengan menekan Alt+d.

Fitur penting lainnya

Bahasa

  • Nilai pada literal Hash dan keyword argument dapat diabaikan. [Feature #14579]
    • {x:, y:} adalah sebuah syntax sugar dari {x: x, y: y}.
    • foo(x:, y:) adalah sebuah syntax sugar dari foo(x: x, y: y).
  • Pin operator (^) pada pattern matching sekarang mengambil sebuah expression. [Feature #17411]

    Prime.each_cons(2).lazy.find_all{_1 in [n, ^(n + 2)]}.take(3).to_a
    #=> [[3, 5], [5, 7], [11, 13]]
    
  • Tanda kurung dapat diabaikan pada one-line pattern matching. [Feature #16182]

    [0, 1] => _, x
    {y: 2} => y:
    x #=> 1
    y #=> 2
    

RBS

RBS adalah sebuah bahasa untuk mendeskripsikan struktur dari program Ruby. Lihat repositori untuk detail.

Perubahan sejak Ruby 3.0.0:

  • Parameter generic type dapat dibatasi. (PR)
  • Alias pada generic type telah didukung. (PR)
  • rbs collection diperkenalkan untuk mengatur gem dari RBS. (doc)
  • Banyak signature pada pustaka built-in dan standar ditambahkan/diperbarui.
  • Selain itu, memuat banyak perbaikan bug dan peningkatan kinerja.

Lihat RBS changelog untuk lebih detail.

TypeProf

TypeProf adalah sebuah static type analyzer untuk Ruby. TypeProf menghasilkan sebuah prototipe RBS dari kode Ruby yang non-type-annotated. Lihat dokumentasi untuk detail.

Perubahan utama sejak Ruby 3.0.0 adalah sebuah dukungan IDE eksperimental yang dikenal dengan “TypeProf for IDE”.

Demo of TypeProf for IDE

VS Code extension menampilkan sebuah perkiraan (atau secara langsung tertulis pada sebuah berkas RBS) method signature di atas setiap definisi method, menggarisbawahi kode yang mungkin menyebabkan name error atau type error dengan garis merah, dan melengkapi nama method (seperti menampilkan kandidat method). Lihat dokumentasi untuk detail.

Rilis ini juga berisi banyak perbaikan bug dan peningkatan kinerja.

Peningkatan kinerja

  • MJIT
    • Untuk beban kerja seperti Rails, default --jit-max-cache diubah dari 100 menjadi 10000. Compiler JIT tidak lagi mengabaikan compilation dari method yang memiliki panjang lebih dari 1000 instruksi.
    • Untuk mendukung Zeitwerk dari Rails, JIT-ed code tidak lagi dibatalkan ketika sebuah TracePoint untuk class event diaktifkan.

Perubahan penting lainnya sejak 3.0

  • One-line pattern matching, seperti ary => [x, y, z] tidak lagi eksperimental.
  • Multiple assignment evaluation order telah diubah sedikit. [Bug #4443]
    • foo[0], bar[0] = baz, qux sebelumnya diproses dengan urutan baz, qux, foo, dan kemudian bar pada Ruby 3.0. Pada Ruby 3.1, ini diproses dengan urutan foo, bar, baz, dan kemudian qux.
  • Variable Width Allocation: Strings (eksperimental) [Bug #18239]

  • Psych 4.0 mengubah Psych.load untuk menggunakan safe_load secara default. Anda mungkin perlu menggunakan Psynch 3.3.2 untuk menggunakan fitur ini. [Bug #17866]

Pembaruan pustaka standar

  • Default gem berikut telah diperbarui.
    • RubyGems 3.3.3
    • base64 0.1.1
    • benchmark 0.2.0
    • bigdecimal 3.1.1
    • bundler 2.3.3
    • cgi 0.3.1
    • csv 3.2.2
    • date 3.2.2
    • did_you_mean 1.6.1
    • digest 3.1.0
    • drb 2.1.0
    • erb 2.2.3
    • error_highlight 0.3.0
    • etc 1.3.0
    • fcntl 1.0.1
    • fiddle 1.1.0
    • fileutils 1.6.0
    • find 0.1.1
    • io-console 0.5.10
    • io-wait 0.2.1
    • ipaddr 1.2.3
    • irb 1.4.1
    • json 2.6.1
    • logger 1.5.0
    • net-http 0.2.0
    • net-protocol 0.1.2
    • nkf 0.1.1
    • open-uri 0.2.0
    • openssl 3.0.0
    • optparse 0.2.0
    • ostruct 0.5.2
    • pathname 0.2.0
    • pp 0.3.0
    • prettyprint 0.1.1
    • psych 4.0.3
    • racc 1.6.0
    • rdoc 6.4.0
    • readline 0.0.3
    • readline-ext 0.1.4
    • reline 0.3.0
    • resolv 0.2.1
    • rinda 0.1.1
    • ruby2_keywords 0.0.5
    • securerandom 0.1.1
    • set 1.0.2
    • stringio 3.0.1
    • strscan 3.0.1
    • tempfile 0.1.2
    • time 0.2.0
    • timeout 0.2.0
    • tmpdir 0.1.2
    • un 0.2.0
    • uri 0.11.0
    • yaml 0.2.0
    • zlib 2.1.1
  • Bundled gem berikut telah diperbarui.
    • minitest 5.15.0
    • power_assert 2.0.1
    • rake 13.0.6
    • test-unit 3.5.3
    • rexml 3.2.5
    • rbs 2.0.0
    • typeprof 0.21.1
  • Default gem berikut sekarang adalah bundled gem. Anda perlu menambahkan pustaka berikut pada Gemfile yang terdapat pada bundler environment.
    • net-ftp 0.1.3
    • net-imap 0.2.2
    • net-pop 0.1.1
    • net-smtp 0.3.1
    • matrix 0.4.2
    • prime 0.1.2
    • debug 1.4.0

Lihat NEWS atau commit logs untuk lebih detail.

Dengan perubahan tersebut, 3124 berkas berubah, 551760 sisipan(+), 99167 terhapus(-) sejak Ruby 3.0.0!

Selamat natal, selamat berlibur, dan nikmati memprogram dengan Ruby 3.1!

Unduh

  • https://cache.ruby-lang.org/pub/ruby/3.1/ruby-3.1.0.tar.gz

    SIZE: 20103517
    SHA1: e4e8c20dd2a1fdef4d3e5bd5a3461000dd17f226
    SHA256: 50a0504c6edcb4d61ce6b8cfdbddaa95707195fab0ecd7b5e92654b2a9412854
    SHA512: 76009d325e961e601d9a287e36490cbc1f3b5dbf4878fa6eab2c4daa5ff2fed78cbc7525cd87b09828f97cbe2beb30f528928bcc5647af745d03dffe7c5baaa9
    
  • https://cache.ruby-lang.org/pub/ruby/3.1/ruby-3.1.0.tar.xz

    SIZE: 14709096
    SHA1: 92b603c2a69fb25d66c337a63e94280984edea11
    SHA256: 1a0e0b69b9b062b6299ff1f6c6d77b66aff3995f63d1d8b8771e7a113ec472e2
    SHA512: a2bb6b5e62d5fa06dd9c30cf84ddcb2c27cb87fbaaffd2309a44391a6b110e1dde6b7b0d8c659b56387ee3c9b4264003f3532d5a374123a7c187ebba9293f320
    
  • https://cache.ruby-lang.org/pub/ruby/3.1/ruby-3.1.0.zip

    SIZE: 24388179
    SHA1: e37435956d6f840a0e8758d7374bc7e0e346105f
    SHA256: a3bfcd486d09c065d46421da0ff3d430ce4423fefd80cea63c6595d83ae4af0e
    SHA512: 67db71144e06da2c1c25eaf413d1417c99a4b18738a573f9e3371c11ea242eee9dcbdc3de17336f25ab5060039fe034e57298943d344be9cd9eb33bb56e2e1c6
    

Apa itu Ruby

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