Ответ 1
Вы можете очень хорошо скомпилировать кусок кода 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-to-YARV, а затем просто выполняет код в JavaScript.
Вы можете получить байт-код для существующего метода с помощью метода RubyVM::InstructionSequence.disasm
. Он ожидает Proc
в качестве аргумента, поэтому сначала преобразуйте свой метод в блок с помощью object.method(:name).to_proc
.
Я не совсем уверен, что вы подразумеваете под "посмертным". В обработчике исключений? После того, как Ruby разбился с SEGV? Последнее вряд ли возможно из-за неспособности поврежденного интерпретатора успешно запустить любой код Ruby. Вам нужно сделать расширение C для этого и сделать довольно много грязных хаков. Использование этого трюка в обработчике исключений вполне возможно, через.