top | item 10790654

Ruby 2.3.0 Released

427 points| cremno | 10 years ago |ruby-lang.org | reply

69 comments

order
[+] matthewrudy|10 years ago|reply
This is actually a really great release.

`&.` removes the really annoying (and slow) `try`.

And I think the string literals freezing is going to solve a lot of problems with memory allocations.

Check out this PR for Rails that covered a lot of similar performance problems created by too many string allocations.

https://github.com/rails/rails/pull/21057/files

I wish Rails 5 could go all in on Ruby 2.3.0 and frozen string literals.

[+] anonova|10 years ago|reply
How prevalent is `try` in rails/activesupport? My benchmarks show that the lonely operator is ~2x faster than `try`. I'd expect someone to create a gem that monkey patches `try` for those running 2.3.0.
[+] jrochkind1|10 years ago|reply
Keep in mind string literal freezing is still off by default.

I like that they did it this way, give a chance to see if it actually brings performance improvements in real world scenarios before imposing it on all code.

[+] dmerrick|10 years ago|reply
It's really great to see that with every big release, Ruby is making the language even more pleasant to use in addition to the regular performance improvements.

Ruby just keeps getting better and better.

[+] pwelch|10 years ago|reply
Agreed. Been using Ruby for a few years now and it never stops being enjoyable. Hoping it keeps going for many more years!
[+] shinuza|10 years ago|reply
Fun fact: Ruby 1.0 was released 19 years ago on this day.
[+] mmahemoff|10 years ago|reply
Nice to see "Did You Mean" suggestions flourishing across various tools now, e.g. Git too. Error messages can be a whole lot more than indecipherable jargon, even for command-line warriors.

I'm also looking forward to never writing "if foo && foo.bar" again!

Congrats and happy holidays Ruby team :).

[+] cdcarter|10 years ago|reply
Well, git's "did you mean" is probably the most frustrating command line experience imaginable, but it's quite nice in a language!
[+] smegel|10 years ago|reply
I seriously saw this and thought it might be the reason for the ruby-colored banner.

facepalm

[+] hartator|10 years ago|reply
We can say it's for both Christmas and Ruby relesae. :)
[+] zem|10 years ago|reply
doh! till I read this I thought hn had simply rolled out a new stylesheet.
[+] ksec|10 years ago|reply
Anyone knows if Ruby has accepted IBM's contribution of JIT for Cruby??

https://news.ycombinator.com/item?id=10715610

And below is the Presentation from Ko1 on compiling Ruby

http://rubykaigi.org/2015/presentations/ko1

[+] magaudet|10 years ago|reply
(IBMer working on said JIT here)

As Chris Seaton points out as well, we're not really open source yet. Working on getting there, but it's going to take time. The important thing now is that we can start talking with the community and making it more likely that when we do get open source, it can happen in a way consumable by the Ruby community.

[+] chrisseaton|10 years ago|reply
I don't think that will happen for a while, if it does happen. They haven't even released their patch under a compatible licence yet, or their library as open source, for example.
[+] igravious|10 years ago|reply
Thanks for reposting this. Wonder why it's not making bigger waves. What are the performance numbers of this thing like? I feel this IBM OMR is a reply to MS opening .Net CLR
[+] r-s|10 years ago|reply
Looks like some nice additions. I try to limit the use of .try in rails, however when working with legacy codebases it is much nicer then:

if @user && @user.address && @user.address.city city = @user.address.city end

Even though I write less Ruby then I once did, I still credit it as the language which shaped my career the most. I have worked so many great jobs because of Ruby.

[+] gkop|10 years ago|reply
Yup. In addition to the general purpose safe navigation operator we also have Hash#dig now which helps with those pesky nested params:

params.dig(:user, :address, :city)

[+] omarforgotpwd|10 years ago|reply
Ah, YARV finally adds bytecode compilation and loading as an "experimental" feature. It'll be interesting to see what people do with it.
[+] rubiquity|10 years ago|reply
I could see it making deployment faster or nicer. Imagine being able to compile all the byte code for a Rails app locally and just shoving that up instead of waiting on bundling and all that.

