It doesn't. Not any more than other languages anyway.
184 karma · joined April 29, 2015
It doesn't. Not any more than other languages anyway.
Now this language is actually used for large applications. It's still all gravy, the code bases are still uniform and easy to understand. People can easily be trained. More projects adopt this language, or even use it to build things from scratch. It gets applied to more domains. Years pass, and things that were unobservable in the beginning start to rear its head. They weren't non-existing, but they were so minuscule in this large landscape (remember - big adoption of this language) that it was unobservable from the bigger picture. Now what was a problem for a few developers seems to be a problem for many people. For a while, they solve this pain point by educating about certain patterns to look out for and solve. This works for a while, but after a while more pain points become apparent. And like for the initial pain point, it is just not a pain point for a small group of ignorable developers, but indeed a systemic one. There seems to be something wrong. We can't simply solve this pain point with education and applying patterns - we need abstractions. There is some murmur about this - the principal point about this language was to avoid over-abstracting things. We need to practice constraint. This works for a while, but after some time the concerned voices of the people advocating this kind of restraint gets drowned out. These limitations are just too much for people to deal with. So people start suggesting and inventing so-called abstractions. And pain points are relieved. After a while you have a whole cottage industry of these abstractions. And people's day to day life with this language and its associated code bases are happier and more productive. On the other hand, there is more to learn now, and things aren't straightforward any more. You can't simply look up a library and have flat, easy to read code. You also need to learn the associated abstractions. You also notice that the technologies associated with these abstractions are getting kind of big. They are starting to take on a life of their own. And it seems like they don't really fit. Some of them feel kind of shoe-horned in, as if there was no general slot for them already installed, it just had to be jammed in there.
Now, is this language good for large-scale development? The language is still easy to learn. Somehow. There was a bunch of additions up through the years to ease some pain points. Not all of jive as well with each other, or with the original language. But with some elbow grease, it is perfectly serviceable. Not to mention all the associated technology that cropped up to assist the language in its ascent - that is the hard part. So the language is not really easy to learn any more, with the associated things. But people know it, there are code bases to maintain and it has proven that it isn't useless.
Is the language good for large-scale development? Doesn't matter. It already won and is here to stay.
> 3. Women are more ambitious
Well okay.
The underprivileged Bloomberg readership.
The two languages seem to diverge when it comes to the fact that Walter Bright seems to like to write both expressive and high-performance code (meaning, at the same time). That kind of philosophy tends to lead to iterators, generators[2] etc. which Go seems to look at as superfluous -- just write a for loop, more or less.
[1] Write C++ for the particular software that they make, anyway.
[2] Or whatever the equivalent is in D.
Applicative is a pretty standard type class which are often used in introductory resources. It is not likely to be replaced by anything any time soon. If you think that it is a fashion then you should have an idea about what it can/is likely to be replaceable by. So, please do tell.
If anything, Applicative might be less controversial than Monad. I haven't really seen much complaints about the downsides of the usages of Applicative.
"Barbarian" - of course any fairly level-headed explanation of Haskell concepts gets regarded as elitist. It's practically a cliché at this point.
Lazy evaluation - this was pretty much the whole point of the language. A fashion? It permeates the language, being the default evaluation strategy after all. But it is controversial whether it is better than strict (eager?) evaluation. If opinions change about this it might be because someone unearths some way to get more of the benefits of lazy evaluation, and less of the space leaks. And potential discoveries are kind of the point of research languages like this.
On the other hand, it is of course tremendously useful in programming to look at some lines of code and be able to say "Oh, so this code this and that", then moving on. If you want more details, dive into that section more. You soar over the code to get an overview and dive down for more specifics when you need to. A music piece can be read (and played) from beginning to end, but that is less useful in programming. Maybe for a late evening with a bottle of wine when you want to appreciate the beauty of a code base that you really like, I guess.
The philosophy at play here is probably not code golf as much as it is about the principle of least power[1]. Applicative is strictly less powerful than Monad. So when reading Applicative code, there is less stuff to look out for -- it is great to be able to know what an expression can't do, when reading it.
Maybe the do-notation makes it look prettier, but I don't know if it makes it more readable. Maybe more superficially look like imperative code which makes one think Oh, I get this. But it might be a false sense of safety. In any case, I guess Applicative do notation can be used (at some point).
I doubt that there are nicer general purpose languages than languages like Ocaml for compiler stuff, and symbolic execution somewhat by extension. Maybe languages that have more powerful matching and maybe even term rewriting, but I don't know if they would be considered general purpose (at least fairly fringe).
It doesn't come down to it: it was about economics all along. All these philosophies -- polyglot, more monoglot, etc. -- have costs. You can choose to ignore it sometimes by staunchly recommending one approach over another in generic settings. But the underlying costs are still there.
Alternative, glib answer: because computing shouldn't be confined to the US, or I guess places like London in this case.
I don't think we needed an example in order to understand "speaks more than his native language".
But this "one" language would probably have the power to express its own EDSLs for different domains and problems (like Lisps). So in effect, maybe you could say it's many different languages in one. So why not just use many different programming languages instead of one extensible one...?
Because general purpose programming languages seem to end up feeling too monolithic when considering that they might only be used by you for that one thing. Consider two approaches: have one language that solves problems in domain A really well. Then you want to solve problems in domain B really well. But the first language is not suited for that. So you use a totally different language for that. Maybe it has its own interpreter/compiler/library and specification. Maybe you need to interoperate between these languages. What do you do? Inter-language communication seems to be in a sorry state, if the Unix philosophy of "strings anywhere" is the prevailing philosophy. I guess we're supposed to use Json now, perhaps? Corba is dead. I saw a thick old book about it where I work and didn't feel inspired.
Compare that to having a language where you can express domain B more clearly in the first language. It turns out that there was some friction and ceremony with expressing domain B in the first language, but being able to express this as as EDSL -- maybe by using something like macros -- gets you 90-100% of the benefits of using a totally new language. Additionally, there is less underlying complexity -- you have one language derived from the other using constructs from the original language. And ideally you can inspect and unfold this implementation; go through a few layers of macros, perhaps. Contrast this with having two wholly separate languages with their own runtimes, libraries and what have you.
This might be a philosophy of building layers of languages -- actually, probably more like a tree. Or maybe a DAG if you have several implementations that express the same DSL. Contrast this with several distinct implementations of monolithic languages, which probably have no knowledge of each other (languages tend to end up shallowly similar, but subtle in many many small ways; probably Turing Complete which makes analysis tricky or at least not straightforward, certainly not reliable...). But when looked at in isolation they look simple; hey this language is really good at expressing X. It doesn't have that many user-visible constructs. Simplicity! Only when you look at the bigger picture, you see how much effort and code that goes into implementing software that is subtly different, only to give the feeling of simplicity when looked at more in isolation from the whole overarching system.
Some people will look at you in horror if you suggest using a powerful and expressive language. A language that can effectively express a lot of 'languages'. They find things like operator overloading disgusting, because code should look uniform and it should be "obvious" what it is doing. Then they choose to involve 12 different programming languages on a project, because that is obviously good engineering practice. The right tool for the job! The fact that they have to learn and deal with so many languages is apparently trivial to them. The difference between the semantics and ecosystems of a dozen different programming languages is simpler then learning about and judiciously using operator overloading, I guess.
I am not trying to diminish the need for programming languages -- they seem incredibly hard to design, and the more I read about them the more I get convinced of that. There are ever more considerations that they can choose to care about, potentially at the expense of something else immediately next to it or maybe something far away. It doesn't seem like the ones who are designing them are close to converging on designs that express many of the problems that programming languages can/should care about. I look forward to seeing more language (designs) -- hopefully ambitious ones. :-)
tl:dr; I should learn a Lisp. Code truly is data, or it should be. But not even Lisp is able to do everything with sufficiently many macros, it seems.
So what? Most people aren't curing cancer, or doing anything more of value than their paycheck reflects. And maybe the value of our paycheck is really inflated, even. In the end we are just floating on a giant ~ball through space and maybe someday we'll have a cataclysmic event that undoes all of our social and scientific progress. Stop thinking that you have to be some special snowflake, relax, and maybe you'll find that you can find pleasure in the little, mundane stuff. In the end, they're all we really have.
Or maybe dynamic Lisp languages will stay the kings of metaprogramming. But it's still in the same spirit -- macros, which are static metaprogramming constructs.