> A non-trivial companion project like that seems great for naturally guiding a language!
It's definitely an interesting aspect. For most languages, the only substantial project during their early life is their own compiler. There is an intriguing theory (posted on HN a few weeks back?) that this results in languages that are optimised for writing compilers, at the expense of writing other things.
Are there other examples of languages that had this kind of companion project in their early life? Did UNIX do this for C? To what extent did Rails do it for Ruby? Is there something inside JetBrains that does it for Kotlin, or inside JBoss that does it for Ceylon?
One that comes to mind is ML, which was originally developed as a domain-specific language for writing proof tactics in the LCF theorem prover, and was only later broken out into a standalone programming language.
I can't think of one canonical companion project for them, but early Lisp, COBOL, and FORTRAN were also pretty driven by external application concerns, in AI, business logic, and numerical simulation, respectively.
The original McCarthy LISP started even more abstract than ML: it was intended as a logical thought exercise, and was only accidentally a programming language at all.
COBOL (and Ada) were standards-first languages. The industry-driven standards committees designed the languages first, and it was not until afterwards that there were working implementations, much less working programs. Industry experience guided them in later releases, but v1.0 (which Rust is still working towards) were even more ivory-tower than languages whose only program is their own compiler.
Totally - the more interesting question is how much Rails has driven all the improvements (mostly to performance, but also to the standard library and packaging) since roundabout version 1.8.
Some "examples" (they are really just weak speculation) for how I think Rails may have contributed to the three specific areas I mentioned:
- Packaging: This is probably where I think Rails contributed most - both rubygems.org and Bundler were created to make it easier to manage the creation and use of lots of large numbers of dependencies, which Rails projects tend to have. Also rvm and its descendants were created to handle Rails app deployments, and are especially useful for situations where you're switching between lots of projects with different ruby version and library dependencies, which is typical in Rails client work.
- Standard library: The `Object#tap` method came from ActiveSupport. Also, ActiveSupport had an OrderedHash, and now all hashes are ordered. I think there are some other examples of that sort of thing.
- Performance: I really don't know what has driven performance improvements have been made, but it doesn't seem outlandish to think that backlash against poor CPU and (especially) memory usage characteristics of Rails applications was a contributor.
I think you're taking a very Railscentrc view of Ruby.
rubygems the tool existed before Rails, as did multiple gem hosting mirrors. I believe rubygems.org sprang up because rubyforge.org was falling out of favor. And Bundler is not part of Ruby.
It's possible Wayne Seguin created rvm due Rails but I never got that impression from his talks (but it's been some time).
Pretty sure MenTaLguY created "tap"; Rails had "returning" (though they are similar and perhaps the usage in Rails made it popular enough to warrant inclusion in core).
Certainly if any library gets a lot of use then that will influence aspects of the base language, but matz and ko1 seem pretty deliberate about what gets added.
Heh, I just thought it was an interesting question to speculate about - I really have no idea to what extent Rails has driven Ruby recently.
You're probably right about `.tap`, and I can't think of any other standard library stuff, so my speculation there is seeming pretty weak.
I didn't suggest that Rails invented rubygems and gem hosts, I suggested that rubygems.org and bundler were major improvements to the ruby packaging ecosystem that were driven by Rails. I'm not sure you actually disagreed with that point...
I suggested that rubygems.org and bundler were major improvements to the ruby packaging ecosystem that were driven by Rails. I'm not sure you actually disagreed with that point...
Rubygems.org was not driven by Rails. It doesn't offer much beyond what rubyforge was doing. Less, actually. RF was for code hosting, docs, and gem serving. Once people started moving to github RF lost favor. When Github decided to stop serving gems rubygems.org came about to fill the gap. It lists and serves gesm; code and docs live elsewhere.
Bundler, sure, came form the Rails community to apparently solve a problem for that community. It's not for everyone, though.
I don't use it (doesn't make life any better for me), but then I don't use Rails either.
There's lots that goes in Ruby that has nothing to do with Rails and the conflation of Rails and Ruby is a detriment to different Ruby communities out there.
I still don't think that you actually disagree that the github/rubygems.org setup is an improvement over the rubyforge setup. Assuming that, I agree that the extent to which Rails had anything to do with that is debatable (and unanswerable, in fact); there was definitely an explosion of gems hosted on github that needed a new home, and I think the popularity of Rails had something to do with that explosion, but it certainly may have happened anyway.
I think lots of people find Bundler to be an improvement over straight rubygems outside of Rails projects (even if you don't), which I think fits the criteria of "an improvement driven by Rails".
I think your last sentence is the real argument you're trying to make here, and I agree with it wholeheartedly - it's incredibly frustrating that so many people seem to think Ruby is only good or useful because of Rails. I'm not one of those people!
It's definitely an interesting aspect. For most languages, the only substantial project during their early life is their own compiler. There is an intriguing theory (posted on HN a few weeks back?) that this results in languages that are optimised for writing compilers, at the expense of writing other things.
Are there other examples of languages that had this kind of companion project in their early life? Did UNIX do this for C? To what extent did Rails do it for Ruby? Is there something inside JetBrains that does it for Kotlin, or inside JBoss that does it for Ceylon?