Imagine that a bucket is a new language, and you insert in it the thing that you want to have in it. What would those features be?
You can take some referential language and start with it, something like:
Javascript - add pointers, strongly typed, remove Array 'objects' to inherit the Object, remove hoisting, etc...
I think if languages are buckets, I'd be happy if water stopped spilling over due to lumpy rocks, I'd start refactoring out some of the rocks if you catch my drift ๐
Some changes are perhaps too big to even resemble the original langauge. Pointers in Javascript for example - that'd completely break safety guarantees, garbage collection...
In general I think languages do tend to turn into new ones to change major design choices:
But for some features and languages, things can still be changed. I have some features for WebAssembly, which is a language that's still young and incomplete:
Due to backward compatibility, I feel like most old languages start to fall behind mostly because of extra things they can do but shouldn't. Think nulls in Java, implicit type conversions in Javascript, probably half of C++...
Adding new capabilities that were lacking is usually easier, the main difficulty is keywords. Even Java added functional programming stuff like lambdas, kind of, and Fortran - of all languages - is still being expanded and updated with classes, coroutines, etc.
Perfection is achieved, not when there is nothing more to add, but when there is nothing left to take away.
This is probably one of the reasons why javascript is, let's say, the way it is. First, the foundations were laid in a great rush. And second, due to browsers, it's even harder to break backwards compatibility. (It's already hard though, look at Python 3).
Wei Lun
Software Engineer, Founder
Go - Generic!