SlideShare a Scribd company logo
A quick introduction to


                           MacRuby          Objective-C, Cocoa, LLVM, Grand Central
                                                       and other musings




Olivier Gutknecht - OSDC.fr - Oct. 3 2009
Olivier Gutknecht
olg@no-distance.net
twitter : olg




                                         MacRuby


  iCal, iSync, [...]     co-founder      Active lurker
                       Server Software
Breaking News !

MacRuby developer
attacked by raptors
Text
 Text
Text
 Text
MacRuby
Mac OS X Stack

  Applications


  Application
  Frameworks
                    Cocoa, WebKit, ...


Core Technologies   CoreGraphics, CoreFoundation, ...


     Darwin         Kernel, userland, libdispatch, ...
Ruby on OS X
2002   Mac OS X 10.2      Ruby 1.6.7

2005   Mac OS X 10.4      Ruby 1.8.2

2007   Mac OS X 10.5      Ruby 1.8.6
                       RubyCocoa, gems, Rails


2009   Mac OS X 10.6      Ruby 1.8.7
                       RubyCocoa, gems, Rails


20xx         ?          Sky is the limit
Ruby on OS X
• Ruby, just on another unix platform
• With some small improvements...
  e.g. mongrel_rails_persists on OS X Server
  launchd / bonjour integration


• What about Cocoa ?
Family business

         SmallTalk


Objective-C     Ruby
A “true” OS X App in
       Ruby ?




    Sure. Check out Gitnub
RubyCocoa
• A ruby-objc bridge
  (FUJIMOTO Hisakuni, 2001)
• Ruby 1.8
• Green threads, no reentrance
• Two runtimes, two GC
• ... interesting syntax
• Ouch
MacRuby, an introduction
require 'osx/cocoa'; include OSX
app = NSApplication.sharedApplication
win = NSWindow.alloc.initWithContentRect_styleMask_backing_defer(
[0, 0, 200, 60], NSTitledWindowMask | NSClosableWindowMask |
NSMiniaturizableWindowMask | NSResizableWindowMask,
NSBackingStoreBuffered, false)
win.title = 'Hello World'
button = NSButton.alloc.initWithFrame(NSZeroRect)
win.contentView.addSubview(button)
button.bezelStyle = NSRoundedBezelStyle
button.title = 'Hello!'
button.sizeToFit
button.frameOrigin = NSMakePoint((win.contentView.frameSize.width/
2.0)-(button.frameSize.width/2.0), (win.contentView.frameSize.height/
2.0)-(button.frameSize.height/2.0))
button_controller = Object.new def button_controller.sayHello(sender)
puts "Hello OSDC!" end
button.target = button_controller
button.action = 'sayHello:'
win.display
win.orderFrontRegardless
app.run
Easy.
(when you’re proficient in Objective-C, Cocoa, Ruby and the bridge - here be dragons)
MacRuby
MacRuby

• One GC to release them all
MacRuby

• One GC to release them all
• One runtime to bind them
MacRuby

• One GC to release them all
• One runtime to bind them
• In the land of Cocoa where Obj-C lie
MacRuby
      Laurent Sansonetti
           (Apple)
          Vincent Isambart
            Kich Kilmer
             Eloy Duran
             Ben Stiglitz
           Matt Aimonetti
                  ...

       http://www.macruby.org
      http://twitter.com/macruby
Modest goals


• The best platform for Ruby developers
• A great platform for Cocoa developers
Bridge, what bridge ?
$ macirb
>> s = "osdc"
=> "osdc"

>> s.class
=> NSMutableString

>> s.class.ancestors
=> [NSMutableString, NSString, Comparable, NSObject, Kernel]

>> s.upcase
=> "OSDC"

>> s.uppercaseString
=> "OSDC"

>> s.respondsToSelector(:upcase)
=> 1

>> s.respond_to?(:upcase)
=> true
Bridge, what bridge ?

• A Ruby class is an Objective-C class
• A Ruby method is an Objective-C method
• A Ruby instance is an Objective-C instance
Syntax
                                             Objective-C
Person *person = [Person new];

[person name];
[person setName:name];
[person setFirstName:first lastName:last];


                                               MacRuby
person = Person.new

