MacRuby
Transcript of MacRuby
MacRubyWhat is it?
and why should you care?
Presented by: Joshua Ballanco
A bit about me...
• Using Ruby since 2004 (didn’t discover Rails until 2006)
• Worked for Apple 2006-2010 (Fifth Ave store & HQ in Cupertino)
• Now at Patch (just completed a migration to Ruby 1.9)
• MacRuby Core Team member
Overview• Practical MacRuby
• How is MacRuby different?
• Working with Cocoa
• Compiled Ruby!
• Make your millions on the App store
• Nuts & Bolts
• GC
• Regular Expression Engine
• Hash method syntax
• LLVM & other Hacking
• GCD
What is MacRuby?
What is MacRuby?
What is MacRuby?
What is MacRuby?
What is MacRuby?
• http://www.macruby.org
• http://www.macruby.org/files/
• http://www.macruby.org/files/nightlies/
• Available from RVM (but not recommended)
• Source now located at GitHub!
https://github.com/MacRuby/MacRuby
What is MacRuby?
• Compiling MacRuby:
• Need LLVM (see the README; brew install llvm)
• rake ; sudo rake install
• Bugs – https://www.macruby.org/trac/report
• MacRuby-devel mailing list
• @macruby, #macruby
No Really, What is MacRuby?
No Really, What is MacRuby?
A language with:
• Dynamic typing
• Objects everywhere
• Method calls via sending messages
• Automatic generation of accessors
• Methods can be added to classes at runtime
• Garbage Collection
• Closures
No Really, What is MacRuby?
A language with:
• Dynamic typing
• Objects everywhere
• Method calls via sending messages
• Automatic generation of accessors
• Methods can be added to classes at runtime
• Garbage Collection
• Closures
...called Objective-C
Ruby Syntax
Ruby Syntax
ParserMRI’s parse.y
Ruby Syntax
ParserMRI’s parse.y
CompilerRoxorCompiler <C++>
Ruby Syntax
ParserMRI’s parse.y
CompilerRoxorCompiler <C++>
VM (sans GVL)RoxorVM & RoxorCore <C++>
Ruby Syntax
ParserMRI’s parse.y
CompilerRoxorCompiler <C++>
VM (sans GVL)RoxorVM & RoxorCore <C++>
LLVM (with JIT)
Ruby Syntax
ParserMRI’s parse.y
CompilerRoxorCompiler <C++>
VM (sans GVL)RoxorVM & RoxorCore <C++>
LLVM (with JIT)
Ruby Syntax
ParserMRI’s parse.y
CompilerRoxorCompiler <C++>
VM (sans GVL)RoxorVM & RoxorCore <C++>
LLVM (with JIT)
Objective-C Runtime
Integrating with Cocoa
• Bridge Support (please download preview 3 from the “files” page)
• gen_bridge_metadata reads header files and generates XML descriptions of types and method signatures
• MacRuby uses BS files to construct calls and access constants and types
• framework “Foundation”
Integrating with Cocoa
• String, Array, Hash, are members of the NSString, NSArray, and NSDictionary class clusters
• Caution: NSString, NSArray, and NSDictionary will lie to you!
• Time is implemented as a subclass of NSDate
Demo
A Ruby You Can Compile
• macrubyc
• Advantages:
• Faster startup, faster runtime (in most cases)
• Don’t distribute the source!
• Disadvantages:
• ?
• ...some bugs
A Ruby You Can Compile
• -c → Compile and assemble; good for multistage builds
• -C → Compile, assemble, and link creating an *.rbo
• Can also create stand-alone executables and entire “*.framework”s (experimental)
Demo
I wanna be an App store billionaire...
• Downloads contain Xcode templates (mostly work in Xcode 4)
• Integration with Interface Builder
• macruby_deploy
• Includes BS files
• Unpacks Gems
• Compiles source
I wanna be an App store billionaire...
I wanna be an App store billionaire...
QuickAlarm
Briquette
Timey
Zero2Nine
MacRuby Nuts & Bolts
Garbage Collector:libauto
• Yet another open source project from Apple
• The GC for Obj-C
• Based on write barriers
• scanning, conservative, generational, multi-threaded garbage collector...
• ...unfortunately...slow
Garbage Collector:the Next Generation(?)
• Ruby does A LOT of allocations
• Nice to not have to stop the world, but...
• Write barriers are slow
• Maybe ref counting?
• Maybe MRI’s collector isn’t so bad after all...
RegExps:ICU
• Oniguruma is not (real thread) thread safe
• ICU is
• thread safe
• Unicode compatible
• not as crazy feature-full as Oniguruma
• There are some bugs...but honestly, stop doing that with RegExps!!!
Hash method syntax
• Ruby 1.9’s hash syntax with Symbol keys:a = { foo: 1, bar: 2, baz: “Hello, world” }
• ...looks a bit like:
[@”Hello, world” rangeOfString:@”ello” options: NSCaseInsensitiveSearch]
• Let’s go with that!
Hash method syntax
• MacRuby turns method calls with hash arguments into SEL
• MacRuby turns method definitions with hash lists into SEL
• MacRuby can call Objective-C
• Objective-C can call MacRuby, but when possible you should use:[[MacRuby sharedRuntime] performRubySelector:@”foo”]
LLVM, JIT, and Hacking
• LLVM provides optimizations
• LLVM provides JIT utilities (kinda slow)
• MacRuby can emit LLVM...VM_DUMP_IR=1 macruby -e "def foo; puts 'hello'; end; foo"
• Find other neat tricks in HACKING.rdoc
Demo
GCD & The Future
GCD
• MacRuby can tap directly into GCD
• Dispatch module:
• Dispatch::Queue
• Dispatch::Group
• Dispatch::Source
• Dispatch Gem too!
GCD
• Dispatch is a powerful tool for concurrent programming
• Example: ControlTower
• MacRuby Rack-based server
• Uses GCD to handle requets
• Accomplishes in 1 line what takes Thin/EventMachine > 6000 lines of C++ & Ruby
GCD
GCD
• Can we make GCD work in MRI?
• JRuby thinks they can make it work...
https://github.com/headius/jcd
• GCD is Multithreaded Programming, Ruby Style
Who Is MacRuby?• Laurent Sansonetti
• Vincent Isambart
• Eloy Durán
• Matt Aimonetti
• Joshua Ballanco
• Thibault Martin-Lagardette
• Watson
• Takao Kouji
• Mark Rada
• You?
Thank you!
http://ofps.oreilly.com/titles/9781449380373/