Вы можете очень хорошо скомпилировать кусок кода Ruby в байт-код, используя интерпретатор (конечно, будет работать только Ruby MRI 1.9, поскольку это единственная реализация, использующая виртуальную машину YARV), и получить его Ruby-представление ish:
ruby-1.9.2-p180 :007 > require 'pp'
=> true
ruby-1.9.2-p180 :008 > pp RubyVM::InstructionSequence.compile('puts "hello world"').to_a
["YARVInstructionSequence/SimpleDataFormat",
1,
2,
1,
{:arg_size=>0, :local_size=>1, :stack_max=>2},
"<compiled>",
"<compiled>",
nil,
1,
:top,
[],
0,
[],
[1,
[:trace, 1],
[:putnil],
[:putstring, "hello world"],
[:send, :puts, 1, nil, 8, 0],
[:leave]]]
Это именно то, что делает HotRuby: он использует MRI в качестве синтаксического анализатора и транслятора AST-YARV, а затем просто выполняет код в JavaScript.
Вы можетеполучить байт-код для существующего метода с помощью метода RubyVM::InstructionSequence.disasm
.Он ожидает Proc
в качестве аргумента, поэтому сначала преобразуйте ваш метод в блок, используя object.method(:name).to_proc
.
Я не совсем уверен, что вы подразумеваете под «посмертным».В обработчике исключений?После того, как Ruby потерпел крах с SEGV?Последнее вряд ли возможно из-за неспособности поврежденного интерпретатора успешно выполнить любой код Ruby.Для этого вам нужно будет создать расширение C и делать много грязных хаков.Использование этого трюка в обработчике исключений вполне возможно, через.