person.name
person.name = myName
person.setFirstName(first, lastName:last)
HotCocoa
require ‘hotcocoa’
include HotCocoa

application do
  win = window :title => ‘hello OSDC’, :frame => [0, 0, 200, 60]
  b = button :title => ‘Hello!’, :layout => {:align => :center}
  win << b
  b.on_action { puts “Hello OSDC!” }
end



       A thin layer by Rich Kilmer, providing a natural
         ruby experience when coding Cocoa apps
Ruby 1.9


Parser     Runtime   Built-in classes

YARV        GC           Stdlib
MacRuby

               Runtime
  Parser                      Stdlib

LLVM/Roxor     libobjc   Built-in Classes
AOT    JIT     libauto
                         CoreFoundation
MacRuby 0.4 - 04/09

•   XCode integration

•   Embedding / Runtime
    Control

•   HotCocoa

•   Threaded GC
MacRuby 0.5 - xx/09

•   YARV ? LLVM !

•   RubySpec

•   AOT

•   GrandCentral

•   ...
Why LLVM ?
Coolest Logo Ever
Everybody loves
 microbenchmarks
(lies, damn lies and benchmarks)



                            From a bench by Patrick Thomson @ C4
C

static int fib(int n)
{
  if (n < 3) {
    return 1;
  }
  else {
    return fib(n - 1) + fib(n - 2);
  }
}
Objective-C
@implementation Fib
- (int)fib:(int)n
{
  if (n < 3) {
     return 1;
  }
  else {
     return [self fib:n - 1] + [self fib:n - 2];
  }
}
@end
4




                     3
execution time (s)




                     2




                     1




                     0
                             fib(40)
                         C             Objective-C
Ruby

def fib(n)
  if n < 3
    1
  else
    fib(n-1) + fib(n-2)
  end
end

p fib(ARGV.join("").to_i)
4




                     3
execution time (s)




                     2




                     1




                     0
                               fib(40)


                         C   MacRuby     Objective-C
MRI Ruby 1.8
$ ruby fibo.rb 40
102334155


                               MacRuby
$ macruby fibo.rb 40
102334155


                           MacRuby AOT
$ macrubyc fibo.rb -o fibo
$ ./fibo 40
102334155
Grand Central
# A GCD-based implementation of the sleeping barber problem:
#   http://en.wikipedia.org/wiki/Sleeping_barber_problem
#   http://www.madebysofa.com/#blog/the_sleeping_barber

waiting_chairs = Dispatch::Queue.new('com.apple.waiting_chairs')
semaphore = Dispatch::Semaphore.new(3)
index = -1
while true
  index += 1
  success = semaphore.wait(Dispatch::TIME_NOW)
  if success != 0
    puts "Customer turned away #{index}"
    next
  end
  waiting_chairs.dispatch do
    semaphore.signal
    puts "Shave and a haircut #{index}"
  end
end
Tools Galore

    ?
Why MacRuby ?

• Ruby for “mac-like” desktop applications
• A wonderful experimentation playground
• ... Interesting perspectives
Q&A

• Ruby 1.9 compatibility
 • Right now, ≈ 80% on rubyspec
• Other platforms, portability
 • No closed-source dependancies, no
    definitive technical blocker
 • ... Any takers ?
Thanks!

More Related Content

KEY
Modified "Why MacRuby Matters"
Sean McCune
 
PDF
MacRuby
bostonrb
 
PDF
【論文紹介】Relay: A New IR for Machine Learning Frameworks
Takeo Imai
 
PPTX
Seeing with Python presented at PyCon AU 2014
Mark Rees
 
PDF
Optcarrot: A Pure-Ruby NES Emulator
mametter
 
PDF
Engineering fast indexes (Deepdive)
Daniel Lemire
 
PDF
Exploiting Concurrency with Dynamic Languages
Tobias Lindaaker
 
PDF
Experiments in Sharing Java VM Technology with CRuby
Matthew Gaudet
 
Modified "Why MacRuby Matters"
Sean McCune
 
MacRuby
bostonrb
 
【論文紹介】Relay: A New IR for Machine Learning Frameworks
Takeo Imai
 
Seeing with Python presented at PyCon AU 2014
Mark Rees
 
Optcarrot: A Pure-Ruby NES Emulator
mametter
 
Engineering fast indexes (Deepdive)
Daniel Lemire
 
