I tossed this message off to the Ruby-core list about a month ago, and
sent a follow-up email today. The basic idea is that if there were a
Kernel#run_script method or similar, all Ruby apps that want to launch
external scripts could do so in a platform and
implementation-independent way. In future versions of Ruby and in
JRuby today, that could mean launching the additional script within
the current process, but even now it would provide a simpler way to
launch external scripts.
Does anyone have an opinion on this?
---------- Forwarded message ----------
From: Charles O Nutter [email protected]
Date: Jan 25, 2006 8:50 AM
Subject: Launching Ruby scripts and the future of MVM
To: [email protected]
Hello again from the JRuby project!
It has come to our attention that there may need to be a standard way
to tell Ruby to launch a given script in a new interpreter engine.
Currently, it appears that many different approaches are used, ranging
from launching a separate process to forking and eval’ing a given
script. With the possibility of Ruby running in a multi-vm scenario
not far off (already possible today with JRuby and perhaps possible
soon in YARV) I believe it would be beneficial to have a way of
telling Ruby to “run this script in a new interpreter” and allow the
underlying ruby implementation to decide whether to launch a new
process or not. A potential method might be Kernel#run_script.
The issue we have with JRuby is that certain applications, Rake for
one, tend to want to launch subscripts in new Ruby interpreters. While
this is straightforward and relatively low-cost in the C Ruby world,
it incurs a severe performance and memory penalty in the JRuby world.
Launching a new “JRuby process” incurs the added pain of starting up a
new JVM process, not a trivial bit of work. This currently works as
expected, but is very slow and resource-intensive.
Perhaps it would be ideal if applications could call something like
Kernel#run_script, allowing the underlying Ruby implementation to
decide how to run that script. In today’s 1.8 Ruby implementation,
that may simply mean running an external process, either by using
popen or system. In implementations like JRuby or YARV, the run_script
call could be handled by launching a new Ruby VM within the same
process, avoiding the process-startup penalty. It would allow us to
run some of the most complicated Rake scripts all in a single JVM
process with JRuby, utilizing our MVM capability very effectively.
What thoughts do you have? I know 1.8 is supposed to be pretty well
settled, but it sure would help us if this idea were implemented
sooner rather than later, so third-party apps could start using a
platform and implementation-independent mechanism for launching Ruby
scripts.
- Charlie