Comment compiler Ruby?

Existe-t-il un outil qui peut me permettre de compiler du code Ruby pour qu'il fonctionne un peu plus vite?

Par exemple, j'ai entendu dire qu'il existe un outil pour Python appelé " pyc " qui nous permet de compiler le code, de sorte qu'il s'exécute 10 fois plus vite.

26
demandé sur the Tin Man 2011-05-05 22:15:45

5 réponses

La réponse simple est que vous ne pouvez pas, au moins avec MRI 1.8 (la norme). C'est parce que 1.8 fonctionne en parcourant l'Arbre de syntaxe abstraite. Python, Ruby 1.9, JRuby et Rubinius utilisent du code octet, ce qui permet de compiler une représentation intermédiaire (code octet). De L'IRM Ruby 2.3, il est devenu facile de le faire, voir cette réponse ci-dessous.

Avec Rubinius, vous pouvez faire quelque chose comme décrit dans ce post: http://rubini.us/2011/03/17/running-ruby-with-no-ruby/

Dans JRuby, vous pouvez utiliser le compilateur "à l'avance" à travers, je crois, jrubyc.

Ce n'est pas vraiment la façon standard de faire les choses et il vaut généralement mieux laisser votre implémentation Ruby La gérer comme elle le souhaite. Rubinius, au moins, mettra en cache le code d'octet après la première compilation, en le mettant à jour comme il le faut.

23
répondu Ben Hughes 2017-08-30 22:56:16

Au début de 2013, il n'y a pas de moyen de traduire Ruby en source C/C++, puis de le compiler.

Cependant, J'ai entendu Matz (Yukihiro Matsumoto) dire qu'un chercheur est en train de créer cet outil au Japon. Le projet devrait être fondé par le gouvernement japonais.

Sinon, vous pouvez utiliser JRuby et le compiler en code octet Java ou vous pouvez utiliser Rubinius. Rubinius compile automatiquement en byte-code (compilateur JIT) pour la machine virtuelle Rubinius. Il est possible de convertir Rubinius en byte-code dans LLVM IR et LLVM peut générer du code machine.

5
répondu rtacconi 2016-02-04 19:21:19

Vérifiez le Impie git repo

4
répondu Pablo Fernandez 2011-05-05 18:17:30

Je sais que c'est une vieille question, mais j'ai trouvé un projet très intéressant qui pourrait vous donner la réponse à votre question: http://crystal-lang.org/

Il compile essentiellement Ruby en code machine natif. Ce n'est pas exactement vrai car Crystal n'est pas exactement Ruby et vous devrez peut-être apporter quelques modifications à votre code. Il y a aussi des bibliothèques qui ne sont pas encore supportées mais pour moi tout semble très prometteur.

3
répondu DP. 2015-11-07 12:41:19

De ruby 2.3.0 il est si facile de compiler votre code source en bytecodes que le Ruby-VM comprend.

byte_code = RubyVM::InstructionSequence.compile_file '/home/john/somefile.rb'

File.binwrite '/home/john/bytecode', byte_code.to_binary

Et en ligne de commande

$ 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

Le contenu du fichier

class A
  def shiva
    puts 'hello'
  end
end

Quel est le but?

Eh bien, ruby prend du temps pour compiler votre code source en codes d'octets afin que vous puissiez charger vos bytecodes directement dans ruby et exécuter. Pas de frais généraux de vérification de grammaire et de compilation. Il est beaucoup plus rapide que les processus normaux.

Comment charger l'octet code?

bytecode = File.readbin('/home/john/bytecode')
instruction_from_byte_code = RubyVM::InstructionSequence.load_from_binary byte_code

instruction_from_byte_code.eval
# => :shiva

Note: Cette réponse est testé dans IRM seulement. Cela pourrait ou pourrait ne pas fonctionner dans d'autres implémentations Ruby

3
répondu illusionist 2017-06-18 09:27:02