Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to compile Ruby?

Is there a tool that can allow me to compile Ruby code so that it runs somewhat faster?

For example, I have heard that there is a tool for Python called "pyc" that allows us to compile the code, so that it runs 10 times faster.

like image 917
Flethuseo Avatar asked May 05 '11 18:05

Flethuseo


People also ask

Can Ruby be compiled?

Compilation. Ruby is a compiled language in much the same way that Java is. While ruby is not compiled down to native machine code, it is compiled into a set of bytecode instructions that are interpreted by a virtual machine.

What compiler does Ruby use?

As of Ruby 2.6, YARV remains the official interpreter technology used for Ruby. When you run a Ruby program, YARV translates the code to a limited instruction set that can run in the Ruby virtual machine (VM).


2 Answers

The simple answer is that you can't, at least with MRI 1.8 (the standard). This is because 1.8 works by walking the Abstract Syntax Tree. Python, Ruby 1.9, JRuby, and Rubinius use byte code, which allows compilation to an Intermediate Representation (byte code). From MRI Ruby 2.3 it has become easy to do this, see this answer below.

With Rubinius, you can do something as described in this post: http://rubini.us/2011/03/17/running-ruby-with-no-ruby/

In JRuby you can use the "Ahead Of Time" compiler through, I believe, jrubyc.

This isn't really the standard way of doing things and you're generally better off just letting your Ruby implementation handle it like it wants to. Rubinius, at least, will cache byte code after the first compilation, updating it as it needs to.

like image 151
Ben Hughes Avatar answered Sep 29 '22 08:09

Ben Hughes


From ruby 2.3.0 its so easy to compile your source code to bytecodes that the Ruby-VM understands.

byte_code = RubyVM::InstructionSequence.compile_file '/home/john/somefile.rb'  File.binwrite '/home/john/bytecode', byte_code.to_binary 

and in Command Line

$ cat bytecode   YARB� IUsx86_64-linux*.*1  +1�!AA*1 !qy��������yyQ� E/home/john/somefile.rbE<main>E <class:A>EshivaEhelloEAEputsEcore#define_methodu����� 5M 

The content of the file

class A   def shiva     puts 'hello'   end end 

What is the purpose?

Well, ruby takes time to compile your source code into byte codes so you can load your bytecodes directly into ruby and execute. No overhead of grammar checking and compilation. It much faster than normal processes.

How to load byte code?

bytecode = File.binread('/home/john/bytecode') instruction_from_byte_code = RubyVM::InstructionSequence.load_from_binary bytecode  instruction_from_byte_code.eval # => :shiva 

Note: This answer is tested in MRI only. It might or might not work in other Ruby Implementations

like image 34
illusionist Avatar answered Sep 29 '22 08:09

illusionist