Also I think this would make possible hot code upgrades which are cool but probably more work than their worth. Unless you can build smart hooks into background job and web server libraries that only change the byte code in between jobs and requests. Oh the possibilities!

[+] MrBra|10 years ago|reply
As someone else pointed out, at https://bugs.ruby-lang.org/issues/11788 they explain that:

They are not goals of this project:

- packing scripts to one package

- migrate obfuscate binary to other node to hide source code

---

But.. what I don't get is: why wouldn't this works as a cheap way to obfuscate some ruby code?

After all, isn't it true that when a script is compiled to byte-code then it is interpreted by the runtime as-is (and without being re-translated to the original script in memory or on disk) ?

If so - I understand that rebuilding the original ruby script would not be a big deal for a developer - but wouldn't this still pose a small barrier to the casual prying user?

[+] singularity2001|10 years ago|reply
Here are two bash functions so that you can compile and execute the bytecode in the terminal:

i.e.

rubyc test.rb

ruby-do test.rbc

in .bashrc:

function rubyc() {

ruby -e "File.open('$1c', 'wb').write(RubyVM::InstructionSequence.compile_file('$1').to_binary)"

}

function ruby-do() {

ruby -e "RubyVM::InstructionSequence.load_from_binary(File.open('$1', 'rb').read).eval"

}

[+] systems|10 years ago|reply
with the existence of Perl6, Clojure, F#, Rust, Go, and few others ...

For someone who doesn’t know Ruby, why learn it today?

[+] jballanc|10 years ago|reply
For my money, Ruby comes closest to realizing the "promise" of dynamic languages. That is, it's fast to build with when prototyping, flexible when refactoring, reasonably fast enough and not so memory hungry that it can't handle "web scale".

Obviously there are languages that are better in each of these areas, but few that combine so many as well as Ruby. In other words, if you know that you'll be working in a problem domain (e.g. high concurrency) where specific advantages of some other language (e.g. Go/Erlang) are likely to be needed, use that language. If you're just building something, then Ruby's a fine place to start.

[+] ihsw|10 years ago|reply
It's still one of the most terse and transparent languages around, plus there are tons of jobs for working with it.

I quite like Go, Python, TypeScript, etc but Ruby is in a league of its own when it comes to short and sweet. It's a pleasure to write.

[+] cageface|10 years ago|reply
The Rails ecosystem is mature now, which means you can find an off-the-shelf gem to do just about anything you want. So building things in Rails is very very fast. It's hard to beat for MVP-style development.
[+] eropple|10 years ago|reply
For me: because nothing else approaches it in terms of linguistic flexibility. I learned Ruby about two years ago, after learning...a dozen-ish languages? Something like that. I don't write web applications in it, because Rails grinds my gears for a whole host of reasons, but for my money it is the can-opener language. If I have a problem, I feel like I can generally explore it faster in Ruby (holla, Pry) and build a solution iteratively without really burning a lot of mental effort on it.

