Jak skompilować Ruby?

Czy istnieje narzędzie, które pozwoli mi skompilować kod Ruby tak, aby działał nieco szybciej?

Na przykład słyszałem, że istnieje narzędzie do Pythona o nazwie "pyc", które pozwala nam skompilować kod, tak aby działał 10 razy szybciej.

Author: the Tin Man, 2011-05-05

5 answers

Prosta odpowiedź jest taka, że nie możesz, przynajmniej z MRI 1.8 (standard). Dzieje się tak dlatego, że 1.8 działa poprzez chodzenie po abstrakcyjnym drzewie składni. Python, Ruby 1.9, JRuby i Rubinius używają kodu bajtowego, który umożliwia kompilację do pośredniej reprezentacji (kodu bajtowego). Od MRI Ruby 2.3 stało się to łatwe, zobacz tę ODPOWIEDŹ poniżej.

Z Rubiniusem możesz zrobić coś, co opisano w tym poście: http://rubini.us/2011/03/17/running-ruby-with-no-ruby/

W JRuby możesz użyć kompilatora "przed czasem" poprzez, jak sądzę, jrubyc.

To nie jest tak naprawdę standardowy sposób robienia rzeczy i generalnie lepiej jest pozwolić, aby Twoja implementacja Ruby poradziła sobie z tym tak, jak tego chce. Rubinius przynajmniej będzie buforował kod bajtowy po pierwszej kompilacji, aktualizując go zgodnie z potrzebami.

 23
Author: Ben Hughes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-30 22:56:16

Na Początku 2013 roku nie ma sposobu na przetłumaczenie Rubiego na źródło C/C++, a następnie skompilowanie go.

Jednak słyszałem, jak Matz (Yukihiro Matsumoto) mówił, że naukowiec tworzy to narzędzie w Japonii. Projekt powinien zostać założony przez rząd japoński.

W przeciwnym razie możesz użyć JRuby i skompilować go w Java bajtowym kodzie lub możesz użyć Rubiniusa. Rubinius kompiluje automatycznie w kodzie bajtowym (kompilator JIT) dla maszyny wirtualnej Rubinius. Można nawrócić Rubiniusza w kod bajtowy do LLVM IR i LLVM może generować kod maszynowy.

 5
Author: rtacconi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-04 19:21:19

Sprawdź Unholy git repo

 4
Author: Pablo Fernandez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-05 18:17:30

Wiem, że to stare pytanie, ale znalazłem bardzo ciekawy projekt, który może dać odpowiedź na twoje pytanie: http://crystal-lang.org/

Zasadniczo kompiluje Ruby do natywnego kodu maszynowego. To nie jest do końca prawda, ponieważ Crystal nie jest do końca Ruby i być może będziesz musiał dokonać pewnych modyfikacji kodu. Istnieją również biblioteki, które nie są obsługiwane (jeszcze), ale dla mnie wszystko wygląda bardzo obiecująco.

 3
Author: DP.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-07 12:41:19

Z ruby 2.3.0 jest tak łatwo skompilować kod źródłowy do bajtowych kodów, że Ruby-VM rozumie.

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

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

Oraz w wierszu poleceń

$ 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

Zawartość pliku

class A
  def shiva
    puts 'hello'
  end
end

Jaki jest cel?

Cóż, ruby potrzebuje czasu, aby skompilować kod źródłowy do kodów bajtowych, więc możesz załadować swoje kody bajtowe bezpośrednio do Rubiego i wykonać. Bez sprawdzania gramatyki i kompilacji. To znacznie szybciej niż normalne procesy.

Jak wczytać bajt kod?

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

instruction_from_byte_code.eval
# => :shiva

Uwaga : Ta odpowiedź jest testowana tylko w MRI. Może działać lub nie w innych implementacjach Rubiego

 3
Author: illusionist,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-18 09:27:02