Ruby2C: January 2005 Archives

ruby2c mailing list

| | Comments (0)

Since we are only hours/days away from a public beta, I just set up a ruby2c mailing list for those interested in the project. See??? I was paying attention during the basecamp workshop!

Sign up and get involved!

R2C, RSN (no really)

| | Comments (0)

I'm probably a bad person for doing this. I'm sitting at the back of the room of the basecamp workshop here in Seattle. DHH and company are at the front talking about basecamp and how to launch / promote web apps and the like. I'm back here coding on Ruby2C. I've got Eric sitting next to me, coding on his stuff, and helping me on mine. Dave Thomas sitting next to him, being good and actually paying attention to the workshop.

We just hit something HUGE. We just broke our 80% translation threshold for release:

 667/ 667 ( 81.71%): pass yaml.rb

Out of 667 files in ruby's library and my own code, we translate 545 of them. That doesn't mean that the C code is perfect, or even compiles for that matter, but it is sooo close we can taste it.

I've got some polish I need to put in, rdoc and the like, and then we are releasing.

R2C, RSN... really.

An Introduction to Ruby2c

Automatic Translation of Ruby Code to C

This is an extract from our keynote presentation / PDF that we have online. If you've already read that, then this will bore you. Otherwise, read on...

The Problem

  • Simply put, writing ruby internals in C requires a mental context switch every time you go from ruby to C and back.
    • C sucks.
      • This makes the internals harder to understand.
        • Which makes it harder to recruit otherwise good coders to work on ruby internals.
          • Which slows down ruby’s development.

Our Proposal

  • Implement the whole thing in ruby, and translate to C.
    • No more context switching.
    • Able to test changes live in the system.
    • More understandable internals.
    • More accessible to others.
    • Must be in a subset of ruby that is easily translatable to C.

Current Status

We currently have code that can convert the following example code:
  def hello(n)
    1.upto(n) do
      puts "hello world"
    end
  end
into the following C code:
  void
  hello(long n) {
  long temp_var1;
  temp_var1 = 1;
  while (temp_var1 <= n) {
  puts("hello world");
  temp_var1 = temp_var1 + 1;
  }
  }

An Extra Goodie

I wrote a 13 line class and now can do the following:
  class MyTest
    def factorial(n)
      f = 1
      n.downto(2) { |x| f *= x }
      return f
    end
  
    inline(:Ruby) do |builder|
      builder.optimize :factorial
    end
  end
and dynamically replaces the ruby version, in this case, an 8.8x speed-up with zero effort!

Want to Help?

  • Know what you are getting into... read the propaganda.
  • Respond on my blog, send me email, talk to me on IRC, or contact Eric Hodel.
  • A ruby2c subset spec is coming soon.
  • Lots to write, and much of it should be fun!