From: Scott Rubin Date: 2004-07-19T21:52:09+09:00 Subject: Re: Compiling Ruby code Michael Neumann wrote: > Nospam wrote: > >> Hi, >> >> Once in a while the question pops up if it is possible to compile Ruby >> code to native machine code. The answer has always been no. But I keep >> wondering how hard it would really be to make this possible. >> >> Ruby is written in C. And when Ruby parses a Ruby script it converts >> each statement to a C call. Probably the same calls you can use on >> your own in a Ruby C extension. So why wouldn't it be possible to >> parse a Ruby script and convert all statements to Ruby C code and put >> it in a *.c file (instead of calling the Ruby C statements directly). >> This *.c file can then be compiled into machine code with a C compiler >> like gcc. If each *.rb file is converted to a C file it could be >> compiled to a dynamically loadable library which could then be used on >> require statements (just like regular Ruby C extensions). >> >> What I mean is, this... >> >> class Example >> def example >> puts "Hello World!" >> end >> end >> >> .... can also be written in C using the Ruby C API, am I right? So why >> wouldn't it be possible to convert all Ruby code to C code using the >> Ruby C API? >> >> This would probably result in some performance gain (no need to parse >> the code anymore at run-time), but for some people more important, you >> can distribute your Ruby applications closed-source. In the future the >> performance gain maybe could be increased by performing special >> optimizations during the conversion process. > > > I remember that a long time ago, there was a ruby-to-c compiler (was it > called r2c?). But IIRC, there was only little performance gain. Remember > that you still need a Ruby parser, due to "eval". It would be nice, but > I'd even more like to see a bytecode compiler (written in pure Ruby > running on top of the bytecode interpreter). > > Regards, > > Michael > > Yes, I have to vote for a bytecode compiler. Right now I'm using ruby to develop some software on an embedded arm-linux device. I've found that for this application, which is not very demanding of the system, that ruby can perform pretty comparably to an equivalent C program. And the development time it saves to write in a higher level language is worth its weight in gold. But every time I run a ruby program it takes it a significant and noticable amount of time to start up. This is obviously due to the ruby parser compiling the text into bytecode every time. If it was possible to precompile this bytecode and put that on the target machine it would have significant advantages. Also, it would make it possible to distribute the application without distributing the source code to it. That isn't so important for us, but it may be for others. 2 cents. Scott