Why introduce this whole new concept of epochs? Seems to me you could achieve much of the same by using new major versions, and having
rustc commit to supporting code written for previous major versions of the language as well.
Basically, you could almost take the current RFC and replace every occurrence of epoch with major version. For example, the "Basic Idea" section from the RFC becomes:
A major version represents a multi-year accumulation of features, improvements, and
idiom shifts for Rust. It covers the language, core libraries, core tooling,
and core documentation.
Each crate declares a major version in its
Cargo.toml (or, if not, is assumed
to have major version 1):
major_version = "2". Thus, new
major versions are opt in, and the dependencies of a crate may use older or newer
major versions than the crate itself.
To be crystal clear: Rust compilers are expected to support multiple major versions, and
a crate dependency graph may involve several different major versions
simultaneously. Thus, major versions do not split the ecosystem nor do they break existing code.
So yes, major versions would involve backwards incompatible changes but the tooling would be designed to deal with this, and as a result nothing would break.