Ruby 2.6.0 Rilis

Kami dengan senang hati mengumumkan rilis dari Ruby 2.6.0.

Rilis ini memperkenalkan sejumlah fitur baru dan perbaikan performa, paling utama:

  • Sebuah compiler JIT baru.
  • Modul RubyVM::AbstractSyntaxTree.

JIT [Eksperimental]

Ruby 2.6 memperkenalkan sebuah implementasi awal dari compiler JIT (Just-in-time).

Compiler JIT bertujuan untuk memperbaiki performa dari program Ruby apapun yang dieksekusi. Berbeda dengan JIT compiler biasanya yang beroperasi dalam proses, compiler JIT dari Ruby mencetak kode C ke sebuah disk dan mengeluarkan proses compiler C untuk menghasilkan kode asli. Untuk lebih detail, lihat MJIT organization by Vladimir Makarov.

Untuk menggunakan compiler JIT, tetapkan --jit pada command line atau $RUBYOPT environment variable. Menetapkan --jit-verbose=1 akan membuat compiler JIT mencetak informasi tambahan. Baca keluaran dari ruby --help atau documentation untuk pilihan lainnya.

Compiler JIT didukung ketika Ruby dibangun oleh GCC, Clang, atau Microsoft VC++, yang mana dibutuhkan saat runtime.

Sampai versi 2.6.0, kami telah 1.7x faster performance dibanding Ruby 2.5 pada CPU-intensive non-trivial benchmark workload yang dikenal dengan Optcarrot. Namun demikian, ini masih eksperimental dan banyak memory-intensive workload, seperti aplikasi Rails yang mungkin tidak mendapatkan manfaat tersebut saat ini. Untuk lebih detail, lihat Ruby 2.6 JIT - Progress and Future.

Nantikan era baru dari performa Ruby.

RubyVM::AbstractSyntaxTree [Eksperimental]

Ruby 2.6 memperkenalkan modul RubyVM::AbstractSyntaxTree. Future compatibility dari modul ini tidak dijamin.

Modul ini memiliki method parse yang mem-parse string dari kode Ruby yang diberikan dan mengembalikan AST (Abstract Syntax Tree) node dari kode. Method parse_file membuka dan mem-parse berkas dan mengembalikan AST node.

Kelas RubyVM::AbstractSyntaxTree::Node juga diperkenalkan. Anda bisa mendapatkan informasi lokasi dan children node dari objek Node. Fitur ini eksperimental.

