Hi Manuel,
I must say that on a conceptual point of view I like the approach,
keeping one's libraries up to date is the only way to go, however I am
afraid that you are glossing over certain details here:
- you assume that the source code is available, this is a problem if I
am using a 3rd party library for which I only get the binary and THEY
have not migrated yet; how can I use library X (released in 0.9 and
0.10) and library Y (released in 0.11 and 0.12) in the same project ?
Smaller milestones make it a smoother process to upgrade at the
individual level but larger milestones help multiple
people/corporations coordinate.
- you assume that I can actually upgrade; I work at a large software
company, with over 5,000 employees now, and this apply a *large*
source code base. A migration entails an extensive test phase of the
target software/version following by a careful migration of a few
pilot products simply because migrating costs a lot and migrating to a
"flawed" version just to rollback the migration is a cost sink. As a
result though, this creates inertia. Internally we are *always* in the
middle of several migrations (compiler, 3rd party libraries, in-house
middleware, ...) and the larger ones take years. Because of this, once
again we need some coordination: we just cannot afford to migrate
every 6 months (not enough testing time). This means that while it
would not prevent Rust from migrating every 6 months, we would still
be expecting fixes to previous releases for a year or two.
The former means that 6 months might a little *too* fast pace for
industrial projects, the latter means that on top of defining releases
schedule the Rust team will also have to provide a clear plan for
support of "older" versions (how long, what kind of bugs, ...) and the
number of branches impacted may grow quickly: 6 months releases + 2
years support means at least 4 branches, maybe 5 if we count the one
being developed (and 2 years is nothing fancy, as support goes).
-- Matthieu
Ok this makes sense, a release cycle of 2 years + 2 years support for
example might be better once the language is more mature. Until then i
think the suggested approach with the version specified in the source
code and an assisted upgrade path would be helpful to keep the libraries
updated. Also for these larger, less frequent updates such helpers make
the cost of updating smaller.
Thanks for your answer, i was almost sure that it won't be that simple.
Manuel
On Sun, Nov 24, 2013 at 11:49 AM, Manuel <[email protected]
<mailto:[email protected]>> wrote:
I had the following idea to approach language evolution:
Problem:
Languages try to be backward compatible by stabilizing, and only
slowly deprecating old features. This results in a language which
does not evolve. Some different takes about this:
C++: adds new features but does not fix problems, and often does
not remove obsolete features resulting in, well, C++.
Python: Minor versions which add new features, big version jump
from 2 to 3 to make backward incompatible changes. The resulting
incompatibility was a big problem, almost 5 years after the
release of 3.0 (December 3rd, 2008) people are still using 2.x.
Rust seems to follow a similar approach, devs are already defering
features to 2.0 to stabilize.
Other languages simply do not evolve at all and are replaced.
My idea to improve this situation would be to add a version tag in
every main crate, something like "#ver 0.10". For each version
jump the compiler would fix the code automatically, and convert it
to the current language specification. When the library/code is
multiple versions behind the conversions could be applied
successively. This can be done in a lot of cases, see python 2to3
script and even Google did this for go with the tool gofix during
development. With this change not updated libraries would still be
usable in rust. To simplify updating libraries the compiler could,
on demand, print out a report of problematic parts and propose
fixes. Some things can not be fixed with an automatic approach,
for these cases a classic deprecation mechanism or something else
could still be used.
Advantages:
Kind of backward compatibility to old code bases.
Rust can evolve and stay streamlined at the same time.
Compiler does not have to deal with deprecation mechanism, because
you can remove, and change things instantly.
When this would be in place i think it would be best to release
incompatible updates often, but with only a few changes. Every six
months for example.
What do you think about this?
Manuel
_______________________________________________
Rust-dev mailing list
[email protected] <mailto:[email protected]>
https://mail.mozilla.org/listinfo/rust-dev
_______________________________________________
Rust-dev mailing list
[email protected]
https://mail.mozilla.org/listinfo/rust-dev