K jednotlivým problémům:
Pro někoho může být zajímavý přehled instrukcí YARV.
Informace o zrychlení pocházejí z tohoto testu.
Vývoj YARV probíhal původně odděleně od hlavní vývojové větve Ruby, ke sloučení došlo přelomu let 2006/2007.
Koichi Sasada na rozdíl od Matze umí dobře programovat, na kódu je to vidět.
Podpora Sunu má konkrétní podobu, a to že Sun zaměstnává dva z core vývojářů.
"Skoro 100%" znamená, že jsou jisté rozdíly mezi JRuby a MRI. Chybí například podpora continuations (které na JVM nejde efektivně implementovat), je využíván Javovský engine pro regulární výrazy (který se v detailech odlišuje od enginu v MRI) a vlákna jsou implementována pomocí standardních Javovských (jinak to v JVM nelze udělat).
include Java
frame = javax.swing.JFrame.new("Window")
label = javax.swing.JLabel.new("Hello")
frame.getContentPane.add(label)
frame.setDefaultCloseOperation(
javax.swing.JFrame::EXIT_ON_CLOSE
)
frame.pack
frame.setVisible(true)
import org.jruby.*;
Ruby runtime = Ruby.getDefaultInstance();
runtime.evalScript("puts 1 + 2");
Autoři zatím nechtějí implementovat některé funkce jako vlákna či continuations, protože není jasné, zda a v jaké podobě budou v budoucích verzích Ruby.
Integrace je zatím trochu omezená, například z jiných jazyků lze
používat jen třídy v Ruby, které jsou zděděné přímo od
Object
.
Na stránkách projektu se píše, že vývoj bude otevřen v druhé polovině 2007.
Vztah s IronRuby je docela zajímavý: Microsoft mimo jiné licencoval parser Ruby z Ruby.NET a používá ho v IronRuby.
Zajímavost: Evanu Phoenixovi, autorovi Rubiniusu, se jádro v C moc nelíbí, v budoucnu ho chce generovat z jakéhosi dialektu Ruby.
K jednotlivým cílům:
Otevřený model vývoje znamená, že každý, kdo pošle alespoň jeden patch, získává commit access k vývojovému stromu. Tomu říkám důvěra.
Projekt Parrot si klade za cíl vytvořit univerzální virtuální stroj umožňující efektivní běh dynamických jazyků. V současnosti obsahuje front-endy k mnoha různorodým jazykům, včetně PHP, Pythonu, Perlu, Luy, JavaScriptu, Scheme a – prostřednictvím projektu Cardinal – i k Ruby.
Front-end pro daný jazyk vždy zkompiluje zdrojový kód do PIR (též IMC), což je relativně high-level mezijazyk pracující s pojmy jako funkce nebo lokální proměnné. V serializované podobě je PIR čitelný pro člověka a kód v něm je podobný kódu v původním jazyce.
V další fázi je PIR přeložen do nízkoúrovňového bytecode, PBC. Tento bytecode je pak spouštěn virtuálním strojem Parrotu a případně pro efektivitu JIT překládán do nativního kódu dané platformy.
O tom, zda Rubinius postupně nenahradí MRI jako oficiální implementaci, se rozepisuje Ola Bini. Osobně bych jeho šance viděl docela dobře, především díky mnohem jednoduššímu a čistěji napsanému zdrojovému kódu.
JRuby má silnou pozici především díky své relativní vyzrálosti a podpoře Sunu.
U IronRuby je na místě otazník ze dvou důvodů: V současnosti není příliš vyzrálé a pak je od Microsoftu. Microsoft se zde pohybuje na neobvyklém poli a je otázka, jak se v budoucnu zachová (vzhledem k jeho vztahům k open source na jiných frontách).
Zajímavá je otázka, zda (nebo spíš kdy) se bude některá z alternativních implementací cítit natolik silná, aby začala definovat vlastní rozšíření jazyka či některé věci řešit záměrně nekompatibilně (modulo technická omezení, jako vlákna v JRuby). Dojde k fragmentaci a divergenci jednotlivých implementací Ruby, jako se to stalo u jiných jazyků (např. C)?
Příkladem kopírování kódu je parser Ruby. Prakticky všechny implementace používají původní Matzův parser přepsaný do cílového jazyka a případně mírně upravený (jedinou výjimkou je projekt XRuby). Důsledkem je, že Matzův ošklivý a obtížně udržovatelný kód se šíří jako virus.
Jaké že ošklivosti se to skrývají pod povrchem Ruby? Osobně se mi nelíbí bloky, které jsou "podivné" tím, že to nejsou obyčejné anonymní funkce/metody. Spousta pravidel (například pro lookup konstant) je dost komplikovaných. Toplevel kontext není podobný ani kontextu třídy, ani kontextu metody – je to takový kočkopes. Matz prováděl také spoustu mikrooptimalizací, které ale mají vliv na sémantiku – velké ne-e pro každého poctivého návrháře a implementátora jazyka, který o sobě chce tvrdit, že je elegantní. Ruby je elegantní jen do doby, než se podíváte pod kapotu. Bohužel.
Dotazy?