Fitur-fitur Penting yang Baru Lainnya

  • Menambahkan sebuah alias baru dari Kernel#yield_self yang diberi nama #then. [Fitur #14594]

  • Nama konstan bisa dimulai dengan sebuah huruf kapital non-ASCII. [Fitur #13770]

  • Memperkenalkan endless range. [Fitur #12912]

    Sebuah endless range, (1..), berjalan tanpa ada akhirnya. Biasanya digunakan untuk kasus:

    ary[1..]                          # identik dengan ary[1..-1] tanpa magical -1
    (1..).each {|index| ... }         # infinite loop dari indeks 1
    ary.zip(1..) {|elem, index| ... } # ary.each.with_index(1) { ... }
    
  • Menambahkan Enumerable#chain dan Enumerator#+. [Feature #15144]

  • Menambahkan operator komposisi fungsi << dan >> menjadi Proc dan Method. [Feature #6284]

    f = proc{|x| x + 2}
    g = proc{|x| x * 3}
    (f << g).call(3) # -> 11; sama dengan f(g(3))
    (f >> g).call(3) # -> 15; sama dengan g(f(3))
    
  • Menambahkan Binding#source_location. [Feature #14230]

    Method ini mengembalikan sumber lokasi dari binding, sebuah array dua elemen dari __FILE__ dan __LINE__. Berbicara teknikal, ini sama dengan eval("[__FILE__, __LINE__]", binding). Namun, kami sedang merencanakan untuk mengubah perilaku ini sehingga Kernel#eval mengabaikan sumber lokasi binding [Bug #4352]. Dengan demikian, pengguna direkomendasikan untuk menggunakan Binding#source_location daripada Kernel#eval.

  • Menambahkan pilihan :exception pada Kernel#system agar mengeluarkan sebuah exception kegagalan daripada mengembalikan false. [Feature #14386]

  • Menambahkan sebuah mode oneshot pada Coverage. [Feature#15022]

    • Mode ini mengecek “apakah setiap baris dieksekusi minimal sekali atau tidak”, daripada “berapa banyak setiap baris dieksekusi”. Sebuah hook untuk setiap baris ditembakan paling banyak sekali dan setelah itu penanda hook dihapus, sebagai contoh ini berjalan dengan zero overhead.
    • Menambahkan argumen kata kunci :oneshot_lines pada Coverage.start.
    • Menambahkan argumen kata kunci :stop dan :clear pada Coverage.result. Jika clear true maka mengubah counter menjadi nol. Jika stop true maka nonaktifkan pengukuran coverage.
    • Coverage.line_stub, yang mana adalah sebuah fungsi pembantu yang sederhana yang dapat membuat “stub” dari baris coverage dari sebuah kode sumber yang diberikan.
  • Menambahkan FileUtils#cp_lr. Ini bekerja seperti cp_r, tetapi link bukan salinan. [Feature #4189]

Perbaikan performa

  • Mempercepat Proc#call dengan menghilangkan alokasi sementara untuk $SAFE. [Feature #14318]

    Kami telah mengukur x1.4x perbaikan performa pada benchmark lc_fizzbuzz yang memanggil Proc#call berkali-kali. [Bug #10212].

  • Mempercepat block.call ketika block diterima sebagai sebuah parameter block. [Feature #14330]

    Dikombinasikan dengan perbaikan block handling yang diperkenalkan pada Ruby 2.5, block evaluation sekarang berjalan 2.6x lebih cepat pada sebuah micro-benchmark Ruby 2.6. [Feature #14045]

  • Transient Heap (theap) diperkenalkan. [Bug #14858] [Feature #14989]

    theap adalah heap yang diatur untuk short-living memory object yang diarahkan oleh kelas tertentu (Array, Hash, Object, dan Struct). Membuat objek Hash yang kecil dan short-living 2x lebih cepat. Dengan rdoc benchmark, kami mengamati 6-7% kemajuan.

  • Implementasi asli (arm32, arm64, ppc64le, win32, win64, x86, amd64) dari coroutine untuk memperbaiki performa context switching dari Fiber secara signifikan. [Feature #14739]

  • Fiber.yield dan Fiber#resume sekitar 5x lebih cepat pada Linux 64-bit. Program-program Fiber yang intensif dapat diharapkan hingga 5% perbaikan secara keseluruhan.

Perubahan penting lainnya sejak 2.5

  • $SAFE adalah sebuah proses state global dan kita dapat mengatur ke 0 lagi. [Feature #14250]

  • Menempatkan parameter safe_level ke ERB.new tidak berlaku lagi. Argumen trim_mode dan eoutvar diubah menjadi argumen kata kunci. [Feature #14256]

  • Mendukung versi Unicode 11. Kami memiliki rencana untuk menambah dukungan Unicode versi 12 dan 12.1 pada rilis TEENY dari Ruby 2.6. Ini termasuk dukungan new Japanese era.

  • Menggabungkan RubyGems 3.0.1. Opsi --ri dan --rdoc dihapus. Mohon gunakan opsi --document dan --no-document.

  • Bundler sekarang sebagai sebuah gem default.

  • Pada blok exception handling, else tanpa rescue sekarang menyebabkan sebuah sintaks error. [EKSPERIMENTAL][Feature #14606]

Lihat NEWS atau commit logs untuk lebih detail.

Dengan perubahan tersebut, 6437 berkas berubah, 231471 sisipan(+), 98498 terhapus(-) sejak Ruby 2.5.0!

Selamat Natal, selamat berlibur, dan nikmati memprogram dengan Ruby 2.6.0!

Masalah yang Diketahui

(Bagian ini ditambahkan pada 28 Januari 2019.)

Download

  • https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.0.tar.gz

    SIZE:   16687800 bytes
    SHA1:   c95f4e86e21390270dad3ebb94491fd42ee2ce69
    SHA256: f3c35b924a11c88ff111f0956ded3cdc12c90c04b72b266ac61076d3697fc072
    SHA512: 01f886b0c0782a06315c4a46414e9f2b66ee634ba4349c8e0697f511793ae3c56d2ad3cad6563f2b0fdcedf0ff3eba51b9afab907e7e1ac243475772f8688382
    
  • https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.0.zip

    SIZE:   20582054 bytes
    SHA1:   a804e63d18da12107e1d101918a3d8f4c5462a27
    SHA256: 8a4fb6ca58202495c9682cb88effd804398bd0ef023e3e36f001ca88d8b5855a
    SHA512: 16d66ec4a2c6a2e928d5b50e094a5efa481ac6e4d5ed77459d351ef19fe692aa59b68307e3e25229eec5f30ae2f9adae2663bafe9c9d44bfb45d3833d77839d4
    
  • https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.0.tar.bz2

    SIZE:   14585856 bytes
    SHA1:   b8638eb806efbf7b6af87b24ccc6ad915f262318
    SHA256: c89ca663ad9a6238f4b1ec4d04c7dff630560c6e6eca6d30857c4d394f01a599
    SHA512: ca3daf9acf11d3db2900af21b66231bd1f025427a9d2212b35f6137ca03f77f57171ddfdb99022c8c8bcd730ff92a7a4af54e8a2a770a67d8e16c5807aa391f1
    
  • https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.0.tar.xz

    SIZE:   11918536 bytes
    SHA1:   9ddaeba3505d2855460c8c653159fc0ac8928c0f
    SHA256: acb00f04374899ba8ee74bbbcb9b35c5c6b1fd229f1876554ee76f0f1710ff5f
    SHA512: c56eaf85ef7b79deb34ee4590b143c07f4fc83eb79775290761aee5a7c63374659613538a41f25706ed6e19e49d5c67a1014c24d17f29948294c7abd0b0fcea8