Ruby 1.9 sluppet!

Matz har gitt oss en veldig fin julegave i år: Ruby 1.9. Men husk at dette er en development release og kun er til for å gjøre folk klare til 2.0. Her har jeg satt opp et norsk mirror (på Einar Gangsø sin server).

Det ser ut til at hele 1.9-grenen vil være unstable, mens 2.0 vil bli stable. (Selv om ingen er helt sikre. Kan hende at 1.9.1 eller 1.9.6 blir også stable)

Kommentarer

Hurra! Det blir spennende å se når vi faktisk får en stabil og praktisk anvendelig versjon som kan kjøre Rails, Mongrel og alt det andre:

And the first question everybody´s gonna ask is “does Rails 2.0 runs over Ruby 1.9?” and the short answer being No. Neither Rails, nor Mongrel (Jeremy Kemper seems to believe that it´s almost there), not dozens of gems are ready yet. Ruby 1.9.1 seems to be just around the corner as well. All gem developers need to re-test and modify their codes taking into account what has been deprecated and which sintaxes changed. Wait a little bit more before attempting Rails with Ruby 1.9.

Eigenclass har en nøye oppdatert liste over små og store nyheter i 1.9. Et litt bredere perspektiv finnes her.

De to store nyhetene er bytecode-kompilering og Unicode-støtte. (Jeg vet ikke om native threading har kommet med.) Min favoritt-mikrofeature er imidlertid enumerator-støtten, som lar deg “folde ut” itereringen som du ellers ville gjort med blokker. Enumerator-metoder som each kan nå kalles uten en blokk:

i = [0, 1, 1, 2, 3, 5, 8].each

Du har nå et enumerator-objekt:

i.next # => 0 i.next # => 1 …

Slik jeg forstår kan du når som helst kaste inn en blokk for å fortsette iterasjonen:

i.each { |n| puts n }

Unicode-støtten er nok det jeg er mest glad for også, og det er mest fordi det burde vært med for lenge siden :) Nå blir det slutt på det tøyset å behandle strenger som byte-arrays.

Jeg liker også forandringene mht proc/lambda. proc er nå det samme som Proc.new, ikke det samme som lambda.

Den nye hash literal-syntaksen er også en forbedring IMO, hvor {:a => 1} kan skrives som {a:1}. Den “gamle” syntaksen har alltid virket arbeidssom på meg når jeg har skiftet over til Ruby etter en runde med ECMAScript..

Det har vært mye snakk om ytelse med denne versjonen. Har dere testet noe på dette i forhold til origo.no ?

Nei, Ruby 1.9 klarer ikke å kjøre Rails eller Mongrel ennå, dessverre. Personlig føler jeg ikke for å legge så mye tid i 1.9 før den er stabil.

Jeg har bare gjort noen enkle syntetiske benchmarks for meg selv – kode som looper, bygger store arrays, itererer over dem, og bruker en del blokker i samme slengen. I disse testene er Ruby 1.9 konsekvent 3 til 6 ganger raskere enn 1.8.6.

Det kan imidlertid se ut som at det nye enumerator-systemet påfører en liten performance-hit: 10000000.times {} (nærmest en no-op, men interessant nok noe ikke Ruby optimerer bort) er rundt 20% tregere i Ruby 1.9.

Er nok ikke lenge til rails kjør fult ut på 1.9, om man går efter commit loggen

Større problem er nok mongrel faktiskt, eftersom threads i 1.9 er OS-native (tex posix på *nix). Mongrel tar imot requests mha av tråder, men riktige tråder er litt tregere at spinne opp enn 1.8’s grønne tråder, så mongrel bør nok refaktoreres om til at iaf bruke en threadpool eller så. På mongrel-dev listen snakkes det om at gå mot en mer event basert arkitektur også, blir gøy at se vad som skjer iaf, efter mange år med matz’s “gamle” ruby sitter vi nå med YARV og mange andre ruby-implentatasjoner

Ryktene sier vel at YARV er planlagt implementert i 2.0 ?

Nei, 1.9 kom til slut til å inkludere yarv VM-et.

Må si at jeg stadigvekk har litt problem med den (“experimentelle”) block-syntaxen, syns den rent ut sagt er stygg som faen, jeg mener, om jeg vil se på ting som dette kan jeg vel likebra skrive Erlang:

>> RUBY_VERSION => "1.9.0" >> p = -> (a, b) { puts [a,b].inspect } => #<Proc:0x38390c@(irb):4 (lambda)> >> p.("foo", 42) ["foo", 42]

  1. som er det samme som:
    >> l = lambda{|a,b| puts [a,b].inspect }
    => #<Proc:0×1995c4@(irb):11 (lambda)>
    >> l.call(“foo”, 42)
    [“foo”, 42]

Jeg ser ikke heller fram imot den dagen jag må debugge nån obskyr feil som oppstod pga jeg over så at man kan ha frivilige default-verdier på argument som ikke ligger sist:

>> def foo(a, b="123", c) [a,b,c] end => nil >> foo(1, 2) => [1, "123", 2]

… Men kanskje det ikke er et så stort problem likevel i virkligheten.

Diverse bra småting:

Process.daemon: “Detach the process from controlling terminal and run in the background as system daemon.”—ikke mer kjedelig manuel omdirigering av stdout/stderr/stdin

litt mer introspection er alltid gøyalt:

>> class A >> def foo() end >> end => nil >> class B < A; end => nil >> B.new.method(:foo).owner => A >> B.new.method(:foo).receiver => #<b:0x3a2488></b:0x3a2488>

Og JSON-style hashes er selvfølgelig veldig fint, men hvordan får man til symboler med den?

>> {a::foo} # dvs {"a" => :foo} SyntaxError: (irb):8: syntax error, unexpected '}', expecting tASSOC >> {:a:"foo"} # {:a => "foo"} SyntaxError: (irb):9: syntax error, unexpected ':', expecting tASSOC

Den eksperimentelle Fiber høres veldig intressant ut også

Ruby trunk har hatt YARV siden jul 2006…

pragdave har to fine artikler (del en, del to) om 1.9’s Fiber

Ruby trunk har hatt YARV siden jul 2006…

Der ser du hvor lite jeg vet om Ruby-verdenen :)

Nye bilder