Exploiting Concurrency with Dynamic Languages
Tobias Lindaaker
 
Experiments in Sharing Java VM Technology with CRuby
Matthew Gaudet
 

What's hot (20)

PDF
Autovectorization in llvm
ChangWoo Min
 
PDF
[JavaOne 2011] Models for Concurrent Programming
Tobias Lindaaker
 
PPTX
Ruby3x3: How are we going to measure 3x
Matthew Gaudet
 
PPT
XRuby_Overview_20070831
dreamhead
 
PDF
Vc4c development of opencl compiler for videocore4
nomaddo
 
PPTX
Introduction to .NET
Lorenzo Dematté
 
PDF
Swift after one week of coding
SwiftWro
 
PDF
TRICK2013 Results
mametter
 
PPTX
Grow and Shrink - Dynamically Extending the Ruby VM Stack
KeitaSugiyama1
 
PDF
To Swift 2...and Beyond!
Scott Gardner
 
PDF
MacRuby & HotCocoa
Thilo Utke
 
PDF
Openstack 簡介
kao kuo-tung
 
PPTX
LLJVM: LLVM bitcode to JVM bytecode
Takeshi Yamamuro
 
PPTX
C++ & Java JIT Optimizations: Finding Prime Numbers
Adam Feldscher
 
KEY
tDiary annual report 2009 - Sapporo Ruby Kaigi02
Hiroshi SHIBATA
 
PDF
Pythran: Static compiler for high performance by Mehdi Amini PyData SV 2014
PyData
 
PDF
How to distribute Ruby to the world
Hiroshi SHIBATA
 
PPT
Using timed-release cryptography to mitigate the preservation risk of embargo...
Michael Nelson
 
PPTX
Zero-Overhead Metaprogramming: Reflection and Metaobject Protocols Fast and w...
Stefan Marr
 
PDF
Advanced cocos2d
Keisuke Hata
 
Autovectorization in llvm
ChangWoo Min
 
[JavaOne 2011] Models for Concurrent Programming
Tobias Lindaaker
 
Ruby3x3: How are we going to measure 3x
Matthew Gaudet
 
XRuby_Overview_20070831
dreamhead
 
Vc4c development of opencl compiler for videocore4
nomaddo
 
Introduction to .NET
Lorenzo Dematté
 
Swift after one week of coding
SwiftWro
 
TRICK2013 Results
mametter
 
Grow and Shrink - Dynamically Extending the Ruby VM Stack
KeitaSugiyama1
 
To Swift 2...and Beyond!
Scott Gardner
 
MacRuby & HotCocoa
Thilo Utke
 
Openstack 簡介
kao kuo-tung
 
LLJVM: LLVM bitcode to JVM bytecode
Takeshi Yamamuro
 
C++ & Java JIT Optimizations: Finding Prime Numbers
Adam Feldscher
 
tDiary annual report 2009 - Sapporo Ruby Kaigi02
Hiroshi SHIBATA
 
Pythran: Static compiler for high performance by Mehdi Amini PyData SV 2014
PyData
 
How to distribute Ruby to the world
Hiroshi SHIBATA
 
Using timed-release cryptography to mitigate the preservation risk of embargo...
Michael Nelson
 
Zero-Overhead Metaprogramming: Reflection and Metaobject Protocols Fast and w...
Stefan Marr
 
Advanced cocos2d
Keisuke Hata
 
Ad

Similar to MacRuby, an introduction (20)

ZIP
Why MacRuby Matters
importantshock
 
ZIP
MacRuby to The Max
Brendan Lim
 
KEY
Mac ruby to the max - Brendan G. Lim
ThoughtWorks
 
PDF
Mac ruby deployment
Thilo Utke
 
PDF
Macruby intro
Peter Lind
 
KEY
MacRuby: What is it? and why should you care?
Joshua Ballanco
 
PDF
Macruby& Hotcocoa presentation by Rich Kilmer
Matt Aimonetti
 
PDF
Developing Cocoa Applications with macRuby
Brendan Lim
 
PDF
RubyならMacでしょう
vincentisambart
 
PDF
Charla ruby nscodermad
nscoder_mad
 
PDF
GUI Programming with MacRuby
Erik Berlin
 
