27 ms·
Advanced Programming Languages (2009)
- marceloabsousa 6y ago"If, on the other hand, you're interested in enlightenment, academic research or a start-up, the criterion by which you should choose your next language is not employability, but expressiveness." There is a big difference between enlightenment, academic research and a start-up. For both academic research and start-ups, employability is a very important component: - Doing academic research on "non-employable" languages decreases the impact of your research and your own employability; - In a start-up, you want to pick a language where you can be productive with your team members, with an healthy community, and where you won't have hiring problems because you're using an "advanced" programming language.
- TomMarius 6y ago> - Doing academic research on "non-employable" languages decreases the impact of your research and your own employability That is not a metric for choice of language for academic research at all. The academic research itself is a job, paid with public money, and you better not hinder it with your career plans. Most computer science research is not on languages itself, so you need a language expressive enough to allow you study whatever computer science concept you need to study; it's mostly C and Haskell around me, but I can't imagine my friends going into embedded C development - the C they write is very different, as are the practices.
- alexilliamson 6y agoAll the economists working in Stata would like to talk to you about their employability
- TomMarius 6y agoI am not sure what economists at a commercial firm have to do with computer scientists doing academical research.
- marceloabsousa 6y agoI was referring to academic research in software engineering or PL related areas. I think your view of academic research is nice but perhaps a bit naive. Academic research in most countries is filled with pressure from private money to achieve valuable outputs to feed the private sector.
- TomMarius 6y agoHuh, that's not the reality around me, in CZ/SK/DE/AT/PL in EU.
- newen 6y agoIn US universities in machine learning fields, a lot of labs work with private companies or do interships during summer at private companies and the grad students eventually graduate and get a job at the private company. Software engineering research might be similar but not sure.
- DonaldPShimoda 6y ago> Academic research in most countries is filled with pressure from private money to achieve valuable outputs to feed the private sector. This is not my experience working in PL research, personally. Mostly government grants here (US) that are either wholly research-oriented ("Build a cool thing because it improves the research community") or government-oriented ("Develop this technique because it will provide us with better (cybernetic) defenses). Admittedly I'm pretty new, but the funding does not seem generally to come from or be focused on developments for the private sector. I imagine it would be different in compilers, though, for example. That's certainly an area that the private sector has a more vested interest in, due to direct applicability.
- neutronicus 6y agoThere are some groups with large code-bases that will want "employable language" experience (mine was one), but, at least in my field, outside of the groups with big simulation packages used by other groups, the job description is mostly bodging out a nice-looking .eps file and maybe some favorable-looking benchmark numbers any way you feel like.
- andybak 6y agoThis article might need a date added. It mentions Ruby and Perl as "hot right now"...
- melling 6y agoI’m making an effort to learn Scala. It’s enough like Java that I can write as I would traditionally so I quickly wrote a Word Search puzzle generator. Next I’m going to try and write a second version in a more functional way. Then a third... First version: https://github.com/melling/WordSearchScala/blob/master/WordSearch.sc https://github.com/melling/WordSearchScala/blob/master/WordS...
- quelltext 6y ago> it is possible to write an amb macro that "chooses" the right argument to make a subsequent assert statement be true. I'm not too familiar with Scheme's macro feature but how would one go about that? I was under the impression with macros you get to define what ever syntax is part if the call, but here in order to achieve what the author mentions the macro would need to be able to look at surrounding code, to look ahead for the assert. How is this possible? Is he maybe talking of a compiler plugin or a macro (not shown) that encloses the entire expression, e.g. `(make-assert-true-macro (let ...{the code snippet}... ))`?
- Xophmeister 6y agoI'm just thinking out aloud, so I'm probably -- if not completely wrong -- at best sketchy on details! That being said, `amb` could be a function/macro that uses a continuation in such a way that, when a failure is encountered (however that may be defined), it can backtrace and try with the next value. By using continuations with some encapsulation of the call stack, it doesn't need to envelope the surrounding code and can just "rewind".
- rscho 6y agoSicp, the ultimate. https://mitpress.mit.edu/sites/default/files/sicp/full-text/sicp/book/node91.html https://mitpress.mit.edu/sites/default/files/sicp/full-text/...
- ekidd 6y agoYou can implement 'amb' using either continuations or monads. Back in 2005, I wrote a very short Ruby version of 'amb' using continuations: http://www.randomhacks.net/2005/10/11/amb-operator/ http://www.randomhacks.net/2005/10/11/amb-operator/ This approach works if your code contains no side effects, because it involves backtracking and restarting the computation as needed. But continuations are a heavyweight feature that place significant constraints on language implementation, so few languages support them. You can also implement 'amb' using monads: http://www.randomhacks.net/2007/03/12/monads-in-15-minutes/ http://www.randomhacks.net/2007/03/12/monads-in-15-minutes/ (Yes, this is yet another monad tutorial. Sorry.) This benefits from a "do notation" syntax, which could be implemented using macros.
- goto11 6y agoEvery developers should know at least two languages (more is of course better, but two is the minimum for a professional). The optimal way to select: (1) Learn the language which is most prominent or employable in your preferred industry (e.g. Java for enterprises, Python for science, JavaScript for frontend). (2) Learn the language most different to the first, regardless of its popularity and employability. Eg. Scheme if you know Java, Haskell if you know Python, Assembler if you know JavaScript. (There will probably be some disagreement about which languages are to most different to each other, but you get my point.)
- KMag 6y agoI broadly agree with you here. I believe what you're saying is that once you're economically productive in your first language, you get the most bang out of your second language by picking a second language that encourages concepts and idioms not encouraged by your first language. In this way, your second language is really there to improve the way you think about your first language. However, I would word (2) a bit differently, otherwise tons of people will be learning INTERCAL and BrainFuck. For a second language, consider only languages that are at least popular enough to have good learning resources. (This is a pretty low bar... there are probably hundreds of such languages.) Look at which concepts and idioms are encouraged by each language, ignore those concepts and idioms encouraged by your first language, and try and score the usefulness of the remaining concepts and idioms. Do a bit of research reading up on the pros/cons of the idioms and concepts to help you score them. The goal here is to pick up concepts and idioms by learning your second language, which will then diversify the way you think about your first language. I would absolutely look at the machine code generated by one of your languages (or bytecode, if none of your languages compile to native code or have a JIT that can dump out assembly) to understand what's going on, but I wouldn't suggest learning to write assembler as one of your two first languages. Most of the usefulness of assembler can be gained from learning to read it.
- Random_ernest 6y agoA good dogma I think fits roughly in the same category as your opinion is a quote from Alan Perlis: “A language that doesn't affect the way you think about programming is not worth knowing.”
- codesections 6y ago2009 (The article is undated but was present on the Internet Archive in 2009, https://web.archive.org/web/20090106175608/http://matt.might.net/articles/best-programming-languages/ https://web.archive.org/web/20090106175608/http://matt.might...)
- bencollier49 6y agoWas going to say, the recommendations seem rather dated.
- AnimalMuppet 6y agoWhat would you recommend currently?
- jerf 6y agoIn the spirit as written (i.e., not necessarily my personal from-scratch list), drop Perl and Ruby [1], add Javascript (the language itself; not necessarily any specific framework). Possibly add Rust to the list of currently-somewhat-exotic languages... depends on how the author feels, it doesn't 100% fit but it's not completely foreign either. (If you squint hard enough, it as arguably the closest current entrant in the "Haskell, but practical to actually use" contest... note I'm not saying it is the Platonic ideal of such things, but the closest currently existing thing.) Go is debatably getting into the C++/Java/C# set. I'd also add a note that you don't need to deliberately learn all of them; one from a given set is enough, pick up any specific one you may need later on demand. Possible exception for C++ which is so funky that I'm not sure you can just "pick it up", but it's been completely possibly to build careers in the industry without ever using it. I'm 23 years in and still yet to touch it professionally. [1] Neither may be "dead" but at this point I'd have a hard time recommending either to a young person looking to get started. Python and Javascript are both clearly better choices for that case in 2020; if you do encounter a Perl or Ruby codebase you'll be able to pivot just fine from a strong grounding in Python or JS.
- rictic 6y ago
- krebs_liebhaber 6y ago> I don't do a lot of artificial intelligence, natural-language processing or machine-learning research, but if I did, Haskell would be my first pick there too. This is definitely a dated article, since the obvious choice today would be Python, but I have to wonder: why aren't the "more expressive" (which in this post seems to be a synonym for "functional") languages used in these fields? I don't have much experience with ML languages, but it seems to me that something like Elixir (where the whole language is centered around pipes, parallelization, and operating on data) would be ideal for data science with a performant native library to back it up.
- nkozyra 6y ago> why aren't the "more expressive" (which in this post seems to be a synonym for "functional") languages used in these fields The real answer is probably inertia, but ... I think ultimately there isn't a ton of actual "programming" happening in ML, more implementation. People like Python. It's simple, it's clean, it's elegant and it's performant when it needs to be. I'm sure a lot of people who have thought "man why don't I just re-write this in [language]?" stopped short because they soon asked themselves "wait, why?" Most of your work is on either side of the algorithm (data - [ml] - analysis).
- krebs_liebhaber 6y agoFunctional languages are pretty good for the cleaning and analysis process as well. This blogpost in particular blew my mind: http://evelinag.com/blog/2015/11-18-f-tackles-james-bond/ http://evelinag.com/blog/2015/11-18-f-tackles-james-bond/
- nkozyra 6y agoOh I think functional languages would be great for a lot of this, my point is the middle bit ends up being such an inconsequential part of the process that people end up not bothering and just using whatever's out there.
- platinumrad 6y ago
- zerr 6y agoRust is an advanced language that might go mainstream.
- krebs_liebhaber 6y agoI wouldn't call Rust an advanced language. It has some functional-inspired features (everything is an expression, ADTs, composition/pipes with iterators), but the language's raison d'etre is zero-cost abstractions, and many of the features of Haskell and the like require a GC and costly runtime checks. See this post on why Rust doesn't have functors, monads, and the like: https://varkor.github.io/blog/2018/08/28/feasible-functors-in-rust.html https://varkor.github.io/blog/2018/08/28/feasible-functors-i...
- zozbot234 6y agoAffine types are definitely an advanced PL feature, and the compile time checking in Rust is largely based on them. ("Affine" meaning that values of such a type cannot be implicitly copied, but can be implicitly dropped. One reason why Rust doesn't yet have functors or monads is that it's not very clear to what extent these would usefully generalize to such a construct.)
- marcosdumay 6y agoThose zero-cost abstractions on Rust are pretty advanced, and superior to anything comparable in any other widely used language. Your complaint stands basically to calling Rust a low-level language... what it is. It has advanced low level features, that bring productivity for some code that is completely different form what those high-level ones you point are concerned with.
- zozbot234 6y agoFinally, an article about PL's that doesn't mention Go or Rust! (Oh, wait... the article is from 2009? Never mind then. Carry on.)
- 7thaccount 6y agoAs many have indicated, this article is pretty dated now. In some ways it argues for a thorium nuclear power plant when subsidized wind is available. Yeah thorium is great, but we know how to do wind and the buy-in is cheap right now. You'd have to invest a lot in thorium to make it worth it. Forgive the crude analogy. Also, the people building ML models and doing data science aren't always ubber functional programmers, so Python is easier for them to get going with. Just like the people writing Enterprise software find Java to be fine.
- blunte 6y agoEspecially in fast changing domains like tech, essays and blog posts must state publish dates.
- zests 6y agoIt would be interesting to see how the Scala section would change after the release of Java 8 and especially the release of Kotlin. Java 8 introduced the bare minimum functional programming support in order for the language to be used functionally. Not to mention libraries came out like reactive streams which essentially lets you write your entire code as chained function calls inside of an error monad. Kotlin then made functional programming a first class citizen. Java is clearly recognizable inside of Kotlin under a bunch of layers of abstraction and syntactic sugar. Once you learn Java you can learn Kotlin with minimal effort and add more language features to your toolbelt as you get more Kotlin experience -- similar to what the author says about Scala. Kotlin is probably not as advanced as Scala, and admittedly I've never used Scala, but it does seem to be taking some of Scala's market share.
- marceloabsousa 6y ago"Kotlin then made functional programming a first class citizen" - what do you mean by this?
- opnotme 6y agoNot OP, but I assume they meant: Kotlin encourages you to solve problems functionally, whereas Java merely allows you to do so. Kotlin provides features like top-level function declarations (don't need to be declared as methods of a class) and functions-as-arguments, both of which make it easier to think functions first.
- zests 6y agoIn Java if you want to map a function over a list you write `list.stream().map().collect()` and in Kotlin you write `list.map()`. The functional programming APIs in Java are atrocious. Lambdas are much easier to write thanks to anaphoric macros and other syntactic sugar. Data structures are immutable by default. A big one that isn't mentioned often is that functions can exist outside of classes so your code is not as tied to Java's style of OOP.
- deleted 6y ago[deleted]
- nromiun 6y agoI love learning new languages. But I have yet to see anything that looks like the enlightenment in the article. Most languages gives you different ways to accomplish the same tasks. Some languages make some tasks easier and others hard. It doesn't really matter weather the language is hot, popular or obscure.
- agumonkey 6y agoI'm really curious what 'advanced' will mean in 2030 ? procedural programming fully gone and most programs being about metalevel self-adapting (ml or else) parallel agents ?
- eli_gottlieb 6y ago> I'm really curious what 'advanced' will mean in 2030 ? Javascript on the GPU
- agumonkey 6y agoThat's mainstream advanced, not advanced^2
- eli_gottlieb 6y agoWell, you only gave ten years for advancement.
- petercooper 6y agoI'm only being half tongue in cheek here, but if you follow recent patterns with the growth of functional languages, perhaps find something being mentioned in the computer science journals in the 80s or 90s and imagine it at a bigger scale and with a few twists ;-) A reinvented version of APL? Some twist on visual programming? Prolog-style logic programming with a built-in graph database? Or just stick 'quantum' on the front of anything? If you care to do such spelunking and guessing yourself, the ACM's currently open library is a big help! For example: https://dl.acm.org/action/doSearch?fillQuickSearch=false&expand=dl&field1=AllField&text1=programming+paradigm&AfterMonth=1&AfterYear=1980&BeforeMonth=12&BeforeYear=1999 https://dl.acm.org/action/doSearch?fillQuickSearch=false&exp...
- agumonkey 6y agoYeah good point, although I think the FP revival is reaching top of the current wave. And you know, time and new things have a tendancy to be out of the ordinary. One thing that seems very near reality, is logical auto completion or partial proover edition. Right now and IDE/typechecker will verify there's a logical path between A and B, but maybe they'll try some capped graph search to find possible paths when you need to compose some functions. I know I've seen similar things at very small scale in high end cgi software. Their node editors will introduce conversion nodes if you try to add scalar to a vector.
- hota_mazi 6y ago> the criterion by which you should choose your next language is not employability, but expressiveness. What a weird choice. If you are looking for an out-of-the-mainstream language, you can't really tell right away if a language is expressive or not before you actually dive in. Myself, I go for "exotic looking". I read the brief description of the language, look at a few snippets, and the weirder it looks, or the most foreign the main concepts are, the more I'll be interested in studying it for a few hours. The point is not to be expressive, it's to stretch my brain.
- djhaskin987 6y agoI'm sick of the functional programming people telling us that they are better than we are. I have written lines of code in Scheme, Haskell, and Common Lisp. I regularly code in Clojure. I like writing in functional languages too. But every language makes trade-offs. The imperative languages generally try to optimize for readability and speed. The functional languages are often optimized for expression, the ability to easily express yourself to the interpreter or compiler. There is a trade-off though. These languages all trade high expressibility for slow execution times and steep learning curves. This trade-off might well be worth the effort especially if the team is small but it is a trade-off. It's not like it's objectively better to always program in the functional languages.
- c3534l 6y agoMost people are already familiar with procedural programming. If you want to grow as a developer, don't just learn more of the same, learns something that challenges you to work in a different way. If I only knew functional programming, I don't think I'd understand half of what I understand now. It's the fact that they accomplish the same things in very different ways that allows me to see what it is I'm really trying to achieve in programming and see different ways of doing that. The author even goes so far as to call these niche. That's what they are: weird little languages that do things very differently from what you're used to. There is no air of superiority in the linked article.
- hajile 6y agoCommon Lisp doesn't belong on that list as it isn't particularly functional in general and is rather fast. You can have expressive, easy to read, and performant, but most people have never seen StandardML before.
- luord 6y ago> once the program compiles, it's almost certainly correct. I'm pretty sure I've heard/read that remark about more than one language. It's interesting how that "almost certainly" often means "around one percent of the time" or the definition of "correct" is moved to a different goalpost. Meaning, of course, that ultimately it is no different from any other programming language: great coders will write great code and bad coders will write bad code.
- georgianar 6y agoEmail this great herbal doctor cured me from herpes virus and he brought my ex lover back via his email robinsonbuckler@ yahoo. com ......