General purpose programming languages' speed of light
tratt.net
tratt.net
Scala is a great example: the innovation of the language is not so much in new language features, but rather in its ingenious combination of so many powerful features into a single, coherent system. Of course, some may argue that Scala has too many features (I'm a bit terrified of it), but it's indisputable that putting all those pieces together in a way that works is tour de force of language design.
I mean, it seems that the person who wrote it spends a lot of time thinking about programming and much less time programming; that's where he ends up with meta-ideas that are interesting but also mostly wrong.
Languages are substantially different. You don't (and can't) understand every concept under the hood to drive the thing. You can't add and substract features, they're interdependent.
It may be an error to see programming languages as technologically similar to computer hardware. But there's no Moore's Law of programming languages. It's hard to say that there are widely accepted analogs 45nm and 90nm fabrication.
Instead, computer programming languages are like other languages. They are more or less appropriate for a particular task in a particular context. Clojure isn't objectively a more advanced LISP. However, it is more appropriate for concurrency. Particularly in a Java dominated context.
Clojure primarily seeks to solve a different set of problems than Common Lisp. The C Programming Language is tailored for a different set of problems than ALGOL 68 or Fortran. Perl a different set than C. And so it goes.
Languages are abandoned because they lack expressiveness relevant to the goals of the programmer not because a new language ships with 16GB and 5ghz.
I don't understand your objection.
You can't really count features and derive something meaningful from that. Every other new feature is a game changer. Or sometimes it is barely visible.
All the above are patently false.
-- Most languages in common use are NOT substantially different. Not just obvious things like Java/C#, or F#/Haskell/Ocaml/ML but even C# to Ruby or Objective-C to Javascript are not that different, much less fundamentally.
-- For most languages a lot of good programmers can and DO understand "every concept under the hood" (VM internals, runtime costs, etc).
-- And you sure CAN (and language designers do all the time) add and substract features. They add features from other languages and they remove some to create theirs. And then, when the reach version 2.0 of the language, they cherry pick and add some more features from other languages, or remove out-of-favor features.
When thinking 'static types', does everybody just think C/C++/Java? Is it upfront costs? My first ML program, I took half an hour to write a function that output all the words in a trie. It gets easier, and more interesting afterward, but I might have given up had it not been for a class. Are static types too rigid for prototyping? Scala, Haskell and OCaml have REPLs.
Some of the "experimental features of static type systems" like dependent types are really powerful; you can make some strong proofs about the logic of your program. I'd be willing to give up (or at least try going without) duck typing for that.
A lack of understanding. People get very upset when you say this, but I have yet to see a single person argue against static typing accurately. Every single argument (oh look, a bunch have been posted in reply to you even) I've seen has been based on exactly this fallacious reasoning:
>When thinking 'static types', does everybody just think C/C++/Java?
Yep. Including the people who write dynamically typed languages even:
Also, sometimes in Haskell it's so hard to write a function that mostly-works (because they type system sees your mistake but you don't) that you can't get enough of your half-baked idea down so that you can see it clearly enough to figure out how it's supposed to really work correctly
Also, I've seen plenty of programs that provably have no bugs, but still grow to exhaust all system memory or occasionally take several hours to return from a function call for no apparent reason. And those are a major pain to diagnose.
I think you mean programs that type checked, not programs that provably had no bugs.
Or, to put it another way: our existing type systems don't make code "provably correct", and when people say that it does (like the commenter above), they're trying to talk you into something.
That is what I am telling you.
>and when people say that it does (like the commenter above)
They said no such thing.
Well certainly soup. And nuts. And everything in between.
Plus washers and ball bearings and my son's head for haircuts. Solids, liquids and gasses need to implement the Bowlable interface. Just to be <type> safe, vacuums should probably implement Bowlable as well.
I've got some classes to write and inheritance to track. Then all that's left is to implement Microwavable, Edible, Spoonable, and Unhealthy. Then I can enjoy my Maruchan Ramen.
Bad things will happen if I put a can of Rustoleum in my Microwave and power it up on high for five minutes. So I'm not saying type safety doesn't matter. Just that it is not always better.
Compiling and running a possibly incorrect program that seems to work is more rewarding than trying to figure out how exactly it was that your compiler inferred a type different than you intended.
Yes, it is nice to be able to write proofs and have them checked mechanically. However, for nontrivial programs, even stating correctness (to a level of precision a proof checker can understand) is often very difficult. Once you've figured out how to do that, you still have to take the time to write the proof. There is also a cost associated with this capability even if you don't exercise it: dependent type systems (aside from things like Dependent ML, which restrict type indices to a much smaller language) tend not to play nicely with side effects like mutation, I/O, exceptions, nontermination, etc. So the proof system is not just something that's there for those times when you need it and fades away when you don't.
Technology comes in fits and starts. A lot of new things happened in the 50s and 60s, we are still trying to figure out ways to use and apply them. Just because someone thought about and prototyped something then doesn't mean it's not new when that feature goes mainstream (e.g. garbage collection in Java, channels for concurrency in Go, etc).
For a long time we couldn't break the sound barrier, which is a limit, but not the speed of light limit. Because progress is stalled now doesn't mean there will never be progress in the future.
The analogy between painting and programming languages has some precedent around the HN community. But the idea that contemporary painted images are more advanced than those on the walls of Lascaux is suspect because it is premised upon our acceptance of a belief that the ancient paintings were not well suited to their purpose.
It is more likely that the opposite is the case. Today, most paintings carry little significant meaning to their author's larger community. The odds that Salvador Dali's butcher was impacted by the armlessness of Venus de Milo are pretty low - never mind the $86 clown on steel collage Mission Thrift Store.
Art and programming languages have evolved. But that evolution is Darwinian not teleological. High-level languages are better adapted to the humans who write them but not the machines which run them.
Have you tried Django? It provides some rather large building blocks that fit together nicely and reasonable abstraction for constructing your own.
Even to do this in the first place will always require a bare minimum understanding of the language of logic; basic control flow statements, variables and so on.
This is why I feel things like Bret Victor's idea of the 'MathKiller' (which as I understand the idea, is his general term for a hypothetical universally-intuitive computing environment which can model anything) are goals which we can only ever approach asymptotically - there will always be some uncharted waters where the only option available to those who want to explore further is simply to straight up write some code.
I guess the point I'm trying to make is that I feel improving the sophistication of the programming languages we use or changing the core paradigms upon which they are based will not help the situation; improving the sophistication of the tools we use to write them with will.
Note that I'm not by any means accusing the original author of plagiarism or of trying to pull off a stunt. Convergent evolution makes perfect sense. Although comp sci languages are a bit more rigid than other human languages, trying to express creative / complicated stuff in a human created language is an old, heavily discussed problem, even if the original author doesn't know it. Does this go all the way back to Plato? I can't remember its just too early in the morning.
The bright side is "we" as a species have been churning out new lit more or less continuously for a couple millenia, so even if lit production dies off at some point in the future (and I don't think it will) that means that in computer languages we "only" have a couple more millenia of productive programming left.
Since the current high-level languages are so extensible, the new paradigm seems to be moving beyond programming languages to a higher level of abstraction based on frameworks and DSLs. We're not just "writing code," we're always writing code that writes code (that writes code, and so on, of course, until it's a stream of 0's and 1's.). We do this because working at a higher level of abstraction is usually more productive. The recent crop of programming frameworks are just another layer on top of this. Next I guess we will have some sort of meta-frameworks on top of those. So the specific language choice will only matter insofar as it's a part of the framework stack.
On seconds thoughts - that sounds a bit too much like a Visual Studio wizard/template.
Also, if you have relatively easy types and building blocks, there are only a few functions of that type that are also simple.
Seldom have I encountered a book that made me want to throw it at the wall. Wrong, wrong, wrong, but everybody should read it.
There are things like this, for example, scaffolding in rails.
This works because the code I type still expresses exactly what I want. The thing the computer can't do for me is specify exactly what I want.
Are you looking for more of the same, or some "guess what I want"?
And I still think what Simonyi and crew are doing over at http://www.intentsoft.com/ is the future of development, even if their specific products never make it into the mainstream
I think we are just now getting beyond the "low-hanging fruit" era of programming languages.
I vote for the tooling option or, to be more precise, for a different combination of tooling and features.
"The plain truth about programming languages is that while there have been many small gains in the last 20 years, there have been no major advances"
There have been many major advances. The fact that they were not included in java does not mean they do not exist.
>There have been no new paradigms
Arguably there have only ever been two paradigms: imperative and functional (object oriented and procedural simply being minor variations of the imperative paradigm). It is not reasonable to expect entirely new paradigms to be discovered on anything other than an incredibly rare basis.
>I'm not even aware of major new language features
The first thing this should do is trigger your "I should research new language features" instinct, not your "I should assume there are none" instinct.
>beyond some aspects of static type systems
So, he does know some, but chooses to ignore them because why exactly?
>The core of virtually every extant programming language is largely similar.
No. And it is entirely possible for new things to replace old things, programming languages are not required to take the C++ approach of accumulating every possible feature that has ever existed.
>Some of the things Haskell and Scala's type systems can express are astonishing; but I have also seen each type system baffle world-renowned experts
That is an awfully bold statement to just pull out of nowhere with nothing to back it up. Who are these experts, and what baffled them exactly? Haskell has been a hotbed of programming language research in the last decade, with a large number of advances being made and being put into actual use, then more advancements being built on top of those. Dismissing the entire concept of type systems based on an unnamed "expert" who was somehow "baffled" by some unmentioned aspect of the language is insane.
>Verification techniques and tools have made major advances
Yeah, like those crazy type system things you just dismissed as being unconvincing, oversold, and baffling to experts. Go learn agda and then tell me nothing new has happened in 20 years.
The author is a programming language academic. See: http://tratt.net/laurie/research/pubs/
My initial guess as to why was that a lot of type systems research seems to be more focused on systems that are only really accessible to other researchers (i.e. not usable by rank-and-file programmers).
Except that quite a bit has gone on in haskell, and is in practical real world use right now.