Serializing Ruby code

  • Thread starter Victor \Zverok\ Shepelev
  • Start date
V

Victor \Zverok\ Shepelev

Hi all.

A bit of philosophy.

We have Marshal[1] to serializing Ruby's objects (and also YAML and so on).
AFAIK, Rails community even uses objects serialization for program's state
saving.
But, existing marshalling/serialization can serialize only data, not plain
code; this fact is restricting for their applications. For example,
Smalltalk-style "image" (entire program state, which can be loaded and
continued) is impossible.

But! We have a method for translating code-to-data - ParseTree[2], and we
even have method to translate back data-to-code (though a bit roundabout) -
ruby2ruby[3].

Had somebody thought about gathering all this to create full solution for
entire running program "saving" and "loading"? (Or, may be, somebody already
done this and I'm missing?)

It can be really cool. And it seems completely possible.

V.

1. http://www.ruby-doc.org/core/classes/Marshal.html
2. http://rubyforge.org/projects/parsetree
3. http://seattlerb.rubyforge.org/ruby2ruby/
 
C

Chris Pearl

If I understand your question correctly, what you're looking for is
serializable continuations.

I've checked this a while back, and the current stable Ruby branch
(1.8.x) does not have those, though it supports continuations
themselves. There are no plans to add serialization for continuations
in this branch, afaik. Perhaps it would be added in the future Ruby
implementations (at least in some of those ;-)) but here's where the
implementation developers chime in...

-Chris
 
E

Eric Hodel

A bit of philosophy.

We have Marshal[1] to serializing Ruby's objects (and also YAML and
so on).
AFAIK, Rails community even uses objects serialization for
program's state
saving.
But, existing marshalling/serialization can serialize only data,
not plain
code; this fact is restricting for their applications. For example,
Smalltalk-style "image" (entire program state, which can be loaded and
continued) is impossible.

But! We have a method for translating code-to-data - ParseTree[2],
and we
even have method to translate back data-to-code (though a bit
roundabout) -
ruby2ruby[3].

Had somebody thought about gathering all this to create full
solution for
entire running program "saving" and "loading"? (Or, may be,
somebody already
done this and I'm missing?)

You'd need more than that to get a full image to work (like recording
the ObjectSpace, the symbol table, globals, ...)

Also, ParseTree doesn't capture the closure so you can't copy the
full state of the interpreter:

$ cat closure.rb
def make_proc
x = 1
proc do |y| y + x end
end

p = make_proc

puts p.call(2)

require 'rubygems'
require 'ruby2ruby'

ruby = p.to_ruby

puts ruby

q = eval ruby

puts q.call(2)

$ ruby closure.rb
3
proc { |y|
(y + x)
}
(eval):2: undefined local variable or method `x' for main:Object
(NameError)
from closure.rb:19:in `call'
from closure.rb:19
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,768
Messages
2,569,574
Members
45,051
Latest member
CarleyMcCr

Latest Threads

Top