For example, you might say;
Lua: SOL (our data language) doesn't have enough programming constructs.
which is historically accurate, but in a modern context you might also say:
Lua: Game engines and other apps need a really easy to integrate, reusable embeddable scripting language library.
which is a vastly different problem that lua didn't necessarily set out to solve.
The experience that motivates TCL: you'll be working on your compiled codebase and think, "damn - it should be easier to glue blocks of this together."
For perl - you'll be working in shell, and then move to awk, and find yourself using the function structures and ignoring the pattern matching. And you'll think, "damn, I wish this had more powerful programming structures in it".
In the middle you get ruby and lua, which are very similar, but came from opposites.
In an earlier draft of this post I wrote python and lua above, but then I checked some history. Interesting - it's kind of an accident that python evolution to challenge the shell/awk/perl scripting space. ABC was created from academic motivations. Python 1 didn't quite know what it wanted to be. If you joined python at 1.4 and stayed through the release of 2.0, it's easy to imagine that it would have evolved with a more functional emphasis than it did. By 2.2 (new classes) it had solidified as a objecty response to perl5.
This article came up about a year ago, so I'm just reusing my comment :P. Now I'd also add:
Go: C is the prefect language, except it's too low-level.
Ermine: Scala is not functional (enough).
I feel go is more like "It would be nice to have a Python-like C that would also be a C-like Python"
Go: callback hell is hard to manage, but threads are too expensive.
So yes, +. is just an ocaml thing. Not sure about caml.
I'd noticed that all programming languages were tree-oriented. You kind of group logic into branches. This sounds obvious, but work with me here.
This reminded me of the early days of yahoo: it was a big directory (a tree structure). Then we had this revolution where everything became about loose data that was tagged. You'd have tagged data, and then search on the tags. This tag structure was better for scale than the tree structures we'd brought with us from personal computing problems.
I thought, "I wonder if you could build a tag-based programming language". And then I realised - that's what prolog is.
If we're going for why Python appealed to its early adopters as opposed to the actual motivations for creating it in the first place, something more like 'other languages are all hard to read' would be fair. You could even reintroduce the Perl rivalry in the form 'Perl is too hard to read', if you insist. But it really wasn't Perl's kludgeyness per-se.
Python is certainly not a reaction to Perl, I'm not sure Guido was aware of it when Python was born (they are close to the same age, actually).
Agreed. This stems from a neat idea, but I think it's an after the fact rationalization (except for a few that are provably correct, like J). For example, C++ didn't stem from a direct frustration with C:
"Stroustrup found that Simula had features that were very helpful for large software development, but the language was too slow for practical use, while BCPL was fast but too low-level to be suitable for large software development."
This list is cute, and provides good "taglines" for the languages, but I think it'd be met with a larger grain of salt if it hadn't been written by PG. :)
SQL: Tuple relational calculus is too low level?
Julia: Hadoop is a kludge for data science?
Clojure: We need Lisp for the JVM?
Go: C/C++ are kludges for systems programming?
(That's an attempt at summarizing Rob Pike and fitting it into Graham's framework, not necessarily what I believe, although I believe something close).
SQL: "humans should just say what they want, not how to get it"
Octave is almost certainly "MATLAB is expensive, and non-unixy"
Julia is "octave is slow and poorly designed"
(N.B., I think Scala is a great language. But it is certainly one that has never seen a feature that it didn't like...)
Clojure: lisp promotes mutability too much.
- jvm needs a good lisp
- lisp needs libraries and a little cleaner keywords
Scala : functional programming without leaving the JVM
Because enterprises have spent a decade or so building up JVM expertise in the form of Java.
There is also an enhanced version that brought it a little further up to date. Problem is, people keep insisting that it must be wrong, because X doesn't descend from Y, etc. That's why the text at the top tries to emphasise that this is a graph of "developed because of a perceived short-coming."
Added in edit: Now submitted as a separate link for more specific discussion.
Icon: Generators are cool.
FORTH: Omit needless features! Omit needless features! Omit needless features!
PHP (version 0): C is not an HTML templating language; Perl and Python are too heavyweight as embedded templating languages, given that all of our logic is in C anyway.
PHP (version N): PHP works fine, except it's missing function F.
...and so on, ad infinitum.
PHP doesn't really fit the paradigm of the original essay. It's hard to even pretend that PHP was deliberately designed as a reaction to other existing languages. Rather, PHP evolved. Hence, explanations of PHP tend to be circular: "PHP exists because PHP's design, documentation, and community were tightly focused on web publishing", or "PHP exists because it's backwards-compatible with PHP".
APL: Programming should be more like math.
APL: Other languages are verbose and irregular.
Go: Java is too bloated.
I'd happily agree to Self rather than Scheme but I can't edit now :)
Forth: all the other languages were written by somebody else.
As they say: if you've seen one version of Forth, you've seen... one version of Forth. And also: standards are a good thing, everyone should have one!
Java as essentially Lisp's bastard child is I think undermentioned in language history.
"We were not out to win over the Lisp programmers; we were after the C++ programmers. We managed to drag a lot of them about halfway to Lisp."
- Guy Steele, Java spec co-author
Reasonably original-ish source: http://people.csail.mit.edu/gregs/ll1-discuss-archive-html/m....
Relative to C++, Java is actually a lot like Lisp. Don't forget that objects are a poor man's closures (and vice versa).
Dragging out that quote doesn't really answer the question. What about Java makes it like Lisp? The ability to (painfully) implement closures with objects and vice-versa? That's also shared with every other OO language, includes ones that would not normally be considered Lisp-influenced.
Anyway, the context is explicitly Java vs C++, not Smalltalk or Ruby or Python. I imagine if Smalltalk were the dominant platform this would've turned out differently. So let's do a compare and contrast.
Java has the following properties: methods are all virtual; single inheritance; inheritance isn't public/private; final instead of const; GC and references w/o memory alloc or pointers; a package system exists; generics instead of templates; no operator overloading. And Java 6 does have a limited form of closures, believe it or not-- you can access a variable declared as final with an anonymous inner class.
None of that is true of C++, and just about all of those substantially increase the complexity of the language. I don't even like Java, mind you, but after reading Effective C++ the influence of higher-level languages like Lisp was pretty obvious to me, even if Lisp might not have been the only or even primary influence on Java.
Actually, looking at http://en.wikipedia.org/wiki/History_of_programming_language... it turns out a lot of languages with the properties I'm describing came before Java, so while Java clearly descends from Lisp in a lot of ways, the connection isn't as direct as I was imagining.
1) Garbage collection
2) Dynamic typing
3) No distinction between primitive values and general values - a value can be used everywhere
4) Lexical closures and higher-order functions
5) A hygienic macro system
6) First-class continuations
7) Space safety guarantees for tail calls ('tail call optimization')
8) A numeric tower
9) S-expression syntax
10) A focus on cons cells and lists as primitive data structures
There's probably something I'm missing, but the only feature that Java shares is the first.
In fact, his classic talk "Growing a Language" is among other things a very polite and implicit, but devastating critique of the design of Java.
Java: not only those MIT/Stanford smart-asses can code.
Java EE: the way to avoid a drop-out from the field.
PHP: getting Perl and CGI to work on my web server is too damn hard.
PHP: I can never remember the difference between %, @ and $.
LiveScript: I'd rather be writing Perl-flavored Ruby, with a Haskell syntax. ( http://livescript.org/ )
In fact it would make more sense reversed.
PHP: Perl is a kludge.
Because that's what PHP mostly replaced - Perl.
Python: Is cute to prefix everything with "py"
Javscript: Haha not as cool as suffix it with "js"
Ruby: Pff i have the coolest nickname and it is "Rails"
Clojure: Oh please, you aren't as classy as "La Clojure"
C: The power of soul and possibility control!
Go:tta Catch 'Em All!