Your point about std/core is well taken and basically convinces me that my idea is not good. It would definitely still be nice if there were a way to "quarantine" the original runtime, but perhaps just preserving the old definitions for a time is the best we can do.

If nothing else, we could make this a bit more automatic by having the runtime functions "namespaced" with some sort of prefix, like "rust4_" or what have you. Then when we make backwards incompatible changes, we literally copy the entire runtime into a new subdirectory with a new prefix ("rust5_"). We make changes liberally to rust5_ and delete rust4_ once the new snapshot is in place. (In the compiler this prefix would be automatically added, of course)

Such a system would also allow us to keep backwards compatibility with binaries generated by older versions of the compiler, once Rust becomes widely used and hugely popular. It's certainly not the smartest way to handle that particular situation, though, as it would also lead to a maintenance nightmare as there would be many versions of the same code in the codebase.

That said, we do probably want to start thinking about how we will version the runtime for backwards compatibility, and maybe we can use whatever scheme we come up with to ease the bootstrapping pain as well.


Niko

On 12/14/11 8:34 PM, Brian Anderson wrote:

----- Original Message -----
From: "Niko Matsakis"<[email protected]>
To: [email protected]
Sent: Wednesday, December 14, 2011 7:00:33 PM
Subject: [rust-dev] runtime libraries and stage1
So, if I am not mistaken, we currently execute the stage1 compiler
using
the runtime sources that we compile out of the user's directory. As
the
stage1 binary is built using the snapshot, this doesn't seem quite
right: we ought to be executing it using the snapshot runtime. The
stage2 and stage3 binaries, then, ought to execute using the runtime
from the user's directory.
With Rust having to bootstrap itself there will always be some situations that 
are difficult to make incompatible changes. The current arrangement is 
definitely the best we've had so far (in the past things have been 
occassionally truly frustrating), so I'm ambivalent about this. And I like that 
the current snapshot only requires the bare minimum of host artifacts, no 
target artifacts.

With this change it will be easy to modify upcalls. On the other hand, any time std 
or core need to modify a runtime interface it will require creating temporary 
runtime methods, snapshotting, etc. So maybe we also snapshot core&  std for 
each target. Now you promote the stage0 target snapshots to stage1. At this point 
we've reproduced the existing stage0 problems, but are calling them stage1.

Intrinsics and libmorestack have similar dependencies on the runtime as std and 
core, though they change rarely.

I'm totally fine with trying, but I don't think there's anything we can do that 
will be definitively 'right'.

-Brian

_______________________________________________
Rust-dev mailing list
[email protected]
https://mail.mozilla.org/listinfo/rust-dev

Reply via email to