PDF
MacRuby For Ruby Developers
Renzo Borgatti
 
PDF
MacRuby - When objective-c and Ruby meet
Matt Aimonetti
 
PDF
ruby-cocoa
tutorialsruby
 
PDF
ruby-cocoa
tutorialsruby
 
PDF
Macruby - RubyConf Presentation 2010
Matt Aimonetti
 
PDF
MacRuby & RubyMotion - Madridrb May 2012
Mark Villacampa
 
PDF
Ruby Meets Cocoa
Robbert
 
KEY
MacRuby for Fun and Profit
Joshua Ballanco
 
PDF
Writing Apps with HotCocoa and MacRuby
Renzo Borgatti
 
Why MacRuby Matters
importantshock
 
MacRuby to The Max
Brendan Lim
 
Mac ruby to the max - Brendan G. Lim
ThoughtWorks
 
Mac ruby deployment
Thilo Utke
 
Macruby intro
Peter Lind
 
MacRuby: What is it? and why should you care?
Joshua Ballanco
 
Macruby& Hotcocoa presentation by Rich Kilmer
Matt Aimonetti
 
Developing Cocoa Applications with macRuby
Brendan Lim
 
RubyならMacでしょう
vincentisambart
 
Charla ruby nscodermad
nscoder_mad
 
GUI Programming with MacRuby
Erik Berlin
 
MacRuby For Ruby Developers
Renzo Borgatti
 
MacRuby - When objective-c and Ruby meet
Matt Aimonetti
 
ruby-cocoa
tutorialsruby
 
ruby-cocoa
tutorialsruby
 
Macruby - RubyConf Presentation 2010
Matt Aimonetti
 
MacRuby & RubyMotion - Madridrb May 2012
Mark Villacampa
 
Ruby Meets Cocoa
Robbert
 
MacRuby for Fun and Profit
Joshua Ballanco
 
Writing Apps with HotCocoa and MacRuby
Renzo Borgatti
 
Ad

Recently uploaded (20)

PDF
This slide provides an overview Technology
mineshkharadi333
 
PDF
Software Development Company | KodekX
KodekX
 
PDF
madgavkar20181017ppt McKinsey Presentation.pdf
georgschmitzdoerner
 
PPTX
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
AVTRON Technologies LLC
 
PDF
agentic-ai-and-the-future-of-autonomous-systems.pdf
siddharthnetsavvies
 
PPTX
How to Build a Scalable Micro-Investing Platform in 2025 - A Founder’s Guide ...
Third Rock Techkno
 
PDF
How Onsite IT Support Drives Business Efficiency, Security, and Growth.pdf
Captain IT
 
PDF
How-Cloud-Computing-Impacts-Businesses-in-2025-and-Beyond.pdf
Artjoker Software Development Company
 
PDF
Oracle AI Vector Search- Getting Started and what's new in 2025- AIOUG Yatra ...
Sandesh Rao
 
PPTX
C Programming Basics concept krnppt.pptx
Karan Prajapat
 
PDF
Shreyas_Phanse_Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
SHREYAS PHANSE
 
PDF
solutions_manual_-_materials___processing_in_manufacturing__demargo_.pdf
AbdullahSani29
 
PPTX
The Power of IoT Sensor Integration in Smart Infrastructure and Automation.pptx
Rejig Digital
 
PDF
Cloud-Migration-Best-Practices-A-Practical-Guide-to-AWS-Azure-and-Google-Clou...
Artjoker Software Development Company
 
PDF
REPORT: Heating appliances market in Poland 2024
SPIUG
 
PDF
Revolutionize Operations with Intelligent IoT Monitoring and Control
Rejig Digital
 
PDF
NewMind AI Weekly Chronicles - July'25 - Week IV
NewMind AI
 
PPTX
The-Ethical-Hackers-Imperative-Safeguarding-the-Digital-Frontier.pptx
sujalchauhan1305
 
