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.
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.
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.
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.
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