Ditulis oleh naruse tanggal 2018-12-25
Diterjemahkan oleh meisyal
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
danEnumerator#+
. [Feature #15144] -
Menambahkan operator komposisi fungsi
<<
dan>>
menjadiProc
danMethod
. [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 denganeval("[__FILE__, __LINE__]", binding)
. Namun, kami sedang merencanakan untuk mengubah perilaku ini sehinggaKernel#eval
mengabaikan sumber lokasi binding [Bug #4352]. Dengan demikian, pengguna direkomendasikan untuk menggunakanBinding#source_location
daripadaKernel#eval
. -
Menambahkan pilihan
:exception
padaKernel#system
agar mengeluarkan sebuah exception kegagalan daripada mengembalikanfalse
. [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. Jikaclear
true maka mengubah counter menjadi nol. Jikastop
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 seperticp_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 memanggilProc#call
berkali-kali. [Bug #10212]. -
Mempercepat
block.call
ketikablock
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
, danStruct
). 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
danFiber#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 ke0
lagi. [Feature #14250] -
Menempatkan parameter
safe_level
keERB.new
tidak berlaku lagi. Argumentrim_mode
daneoutvar
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
tanparescue
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