PDF
Orbitly Pitch Deck|A Mission-Driven Platform for Side Project Collaboration (...
zz41354899
 
PDF
Google I/O Extended 2025 Baku - all ppts
HusseinMalikMammadli
 
This slide provides an overview Technology
mineshkharadi333
 
Software Development Company | KodekX
KodekX
 
madgavkar20181017ppt McKinsey Presentation.pdf
georgschmitzdoerner
 
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
AVTRON Technologies LLC
 
agentic-ai-and-the-future-of-autonomous-systems.pdf
siddharthnetsavvies
 
How to Build a Scalable Micro-Investing Platform in 2025 - A Founder’s Guide ...
Third Rock Techkno
 
How Onsite IT Support Drives Business Efficiency, Security, and Growth.pdf
Captain IT
 
How-Cloud-Computing-Impacts-Businesses-in-2025-and-Beyond.pdf
Artjoker Software Development Company
 
Oracle AI Vector Search- Getting Started and what's new in 2025- AIOUG Yatra ...
Sandesh Rao
 
C Programming Basics concept krnppt.pptx
Karan Prajapat
 
Shreyas_Phanse_Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
SHREYAS PHANSE
 
solutions_manual_-_materials___processing_in_manufacturing__demargo_.pdf
AbdullahSani29
 
The Power of IoT Sensor Integration in Smart Infrastructure and Automation.pptx
Rejig Digital
 
Cloud-Migration-Best-Practices-A-Practical-Guide-to-AWS-Azure-and-Google-Clou...
Artjoker Software Development Company
 
REPORT: Heating appliances market in Poland 2024
SPIUG
 
Revolutionize Operations with Intelligent IoT Monitoring and Control
Rejig Digital
 
NewMind AI Weekly Chronicles - July'25 - Week IV
NewMind AI
 
The-Ethical-Hackers-Imperative-Safeguarding-the-Digital-Frontier.pptx
sujalchauhan1305
 
Orbitly Pitch Deck|A Mission-Driven Platform for Side Project Collaboration (...
zz41354899
 
Google I/O Extended 2025 Baku - all ppts
HusseinMalikMammadli
 

MacRuby, an introduction

  • 1. A quick introduction to MacRuby Objective-C, Cocoa, LLVM, Grand Central and other musings Olivier Gutknecht - OSDC.fr - Oct. 3 2009
  • 2. Olivier Gutknecht [email protected] twitter : olg MacRuby iCal, iSync, [...] co-founder Active lurker Server Software
  • 3. Breaking News ! MacRuby developer attacked by raptors
  • 7. Mac OS X Stack Applications Application Frameworks Cocoa, WebKit, ... Core Technologies CoreGraphics, CoreFoundation, ... Darwin Kernel, userland, libdispatch, ...
  • 8. Ruby on OS X 2002 Mac OS X 10.2 Ruby 1.6.7 2005 Mac OS X 10.4 Ruby 1.8.2 2007 Mac OS X 10.5 Ruby 1.8.6 RubyCocoa, gems, Rails 2009 Mac OS X 10.6 Ruby 1.8.7 RubyCocoa, gems, Rails 20xx ? Sky is the limit
  • 9. Ruby on OS X • Ruby, just on another unix platform • With some small improvements... e.g. mongrel_rails_persists on OS X Server launchd / bonjour integration • What about Cocoa ?
  • 10. Family business SmallTalk Objective-C Ruby
  • 11. A “true” OS X App in Ruby ? Sure. Check out Gitnub
  • 12. RubyCocoa • A ruby-objc bridge (FUJIMOTO Hisakuni, 2001) • Ruby 1.8 • Green threads, no reentrance • Two runtimes, two GC • ... interesting syntax • Ouch
  • 14. require 'osx/cocoa'; include OSX app = NSApplication.sharedApplication win = NSWindow.alloc.initWithContentRect_styleMask_backing_defer( [0, 0, 200, 60], NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask | NSResizableWindowMask, NSBackingStoreBuffered, false) win.title = 'Hello World' button = NSButton.alloc.initWithFrame(NSZeroRect) win.contentView.addSubview(button) button.bezelStyle = NSRoundedBezelStyle button.title = 'Hello!' button.sizeToFit button.frameOrigin = NSMakePoint((win.contentView.frameSize.width/ 2.0)-(button.frameSize.width/2.0), (win.contentView.frameSize.height/ 2.0)-(button.frameSize.height/2.0)) button_controller = Object.new def button_controller.sayHello(sender) puts "Hello OSDC!" end button.target = button_controller button.action = 'sayHello:' win.display win.orderFrontRegardless app.run
  • 15. Easy. (when you’re proficient in Objective-C, Cocoa, Ruby and the bridge - here be dragons)
  • 17. MacRuby • One GC to release them all
  • 18. MacRuby • One GC to release them all • One runtime to bind them
  • 19. MacRuby • One GC to release them all • One runtime to bind them • In the land of Cocoa where Obj-C lie
  • 20. MacRuby Laurent Sansonetti (Apple) Vincent Isambart Kich Kilmer Eloy Duran Ben Stiglitz Matt Aimonetti ... http://www.macruby.org http://twitter.com/macruby
  • 21. Modest goals • The best platform for Ruby developers • A great platform for Cocoa developers
  • 22. Bridge, what bridge ? $ macirb >> s = "osdc" => "osdc" >> s.class => NSMutableString >> s.class.ancestors => [NSMutableString, NSString, Comparable, NSObject, Kernel] >> s.upcase => "OSDC" >> s.uppercaseString => "OSDC" >> s.respondsToSelector(:upcase) => 1 >> s.respond_to?(:upcase) => true
  • 23. Bridge, what bridge ? • A Ruby class is an Objective-C class • A Ruby method is an Objective-C method • A Ruby instance is an Objective-C instance
  • 24. Syntax Objective-C Person *person = [Person new]; [person name]; [person setName:name]; [person setFirstName:first lastName:last]; MacRuby person = Person.new person.name person.name = myName person.setFirstName(first, lastName:last)
  • 25. HotCocoa require ‘hotcocoa’ include HotCocoa application do win = window :title => ‘hello OSDC’, :frame => [0, 0, 200, 60] b = button :title => ‘Hello!’, :layout => {:align => :center} win << b b.on_action { puts “Hello OSDC!” } end A thin layer by Rich Kilmer, providing a natural ruby experience when coding Cocoa apps
  • 26. Ruby 1.9 Parser Runtime Built-in classes YARV GC Stdlib
  • 27. MacRuby Runtime Parser Stdlib LLVM/Roxor libobjc Built-in Classes AOT JIT libauto CoreFoundation
  • 28. MacRuby 0.4 - 04/09 • XCode integration • Embedding / Runtime Control • HotCocoa • Threaded GC
  • 29. MacRuby 0.5 - xx/09 • YARV ? LLVM ! • RubySpec • AOT • GrandCentral • ...
  • 32. Everybody loves microbenchmarks (lies, damn lies and benchmarks) From a bench by Patrick Thomson @ C4
  • 33. C static int fib(int n) { if (n < 3) { return 1; } else { return fib(n - 1) + fib(n - 2); } }
  • 34. Objective-C @implementation Fib - (int)fib:(int)n { if (n < 3) { return 1; } else { return [self fib:n - 1] + [self fib:n - 2]; } } @end
  • 35. 4 3 execution time (s) 2 1 0 fib(40) C Objective-C
  • 36. Ruby def fib(n) if n < 3 1 else fib(n-1) + fib(n-2) end end p fib(ARGV.join("").to_i)
  • 37. 4 3 execution time (s) 2 1 0 fib(40) C MacRuby Objective-C
  • 38. MRI Ruby 1.8 $ ruby fibo.rb 40 102334155 MacRuby $ macruby fibo.rb 40 102334155 MacRuby AOT $ macrubyc fibo.rb -o fibo $ ./fibo 40 102334155
  • 39. Grand Central # A GCD-based implementation of the sleeping barber problem: # http://en.wikipedia.org/wiki/Sleeping_barber_problem # http://www.madebysofa.com/#blog/the_sleeping_barber waiting_chairs = Dispatch::Queue.new('com.apple.waiting_chairs') semaphore = Dispatch::Semaphore.new(3) index = -1 while true index += 1 success = semaphore.wait(Dispatch::TIME_NOW) if success != 0 puts "Customer turned away #{index}" next end waiting_chairs.dispatch do semaphore.signal puts "Shave and a haircut #{index}" end end
  • 41. Why MacRuby ? • Ruby for “mac-like” desktop applications • A wonderful experimentation playground • ... Interesting perspectives
  • 42. Q&A • Ruby 1.9 compatibility • Right now, ≈ 80% on rubyspec • Other platforms, portability • No closed-source dependancies, no definitive technical blocker • ... Any takers ?