The second part, aside from Ruby's general applicability and ease of exploration, is that I think Ruby scales, in terms of application design, from that garbage-y first-cut code to really elegant, really clean code that's fun to work in and easy to maintain. That first solution, borne mostly out of dumping my REPL history, may not be great, but that's okay: with the help of the excellent ecosystem around the language I can reify my expectations in tests and swap out the original exploratory system for good, easy-to-work-with code that's clear in its behaviors. Of course you can do that with other languages, too--but I've never found one that makes it as easy to stretch in both directions, from noodling around to code I'd trust with my business (and I'm doing exactly that), other than Ruby.

But as for the languages you namedropped:

- Perl 6 is great, but it's a decade late and it isn't sufficiently compatible with Perl 5, so it's starting miles and miles behind where Ruby is right now. It's not dead out of the gate, but it keeps lurching toward the green and making everybody nervous. Practically nobody knows Perl 6 now, I don't know why somebody would pick it over Ruby if they're lining both languages up side by side.

- Clojure is super interesting and Rich Hickey is a supergenius and we're all lucky he didn't go into supervillaining because I think he'd be really good at it. And Leiningen is an amazing build system. But Clojure suffers from what I view are the usual problems a Lisp has around readability and the hands-on-keyboard experience (and I like Lisp, I've got DrRacket installed on my laptop for a reason, but I've been writing Lisps for a decade or more now and grinding out Clojure code is slow). Love the people, love the community...would rather write Ruby.

- Rust doesn't do nearly the same thing as Ruby. They're useful for different things. I feel like Rust inherited the good parts of the Ruby ethos from the participation of folks like Steve Klabnik. Big fan of the language and the community, but it's not incompatible with Ruby where it matters anyway so who cares?

- F# is a great language and, like Rust, also has little overlap with what I use Ruby for. If I cared about Ruby for the web, maybe there would be more overlap, but F#-for-web is swimming upstream anyway. (Doable, but harder than C#.)

- Go, while it as a language deserves some small credit for introducing co-routines to people who come from Python (he said, only somewhat snarking while he makes Lua gang signs), is close to an unmitigated disaster of an ecosystem that tries to be prescriptive when it should be hands-off and hands-off when it should be prescriptive. It is also a tremendously limited language in terms of syntactic flexibility and ability to do stuff like "second-order" metaprogramming; this is a design decision that can be debated, or could be debated if I hadn't been convinced long ago by better languages that crippling a programmer to make writing an execution environment easier to always be the wrong thing. Do not want.

[+] sandstrom|10 years ago|reply
It's got an elegant syntax, great for meta-programming (tends to be useful in large and/or complex applications), strong community (there are gems for almost everything, i.e. no need to reinvent the wheel over and over again).

It's used by some interesting applications, such as Github, Shopify, Heroku, Square, Zendesk and AirBnB.

[+] nchelluri|10 years ago|reply
if everything came down to just what you type in the editor (e.g. functionally equivalent programs in any language performed the same everywhere), i would always prefer ruby.

it's just a nicer language to use than most, or maybe all others.

[+] edlebert|10 years ago|reply
I couldn't find any actual examples on how to use the new frozen string literals. Lots of discussion in the link provided, but that's it.
[+] itafroma|10 years ago|reply
The NEWS file defines what the pragma actually is,[1], but you'd use it like so:

    # frozen_string_literal: true
    str = 'foo'
    str << 'bar'
This will now produce an error:

    # main.rb:3:in `<main>': can't modify frozen String (RuntimeError)
It's equivalent to Ruby 2.1's String#freeze:[2]

    str = 'foo'.freeze
    str << 'bar'

    # main.rb:2:in `<main>': can't modify frozen String (RuntimeError)
Except that it will affect all strings created after the pragma mark.

You can also trigger this behavior globally with the --enable=frozen-string-literal option.

[1]: https://github.com/ruby/ruby/blob/v2_3_0/NEWS#L17-L26

[2]: http://ruby-doc.org/core-2.2.3/Object.html#method-i-freeze

[+] waylandsmithers|10 years ago|reply
Interested to see how people start using safe navigation! I personally tend to avoid `try` in Rails in favor of other `nil` handling patterns.
[+] hopsoft|10 years ago|reply
Why? Genuinely curious.
[+] DevKoala|10 years ago|reply
I love '&.'

I really missed this feature from C# 6.0

[+] diminish|10 years ago|reply
Does lonely operator support safe navigation in case of method calls with params too?

    obj&.foo(1)&.bar(2)&.zoo
[+] enkephalin|10 years ago|reply
this is working just fine:

  nil&.+(3)&.+(5)&.-(7)
[+] igouy|10 years ago|reply
ruby-2.3.0.tar.bz2 does not seem to have

    /ruby-2.3.0/bin/ruby

?
[+] dbailey5|10 years ago|reply
Its the source, you have to compile it yourself. Checkout the readme :)