What Programming Languages Should You Learn Next?
simoniker writes "Over at Dobbs Code Talk, Chris Diggins has been discussing programming languages beyond C++ or Java, suggesting options such as Ruby ('does a great job of showing how powerful a dynamic language can be, and leverages powerful ideas from Smalltalk, Perl, and Lisp') but suggesting Scala as a first choice ('Very accessible to programmers from different backgrounds.') What would your choice be for programmers extending beyond their normal boundaries?"
If you know C, learn Verilog. Then you can do anything. Anything.
Karma: Raspberry Kiwi
The question is flawed. Anyone worth their weight as a programmer doesn't care what language they .NET) which are a deveation of Procedural Based Languges (C,
.EQ. 1) THEN
... ...
program in but. But Programing Methodoligy should they work with. Assuming that you use to
Object Orianted Languages (C++, Java,
Pascal, FORTRAN). So after knowing those methodoligies perhaps you should study functional languages
(LISP, SCHEME, HASCAL) or Logic Based Languges (Prolog).
Procedural and Object Orianted languges tend to have the most programmers and is widly used
Functional comes next used in some Sciencetific applications as well handling a lot of AI type stuff.
Logical Lanagues are used less frequently because it is very tight sometimes too tight to expand into
a full application.
But most good programmers with experience in these languge classes are not normally worried about what
to program in. They may have their personal favorates but, can code sucessfully in any language
even if they never coded in it before. Because once you understand the classes the rest is just a
google search from finding the right command and syntax of the languge.
For example some differences between procedural Languges
FORTRAN
IF (X
END IF
VB
If (x = 1) then
end if
C
if (x==1) {
}
Python
if x == 1:
BASIC
IF ($X = 1) THEN
END
Wow there are 5 different languges and they all look simular almost anyone would be able to figure it out
If something is so important that you feel the need to post it on the internet... It probably isn't that important.
I'm sure I've already answered that question. I'd probably add FORTH and Self to that list now (Self is particularly important if you want to ever fully understand JavaScript).
I am TheRaven on Soylent News
I seem to be at odds here with this mentality.
... whatever's under the sun for application container and all the while I'm trying to be an expert at Maven (which seems limitless) and Ant so I can do a decent job building. Not to mention the UI aspects: JSF, Tiles, Javascript, AJAX, DHTML, JSPs, JSeamless, Flex, GWT ... they just go on and on.
Stepping outside your comfort zone is a great thing if you have the time or need to do it. Me, I learned scheme & lisp, prolog, a number of instruction set languages and various scripting languages in my undergrad. Because I needed to see what it was like in realms other than Java & C++.
However, these days, I spend my free time looking at frameworks for the latter two languages. Do I want to know Ruby? Sure. But it's not going to make me better at my job. My employer has me jumping from JBoss to Weblogic to Websphere to Jetty to Glassfish to
I hate to say it but this specialization programming and time spent with other people's frameworks and libraries seems to make me more valuable in my own realm. You're right, it's a good idea for me to pick up Ruby (or whatever I'm supposed to learn next) because Java is not going to be around forever. But honestly, I feel a lot of people around me could stop re-inventing the wheel week after week at work and just take a couple days to tweak someone else's solution to work.
That said, Lisp & Prolog were my most favorite and least practical languages I've learned (I think Lisp stands for Lost In Stupid Parentheses).
I guess my answer to your question just another question: "What is your motive for learning a new language?" If it's to broaden your view of the world, go with something out of left field. If it's to be more valuable or better at what you do in Java, C++, Pearl, etc then I would actually tell you to start learning how everyone uses those languages.
Honestly, a lot of the older coders I know just don't have the time. The company will both pay for and tell them what they need to learn next or they ain't learning anything at all.
My work here is dung.
01000101012
We really have some obscurity-loving masochists among our ranks.
"Be light, stinging, insolent and melancholy"
php, perl, and python are not even included in the list.
Why are monads cheating? My understanding is that one of the biggest reasons people like Haskell is for its support of monads. Isn't that a bit like saying using regular expressions in Perl is cheating?
My blog
Because I can't read the comments in your code that are like this: // GRPL nvm lol grep nsfw sew oui ussse perrl
-- Tigger warning: This post may contain tiggers! --
I'm surprised there was no mention of Python. I think Python is a good language to know. It seems to be used a number of places and forces people to write easily readable (and therefore maintainable) code. And I thought it was pretty easy to learn, especially if you have OOP experience.
Slackware
I learned BASIC back in the days of the C64. I then learned Perl when I decided to try my hand at bioinformatics. I picked up C++ at the same time. But there was one language that was used regularly there that always made me feel like a fool.
SQL.
Everything about it seemed backwards and inside out to me. I had a hard time wrapping my mind around "accountant-speak" and "normal forms" (still not sure WTF that means). Yet i know it will likely be in my future. Too much data resides in tables now, and too much data interpretation comes down to data(base) mining. Even the perl::sql modules couldn't save me completely.
So I would say, if you plan for a career that is data-driven, learn SQL if you haven't already. It certainly doesn't seem to get easier to pick up as you wait longer - or at least it hasn't for me.
Damn_registrars has no butt-hole. Damn_registrars has no use for a butt-hole.
I hear that COBOL is a pretty good language to learn. It isn't new, but it is old enough to make a comeback (like disco, aviator glasses and big hair)...
You're right that if you know one C-style language you know them all, and in order to expand your development skills you should learn other styles of languages. However, a major problem is that there aren't so many references for non-C-style languages as there are for C(++), Java, Python, and Ruby. Though Lisp is something all developers should encounter, most Lisp books on the market are antiquated. (However, thank goodness for the relatively modern Practical Common Lisp by Seibel.) I wish there were more tutorials out there for the exotic languages that might really teach you new tricks.
My advice would be to learn formal verification techniques. These can be applied across languages and across platforms. If you deploy them properly you can reduce your defect rate from 50 per 1,000 statements to 2 per 1,000 before the first test case is run.
That will save you far more time than the latest over-hyped platform. While everyone else is fixing bugs in their application, you've already moved on to greener pastures. It will increase your capacity to build really good quality software and not get in to flame wars over nonsense. Nothing quite ends an argument over style more than saying: "Yes, but can you prove that your approach is correct? I can."
Simon
I would put my money on Ruby, as a language it's pretty nice & powerfull, on top of that it's got some interesting implementations in the works (Rubinius).
http://my.telegraph.co.uk/dublinclontarf
- Ruby
- Scheme
- PostScript (?)
- Prolog
- ML
- Haskell
- Haskell
- Scala
Qustionmark mine.nemesis. Home of an experimental fe code.
Even if you never use it commercially, the background it gives you in terms of hardware will improve your ability to write efficient code.
Personally, I think this should be the first language that future programmers (as opposed to CS graduates) should learn.
politicians are like babies' nappies: they should both be changed regularly and for the same reasons
A good programmer would study design patterns in their downtime rather than a new language. Learning the right way to solve common programming problems is far more useful than learning mindless syntax.
I'm a programming noob,(C/Cpp/java/more to come) so who wants to earn a few mod points explaining things?
;)
Ruby is an extention of java, so should I treat it as a fundamental programming language? For that matter, why dosen't the article list SQL?
Postscript? That seems to be a bit proprietary.
lisp/prolog/haskell - these seem to have a reputation for being developed in academia, for academics. Will they make me the bucks once I leave academia?
erlang - as many slashdotters have pointed out, erlang's gimmick - being parallel, isn't all that efficient.
Finally, what about D?
If the only programming languages you know are along the lines of C++ and Java, then I'd suggest moving down to lower-level languages rather than up.
I know a lot of people who have mostly just been exposed to the Javas and VBs of the world, on systems with virutally no constraints on speed or memory resources. Consequently, they don't really know anything about how computers actually work. Nor do they have much experience in programming "tightly" where needed.
Maybe it's just me having a "get off my lawn!" moment, but a few weeks spent writing Assembler for a simple, 8-bit chip would probably do them a world of good. At the very least, some good old-fashioned bit-twiddling and pointer-fiddling using non-OOP, 100% portable C would fit the bill.
JJ
Python would be my choice. Perl isn't bad, just not my first choice for a beginner. Its way too easy to fall into bad habits. I started out in perl and looking back 5-7 years at some of my stuff, ouch! Its way too easy to find really bad, insecure examples on the internet code by using google. I've seen some really horrid stuff end up in production settings because a programmer found a few tid bits on the internet. Not that you can't find crappy python code. It just doesn't seem to come up as readily in a search.
Scala is a functional language,which is part of why it was recommended.
Signatures are a waste of bandwi (buffering...)
I think Whitespace is worth learning, if only to be a smartass on exams where the prof specifies you may use "any" programming language. Just leave it blank, then after the exam spend a few hours figuring out how the hell you would solve the problem in whitespace, and bring a proof of concept on a USB flashdrive to fight the inevitable incorrect grade you receive for the problem.
I have yet to find the courage to actually attempt this. . .
If you are about to mod me down, keep in mind that this post was most likely sarcastic.
Wow, that's like, coming from a very narrow range...
But my suggestions are:
Python - go learn why strong-typing doesn't mean a lot in practice (except for headaches).
Lisp / Haskell / whatever - go learn ' a different way' of programming things. Trust me, it rocks.
Ruby / ECMAScript - it's the future baby.
how long until
Ubiquitously - A Ubiquity Developer Community
> Thank goodness for the relatively modern Practical Common Lisp by Seibel
PCL is also free at http://gigamonkeys.com/book -- I hate to deprive the authors of their royalties, but hey, it's their choice, and helps in making lisp more popular.
Unfortunately, I really can't stand CL's OBNOXIOUSLY-LONG-IDENTIFIERS that other languages often do with syntax. The purported lack of syntax is not a feature when you end up looking like COBOL with more parenthesis (yes that's hyperbole). There are CLOS workalikes available for most Scheme implementations that have all the features you'll ever use from the real deal (and it's not like most CL's have a 100% perfect CLOS). About the only really unique thing that CL brings to the table these days is conditions and restarts.
Done with slashdot, done with nerds, getting a life.
The fact that you think "mindless syntax" is the only difference between lisp, haskell, and c shows that you should probably learn one of these languages.
I'm big-boned, you insensitive clod !
If you aren't trying to get a specific job, I recommend getting deep into an assembly for a few months. Preferably, something simple. Something 8-bit (I started with MOS 6502... but the 68HC11/12 with flash/EEPROM and BUFFALO debugger is even easier). Something on a board you've wire-wrapped yourself. Make it blink an LED. Hook it to a DAC. Hook it to a motor, moving something. Learn every opcode on the little chip.
From there, you'll understand what a C compiler (portable assembly) is doing, at least on a basic level.
Instead of Postscript, I'd suggest the language that Postscript is born of... FORTH. Heck, when you get bored with the assembly on your microcontroller board, burn a simple, fixed-point FORTH onto it, and get a whole new appreciation of what can be done with a few 1000 bytes.
Like a lot of people have commented on this thread, it's past time for you to learn a functional language. I'm not sure if it is true, but new CS students at MIT used to have to learn Scheme as their first language. Learning a functional language will transform your programming ability.
I recommend the book The Little Schemer This book is like no other programming book you have ever used. It is a socratic dialog between you and the interpreter. Questions on the left, answers on the right. It is meant to be used with an interpreter.
Once you make it through this book you'll be a much, much better programmer. You'll also have an easy time learning languages like Haskell, which is used quite a bit in academia and is useful for real world software.
So buy a copy of the Little Schemer and download an interpreter, Dr. Scheme is pretty good, and get cracking.
Brainfuc* is a fun one - http://en.wikipedia.org/wiki/Brainfsck ASM but seriously the most practical languages to learn next are the scripting languages for installers like NSIS, Inno, or InstallShield.
If you are a good programmer you don't learn a new language because any language isn't hard to pick up. Make sure you have a good foundation of procedural, OO, and logic languages and you can write code in anything without a lot of learning involved.
Comment removed based on user account deletion
Well, after C++ and Java it's a good idea to actually learn C. It still makes a big part of the world to go around, an it seems hard these days to find programmers who know how to write fast and secure code in C.
Take a look at 99 Bottles of Beer, a website holds a collection of the Song 99 Bottles of Beer programmed in different programming languages. My personal favorite is LOLCODE. :-)
The right answer to most such questions is, "It depends."
What sort of tools will be useful in your future career? Or, what sort of knowledge will be interesting to learn?
If you are concerned with serious engineering issues, such as safety and correctness, you might want to learn something about "formal methods". Languages to look at include Z and B. And, of course, there's a little field called "computational logic."
If you are concerned with commercial byte-pushing, you obviously need to be conversant in SQL and an assortment of scripting languages. And, of course, there's a little field called "accounting" that might be useful.
I don't think there is any one right answer. The choice of intellectual tools that you will need really depends on the choice of what kinds of work you want to do.
I know it still has some issues, but I'm hoping the D takes off. There are a lot of really interesting ideas in that language if you read the spec and write a few sample apps. Even if the language itself doesn't take off its worth a look to see the kinds of things people are thinking about including in next-gen languages.
I think the more languages you know (don't need to be deeply) the better. Let's see, I've started with (Turbo) Pascal in engineering university, tried a bit of Turbo Pascal for Windows (very, very, very bad one), went to LamdaMOO, Javascript, PHP, then gave up into engineering and changed to computer science, learned C, C++ and a bit of Java. I can't really say any of those was not useful in a manner or other to me, even the ones I hate, like Java :)
Lisp is the mother of all languages. It can do everything. Even things just now becoming mainstream, like lambdas. Back in the day to get a CS degree you had to write a compiler in LISP. A bit of Asm so you know what the computer actually does.
For productivity, any high level language (.Net, Java, whatever has a lot of libraries)
At the command line, Msft PowerShell is powerful.
The libraries available are really the big thing for high productivity.
The law is a weapon of the government, not a protection for the likes of you. Surely you understand that.
This seems to be the future. Are there any languages that are more efficient for multithreaded programing?
I like programming, but I've never delved into it too much. However, after childhood experiences with Basic (brrr!) and Matlab, I've become a decent Python programmer, and I'm currently developing a modular data analysis application in my research laboratory.
I'd like to learn new languages. I tried to learn C++ just for the sake of it, but the fact is, I never needed it, so I just stopped bothering. I can do practically all what I want to do with Python, and I never found myself in the situation of needing C, C++ or Java. And I'm not the "coding for the coding's sake" kind of person. I like coding a lot, but only if there's a definite purpose for it.
So, what is your advice? What kind of programming language should I learn after Python, and what kind of practical problems could it be applied on that could be interesting? For example, I wondered if PHP and/or Javascript are good choices, since I'd like to do web stuff but I have almost no experience on it. But they're just examples. What I mean, what kind of problems would require me to say "oh s**t, this needs C++/Java/Lisp/Ruby... and not Python"?
-- Patent no.123456: A way to personalize
Brainf*ck?
-- Senior Software Engineer, Attorney appearance services, locallawyerapp.com.
I would say, depends... Different languages have different uses. What need is your current languages not fulfilling? :-) (though seriously, it's worth having a script language under your belt for complex batch tasks at least)
Might be worth looking into asm just so you think about what your code really boils down to.
On the other hand, if you just want a language to throw around and knock stuff together quickly, python is good. Really good. I could rave all day about python and it's interactive shell and flexibility.
If you only have done C++, might be worth doing pure C, working object oriented with structs, again it makes you think about what your C++ code boils down to.
However, what I would say is that some times rather then learning a new language, might be worth picking/debugging through an open source project that you have no idea how it works. (May I recommend a emulator with JIT). I think I've learnt far more from other people's source then I have from changing languages, and some times what I've learnt is the language, even if I thought I knew it!
Standard ML of New Jersey (abbreviated SML/NJ) anyone? http://www.smlnj.org/
:)
I love it just because of its name.
...
I've been spending the better part of today refactoring some ugly C++ that was written by a crusty old Fortran engineer. It might as well have been Fortran.
Please please please learn a functional programming language. Even if you don't use it in your daily work, your brain will be improved.
Write your own language... it's certainly more educational.
Non sequitur: Your facts are uncoordinated.
You mean some one learned everything about java or some one learned the syntax?
There is a spark in every single flame bait point.
Well, there are plenty of voices in the Java community who would like you to learn Groovy.
I only post comments when someone on the internet is wrong.
At least according to the TA teaching my languages survey class. Of course, it could be because his grad school work was focused on it and not because it is actually useful.
Do really dense people warp space more than others?
I like how it says:
hackerkey://v4sw5/7BCHJMPRUY$hw3ln3pr6/7FOP$ck6ma8+9u6L$w4/7CGUXm0l6DLRi82NCe3+9t5Sb7HMOPRen5a17s0DSr1/2p-3.62/-5.23g3/5
I think that learning dynamic languages are beneficial. They make you think about some things a little differently, like Ruby with it's code blocks for example. And on the other side, it seems that use of dynamic languages, such as Python and Ruby, are growing.
It's making a HA-UGE comeback (c# 3.0, closures in Java). Great place to start is Clojure.
Don't forget Piet. That's produced some of the most beautiful code I've ever seen. It also handles abstraction in a novel way.
My work here is dung.
For a change I decided to learn and understand programming languages themselves. I went back to the old dragon book, and picked up Michael Scott's Programming Language Pragmatics. It's interesting to learn the low levels, and once you learn the basics (parsing/scanning/compiling), you can easily grasp any language out there.
It's great for handling matrices, vectors, plotting and umm... well, that's all it's good for.
One of our competitors trademarked the term "hypothesis". From now on, we will call them "boneheaded ideas".
Between the plethora of classes and variations, one can't really "know" C++. Well, not like one can "know" C, anyway. My "next" languages have been wxWidgets and ncurses. Eventually I'll make it to Ruby ... someday, and I must also admit an idle curiosity about the D programming language (but that isn't very serious).
If you're ever feeling much more silly than that, though, you can always check out the whitespace language or even LOLCODE.
In the
Seriously though, is there a language shift that's happening? I can't really see any strong indicators of that, so if you don't know anything about csharp, I'd download mono and start figuring it out a little and if you don't know anything about java, I'd pull down a jdk and start figuring it out a little, if you know those and want to play with something else then try ocaml, haskell, ruby, or whatever floats your boat.
It's about "how can I code in the ones I know BETTER?"
There are scads of people out there who pick up a language in a short time, but don't really learn how to utilize it well. So, you get these "wonders" that know half a dozen languages, and suck a coding in ALL of them.
Chas - The one, the only.
THANK GOD!!!
Anyone who wants to learn about elegance in software design NEEDS to study FORTH. No program ever written by man is more elegant in design than FORTH. Not to mention it is a damned amazing programming language in its own right.
"Malo periculosam, libertatem quam quietam servitutem." -- Jefferson
So many good and bad languages to pick from. This website contains code samples in just about every known computer language. Cheers!
There's always good 'ol SICP. Although the focus isn't on learning Scheme (lisp dialect) you end up picking it up along the way. I can't think of a good CS undergrad program that doesn't make you read it, anyway.
Since I have seen no mention of J, K or APL I thought I would throw these into the mix. These are great for array processing and in general anything mathematics related. It is like having an executable mathematics language. I have been reading some image processing papers as of late, and I am often thinking that the papers would have been better with some J code thrown in. English is often vague, and the math notation used is sometimes incorrect. With J, I know the math could have been tested for correctness. I think if everybody knew J, and technical papers used it, then these papers would be much better. These languages try to use special symbols to their fullest ability to create a powerful language. They are kind of the anti-LISP. LISP uses as few symbols as possible and then provides macros. J, K, and APL are all quite similar. I don't yet know any of them well enough to recommend one over the other.
I know Python, C, C++, Perl, Java and LISP -- aren't those the most important hacker languages to know ?
If you're looking for books on LISP, another book to consider is On Lisp. It's free to download from the following link as it's inexplicably out of print.
http://www.paulgraham.com/onlisptext.html
Back in the day, I was using FORTRAN77 at work (chemical modeling) and there was a problem for which I really, really needed to use recursion. Avoiding recursion would have been horribly awkward and inefficient. I had a long discussion with my boss and finally got him to agree to lose compatability with FORTRAN77 standards and use Fortran90 style recursion. (Fortran90 was backward compatable enough that the tweaks required for compiling all the rest of the code were minimal.)
When did I drag my former boss, kicking and screaming, all the way from the 1977 version of Fortran to the 1990 version? That's right, it was way way back in the year 2003. Scientific computing fears change, I guess. At the same job I worked with a molecular mechanics code that, I kid you not, had blocks of code in some subroutines from the 1970s still in use, line numbers in columns 73-80 and all.
If all you want to do is math, and enough of it that you're processor speed limited, Fortran is still a fine language. It's fast.
You got a CS degree yet avoided taking a course in comparative programming languages,
or some equivalent course in that tier?
That's unfortunate. You can function in the workplace without that background, but
it might be the only opportunity to really get it for most people.
Plus it will make your resume stand out.
http://en.wikipedia.org/wiki/Brainfuck
Obama likes poor people so much, he wants to make more of them.
I would recommend Scheme. Not because I recommend you program in it, but because it will change the way you think about programming and programming languages, especially if you also read Structure and Interpretation of Computer Programs (affectionately known as SICP).
Scheme is a small programming language, so you can learn it relatively quickly. This allows you time to read some of the literature about Scheme. And SICP. This will give you insight in the design of programming languages, and how features (like loops, class systems, etc.) can be implemented in terms of simpler constructs, given the right primitives and powerful enough abstractions.
And, in the end, it's the primitives and abstractions that matter. Given the right primitives and abstractions, you can mold your programming language to be anything you want. Scheme, and other languages in the larger Lisp family, are very good at this. That's probably why they are still around, despite tracing their roots back to the 1950s. Other languages are not so good at it, and you will end up writing lots of boilerplate and repetitive code if you program in them.
I could go on and on and list all the insights Scheme has provided me with, but I'd say you go see for yourself. SICP is a good place to start, because it starts at the basics (so you don't need to know Scheme before you start), but gets up to speed really quickly (so you won't get bored). You could also try my Scheme tutorial.
Note that all this is about the 5th revision of Scheme (known as R5RS). R5RS lacks many primitives that would make it useful for Real World applications (just to name one thing, there is nothing about networking). Many implementations of Scheme (and there are many) provide various such primitives - but that's not the point here. The point is about the fundamentals of programming.
As a final remark, if you are used to Java's "everything is part of a class" curfew, Scheme will provide a refreshing change of perspective. R5RS doesn't even have classes. Instead, the focus is on procedures. So you will be decomposing your system in terms of what it does, more than in terms of what real, imaginary, or "forced on you by the programming language" objects it acts on. In my experience, this leads to many small functions, each doing a simple thing, which can then be composed to build your system - or perhaps a very different system that happens to re-use part of the functionality. Unlike Java's classes, each containing a bunch of method, each of which contains gobs of repetitive code...try to adapt _that_ to do something similar, but slightly different. Again, it's all about primitives and abstractions.
Please correct me if I got my facts wrong.
The ability to communicate well with co-workers, bosses, clients, etc. over time will dwarf any benefits you can get from learning another programming language.
let's be clear, for the most part, people who learned and write exclusively in interpreted languages are not programmers.
They are scripters. Writing interpreted code is a lot like writing a glorified shell script and often times obfuscates much of what a "traditional" programmer would normally do. A programmer whose background is in python and perl should learn C next, and then probably Lisp.
I've met a lot of people who know a lot about interpreted languages, but they don't know why many of those languages are so bad with handling things like arrays and what their shortcomings are. Programmers ought to start out learning Lisp(yes, it is interpreted but it has greater educational and practical value) and C.
The Ruby syntax tree needs an LL(k) parser. This tighly couples the parser to the lexical analyser which makes any it deeply flawed, buggy and unreliable. Add into the mix that ruby is really a dynamic scripting language and you find an explaination for it's unreliablility.
... just generate web pages. But none of them attempt any serious breadth in the application domain and they both have really serious scaling and performance problems.
Dr. Dermot Hogan agrees, he said To my mind, the Ruby parser and syntax is fundamentally flawed.
That's why there are not grand scalable performant systems written in Ruby.
James Gosling said of Ruby it
He was proven right by Derek Sivers said after spending two years trying to rewrite a website in Ruby with Jeremy Kemper that it was Like trying to turn a train into a boat. It's do-able with a lot of glue. But it's damn hard. And certainly makes you ask why you're really doing this. In the end he abandoned Ruby and rewote the system in PHP in 2 Months.
If you want to do Dynamic programming, don't be taken in by the hype; learn Python, Smalltalk or the second choice language Schema.
why not be different? Why use a standard, popular language with large function/class libraries and a huge user base? Try qore instead!
http://qoretechnologies.com/qore
You will be unique. Your friends and colleagues will applaud your taste in esoteric programming languages.
You just might get a great new job out of it too. Somehow it could lead you to winning the lottery. Or even getting that significant other of your dreams. The possibilities are virtually endless...
reddit's programming languages virus has just infected slashdot...
Learn FORTRAN - FORTRAN IV, specifically. None this pussy f95 stuff.
.. paranoid crackpot leftover from the days of Amiga.
Enough said...
But I think a really good language to learn is ECMAScript or to the layman, Javascript.
Javascript is the language of the future. It's such a powerful language and so underrated. It's far beyond the whole switching images thing. It's an interpreted langauge deployed on more computers than any other programming language. (think web browser.) It's light, it's fast, it's dynamic. For a scripting language it offers you an extremely familiar syntax, C like. It's becoming the backbone of other environments, and other compiled / interpreted languages are being extended for scripting support.
"It takes many nails to build a crib, but one screw to fill it."
Eiffel: Native code OO language, design by contract, well implemented multiple inheritance, high order functions, closure, interfaces with C, C++.
Shameless plug... I have a comparison mainly involving Scala and Groovy. The short story is that I would argue that Scala is not ready for prime time and that FP is not a small step for "Joe Java programmer" requiring hard retraining. Furthermore Groovy has most of the advantages of Scala (and in some cases is clearly more mature)
And a powerful macro system. Scheme's is interesting, and you can do most anything with it, but certain things require a great deal of hoop-jumping.
Aside from conditions and restarts, macros seem like the last thing that hasn't sneaked into popular languages yet. For the uninitiated: imagine being able to write a function that, at compile time, takes and returns entire syntax trees. Or imagine if the C preprocessor let you write #defines that were full-fledged functions that had the entire language and runtime available during expansion.
Imagine if C let you hook into the tokenizer and the parser! Why, you could invent your own language for solving your problem, and then solve your problem in that language!
It's worth learning Common Lisp just to play with this stuff.
I got my Linux laptop at System76.
...learn the language of butterflies. Don't forget to be imperative.
---- Where is my mind?
I can think of several good reasons why a beginner should learn Perl:
* It is easy to learn. Don't listen to what the Python advocates tell you. There are lots of good tutorials out there on the web.
* It introduces you to syntax which is similar to other well-used languages such as C and Java. If you're going to do Perl, you're probably doing CGI, and then moving over to Java and J2EE isn't as hard as learning it from the start.
* If you learn Perl first, then classic shell languages such as bourne shell, korn shell, etc., won't be so cryptic when you need to modify or write one (and you will need to at some point). Many of Perl's built-in variables are the same as what you'll find in those shells.
* Regexes - nearly every language out there has them now, but Perl has for a long time been the leader in regexes. In my opinion, Perl's regex syntax along with the Perl culture itself encourages their broad use. When you learn regexes from Perl and you move to another langauge that has libraries for them (e.g. Java or C#), you'll find support for them but you will also find that long-time developers in those languages won't use them as much. If and when they need to use one, and they know you're into regexes, they will come to you to ask you how to construct them.
* Windows API Support - outside of Microsoft only products, Perl's library of Win32 modules is virtually unmatched by other scripting languages. Although they have them, languages like Python and Ruby don't even come close in this area. This is important because someone starting out with a programming language will often be starting out on Windows, not a *NIX platform. If you are a Windows sysadmin trying to break out of VBScript and move on to better things, then Perl is for you.
* Lots of legacy systems in production today use Perl. I was in a company once that hired some Python biggots, who wanted to convert all the programs written in Perl code to Python (and get paid for it -- har har), but the IT manager wisely kept them in check. Perl is ported to almost every flavor of *NIX out there, and then some, and on many platforms it is part of the default install package. (Sun OS is one that comes to mind.) If you know Perl, you're useful when you come across it.
* Quick and dirty scripts. Sometimes you need something that you can use quickly and throw away. Perl is perfect for one liners executed at the command prompt and for multi-line utilities. Plus, there is instant gratification that comes from creating useful one-liners, kind of like an endorphin rush.
Prolog or Lisp
it's unbelievable, how useful they are, once you are familiar with them...
The MAFIAA is a bunch of mindless jerks who will be the first up against the wall when the revolution comes
Give Objective Caml a try.
I used to be a die-hard C/C++ programmer, and I figured I'd never be quite as comfortable in another language. These days, though, I don't feel productive unless I'm using OCaml. You won't realize how broken and clumsy most mainstream languages are until you learn OCaml or one of its ML relatives. It takes some time, but it's worth it.
And yes, you can actually write real programs with it!
My criteria for choosing what new language to learn would be the language that maximizes both of these at the same time:
1. What language would be good for my career?
2. What language would be interesting / fun to learn?
Many interesting languages. I like programming so I would enjoy learning anything. I have a job and a life. Since there are only so many hours in a day I want to pick something that will lead to more jobs, better paying jobs, and more *interesting* ( fun ) jobs.
program in but. But Programing Methodoligy should they work with. Assuming that you use to
Object Orianted Languages (C++, Java,
Pascal, FORTRAN). So after knowing those methodoligies perhaps you should study functional languages
(LISP, SCHEME, HASCAL) or Logic Based Languges (Prolog). Hold up there! You're vastly over-simplifying the issue. Many programming languages can't be divided cleanly into the categories you name. For instance, is Common Lisp a procedural, functional, or object orientated language?
Some languages are very interchangeable, such as Java and C#. Other languages are vastly different, and attempting to draw discrete boundaries around them is not going to succeed. Any language worth knowing is a methodology all in itself. Smalltalk and Java are both object orientated languages, but there are considerable differences between the two languages, in implementation and philosophy.
My guess is that you're an undergrad at University, as you remind me of myself at that age. Try reading up on Forth, Lisp and Smalltalk. Contrast Qi to Haskell, Io to Java, Clojure to Scala. The differences between programming languages are far more pronounced than you appear to think.
You've got to learn Objective-C. Duh. How else are you going to write iPhone apps. ;)
"Functional" languages, actually a real misnomer. Really you should look at what are currently classed as "research" languages which are interesting because they have advanced features which make programming easier and safer.
My list would include:
Rich.
libguestfs - tools for accessing and modifying virtual machine disk images
Not only is it capable of destroying your mind, you get to use all these neat Greek language symbols!
Learning to improve your job chances? Then it's not so much about the languages that are important as the third party APIs available for languages you may already know.
For yourself, the current vogue is Verilog and playing around with FPGAs. Build/buy a minimig and see what you can do once you've stopped playing robocod.
Otherwise I tend to learn languages on demand, and never anything that'd a fad. It's not hard to learn a new language, although mastering the ins and outs takes a lot longer. Always good to know a popular well paid job language, like Java or C# or even PHP, inside out (i.e., the language and a good selection of APIs like Struts, Hibernate, JDBC, and so on).
Once you've done that, then learn a lower level language if you don't already know C, i.e., learn C. You don't need to master it, most people don't end up writing operating systems. It will help you understand what the computer is doing far better than not paying attention at university ever did (unless you wrote scene demos as a teenager!). Also you might want to write Gnome applications. You could learn assembler, or you could spend some time coding an 8-bit micro (via an emulator) in assembler to learn some cool stuff. WinApe is a CPC emulator with excellent development tools built in (Z80).
If you've got a Mac, learn Objective C, you have all the tools, you'd be a fool not to take advantage of it when you have the time.
Also you should know a scripting language or two. Perl is a good one. Learn shell scripting too.
If you have a job programming something esoteric, then it is very important that you keep up with a modern language in your spare time, in case the worst happens with your job.
Don't forget functional languages either. Nor don't discount selling your soul and learning some Microsoft systems stuff, although I haven't done that yet.
Oh, and as you get older, you'll be hoping to do more management type stuff too, so don't neglect those people skills.
If the goal is to push yourself into new modes of thinking or programming paradigms:
All valuable languages for exploring some paradigm of programming. Don't just learn how to write C in each of these languages. Learn what makes them unique, and the patterns and idioms they are designed to express elegantly.
If you're learning a different language to broaden your horizons, then learn something like assembly, or a stack-based language like Postscript or FORTH. If you're learning another language because you need better tools, then learn Python.
Don't piss off The Angry Economist
I'd say _also_ learn perl if just because of CPAN alone. To me the best form of code reuse is being able to reuse someone else's code that's better than yours :).
:).
:)
While languages like Lisp are very powerful - in that smart programmers don't have to write so much to do a lot, the problem for stupid and lazy people like me is I still have to think and write a lot more since there isn't as much great stuff out there to reuse (yes I know the less people using a language = less code out there to reuse, and that is sometimes not the fault of the language).
It's the difference between being able to recursively build a house atom by atom exactly the way you want it, and being able build one using mostly prefab components. The latter is likely to be faster for stupid and lazy people like me
The boss/customer usually doesn't care if each door hinge is perfectly macro-crafted - he's probably going to change his mind on where the doors are going to be anyway...
In short:
Lisp is powerful - for the code you write (expressiveness).
C is powerful - for the code you write (low level control + performance).
Perl is powerful - for the code you _didn't_ write (laziness).
The parent post is absolutely correct. I recieved a degree in computer engineering from Iowa State, and have first hand lab experience of using Verilog to design CPUs and memory modules. It is definately a hardware design language. Mod parent and grandparent up.
Beware of bugs in the above code; I have only proved it correct, not tried it.
In our world that imperative languages are near ubiquity, functional languages actually teaches us how to code succinctly and cleanly.
The one SML class I took in Sophomore year was more helpful in defining my coding style than any of my other courses. I finally learnt how math and compsci are intrinsically related to each other when all your code is defined in y=f(x) format.
Granted, functional applications currently have too few APIs to allow true RAD (Java being the other extreme with too much API ^^). It's more a learning tool than a production one I guess.
For mining those ever growing Home Land Security datawarehouses.
"Profit!": C# "Freedom!": Rails "Fun!": Lua
It's better to be the foot on the boot than the face on the pavement. ~~ tkx Kadin2048
Although that language is fun to write in, assembly's a bit more useful in getting a job. Once you understand things such as jumps, which Brainfuck teaches, assembly becomes easier to understand.
Clearly you fools have been forgetting ABAP, the best business application language 1972 has to offer.
What do you want to do next? Most programming languages are good for certain jobs, but not so good for other jobs. If you want to make dynamic websites, PHP, ASP or similar would be a good start. For other things learn an appropriate language for what you want to do
Blazing Spiders
Brainfuck
Here's an example: in functional pseudo-code, the list append function is defined like this:
:- append(TailA, B, TailC);
append(a, []) = [];
append([], a) = [];
append(head:tail, b) = head : append(tail, b);
When you evaluate append([1,2], [3,4]), the evaluation proceeds as follows:
append([1,2], [3,4])
=> append(1:[2], [3,4])
=> 1 : append([2], [3,4])
=> 1 : append(2 : [], [3,4])
=> 1: 2 : append([], [3,4])
=> 1 : 2 : [3,4]
=> [1,2,3,4]
What you're doing is pattern-matching the expressions to the left-hand sides function definitions, substituting according to the right-hand sides, and using those to simplify step-by-step to a final answer.
In logic programming, on the other hand, there are no functions, just predicates. Append(A,B,C) is a three-place predicate that is only true if A, B and C are bound to lists such that, if you appended A to B, you'd get C. In pseudo-code, again:
append([],B,B);
append(A,[],A);
append([HeadA:TailA], B, [HeadA:TailC])
The first predicate is only satisfied if the first argument is an empty list, and if the other two are equal lists: i.e., the append of empty list to B is B. Likewise for the second. The third one is satisfied if all these conditions are met:
* The head of the first and third lists is the same value.
* The append of the tail of the first list and the second list is the tail of the third list.
While the functional program operates by applying functions over the "input" lists to produce an "output" list, the logic program accepts any combination of values and unspecifed variables for the argument slots, and searches for values that, replaced for the variables, make the predicate true. To append two lists, you can specify the first two args and give a variable for the third:
append([1,2], [3,4], C)?
=> C = [1,2,3,4]
...or you can specify the second and third only:
append(A, [3,4], [1,2,3,4])?
=> A = [1,2]
... or even just the third one, in which case, the program produces the following answers (only one at a time; after it's given you an answer, you can request it to produce another one):
append(A, B, [1, 2, 3, 4])?
=> A = [], B = [1,2,3,4]
=> A = [1], B = [2,3,4]
=> A = [1,2], B = [3,4]
=> A = [1,2,3], B = [4]
=> A = [1,2,3,4], B = []
You can do even more complicated queries than that:
append(A, A, [1,2,1,2])?
=> A = [1,2]
Are you adequate?
First, learn C++ properly. The template language is a strict, pure, referentially transparent functional language.
Then, learn shell scripting. It's different from most languages in that is really requires the use of a number of DSLs. The stream oriented programming is very different from a lot of languages. Parallelism/coporcesses are implicit and very natural in that foo | bar is automatically parallel. Code and data are interchangable and this is idiomatic foo | bar | sh. You can also get parallelism easily. For instance, replacing sh with xargs -d'\n' -n1 -P4 will make good use of your quad core computer. If distributed computing is your thing, you can also make use of passwordless ssh for almost trivial distributed computing. Or you can embed code in HERE documents, giving you PHP like embedding code in data. The possibilities are pretty much endless.
Then learn some other languages. A good dictionary bashing like python, FORTH or postscript is probably worth learning.
It's also worth learning a nicer functional language than C++ templates. Something like Haskell or LISP.
There should be some assembler in there too, something like protected mode x86 asm.
You can also try really constrained programming environments, by getting one of the $100 PIC evaluation boards. Then you can get to practice programming with no OS around to help/hinder.
Then learn Makefiles. If you can do anything above, makefiles are easy. And again, they have implicit parallelism. Nice for your N core machine.
I've probably missed a few important topics, but you get the idea.
SJW n. One who posts facts.
Practical Common Lisp is the better book for someone starting oiut.
On Lisp is for someone who wants to learn the portions of Lisp that make it worth learning--after they've learned the basic syntax.
t
Once you have mastered the sendmail.cf, nothing is too complex for you.
Seriously though, this comment is spot on:
http://it.slashdot.org/comments.pl?sid=491582&cid=22785524
although I'd suggest LISP instead of Scheme if you're looking to learn about functional programming (Scheme has common libraries which allow you to fake procedural programming too easily, so it's not as good for learning the functional programming model, despite it being better[?] than LISP).
no more words are needed. Python > all!
Read and Comment at my BLOG
!!!
how many people are there who can come up and say that they learned what language they are mainly using enough ? and, is it mandatory to have a 'next' language to learn ? apart from hobby purposes ? do you know that there are companies looking to hire lisp programmers etc still ?
and whats the definition of 'next' anyway ?
Read radical news here
What is it, flamewar day? It is very easy to make the decsion.
What is it you want to DO?
A language does nothing. It's just something a compiler can interpet.
Do you want to make robots dance? Do you want to make a faster RDBMS? Do you want to write front ends for tellers? DO you want to do web pages? forums? flash?
What someone can do, right ow is so great that there are a million things more important then the language. In days of yor, we were contrained by some 'boxes'. Then we where 'programmers'. Now languages is a means to another goal. Leave that old way of thinking behind. Think "What do I want to create?" not "What can a create with these limited tools"
Now, some pedantic ass is going to say "We always could do anything with C and assembly!" True, but they are intimidating to use, and now we have people creating what ever comes to mind and not have to worry about esoteric bit flipping.
Yes, this means there is more crap, but the Jewels being created right now shine brighter then anyone could have imagined 20 years ago.
What do you want to DO?
The Kruger Dunning explains most post on
BCPL evolved into B, which evolved into C. BCPL is no longer used, so technically died off, but C and C-related languages are not only in widespread use, the family is still growing. C#, D, Objective C... Anyone who learned BCPL (so long as they're not dead from old age) could understand the basics of D without ever touching a textbook on it, by virtue of it being a linear descendent. As such, it's less a die-off and more an evolution, which requires minimal training to be able to get right.
Erlang, Haskell, Forth, LISP, Ruby... These are not direct descendents and require additional understanding to program well in. The greater the difference in methodology, abstractness, style and notation, the greater the learning curve to become proficient in that language.
This is where it becomes important. You can't start learning the language the day you start a new job. You can't really start a month before, unless the learning curve only requires you put in a month. You have to determine how likely each language is to be needed and when by, and then make sure you learn sufficiently in advance to compete for those jobs once those positions do become available. Unless it's far enough in advance that you'll have retired, in which case you can probably disregard it except for hobbyist purposes.
It's a small world and it smells funny; I'd buy another if it wasn't for the money; Take back what I paid (SoM)
Most schemes offer unhygenic macros these days alongside the hygenic ones.
I don't know about straight C, but there's OpenC++ for writing syntactic transforms to C++, and OpenJava which does the same for Java. Not sure how up to date they are these days. Thing is, all the extra syntax they have to support makes lisp and scheme macros look simple.
Macros are a often a convenient feature to have, and in some cases they can be awesomely powerful (lambdaweb is done essentially with a big macro that cps-transforms its forms) but unless you get very freaky with metaprogramming, it really doesn't stretch the paradigm all that much.
If you want to play around with the idea of macro metaprogramming, I recommend metalua. There's so little to lua that you don't get confused by the homongous specification of CL or libraries of scheme, so you have a greater understanding of what's going on through experiment.
Done with slashdot, done with nerds, getting a life.
One of the joys of C is that it doesn't do this. You can normally tell from looking at a block of code what the compiler will spit out. Key words, arithmetic, function calls and dereferencing all pretty much do what you think they'll do! (And, with the exception of function calls, don't require looking it up in the documentation.)
I'm pretty sure Perl can do these things too, though I don't know Lisp or Scheme well enough for an apples-to-apples comparison of the capabilities.
Perl's BEGIN functions run during the compile phase, and let you run whatever code you like at that time. You can define new functions based on compile-time options if you like, or based on whatever else you might base it on. You also have full access to the symbol table, which is handy if you want to do something like put wrappers around other functions. Note that you don't have to do this stuff in BEGIN blocks; you have these capabilities at runtime too. If you want to introduce new keywords to the language, there are modules in CPAN that do that, and I'm pretty sure they do it by adding functions to the Core namespace. I've never had a need for this though, so I'm not certain exactly how it's done.
Again, I'm pretty sure that a Perl programs ability to tap into and manipulate its own symbol tree, either that compile time or run time, gives it the ability to do this sort of thing. Or, there are also modules like Parse::RecDescent which might be better for the task.
Different languages in the same basic family are designed for different, albeit similar, purposes. The similarities should not mislead you. Each will be good for the parameters for which they are designed, each will be bad for almost anything outside of those parameters. Smalltalk, Java and C++ belong to the object-based family (although Smalltalk is the only OO language of the three regarded as pure, Java is mostly OO and C++ is extremely hybrid). Because all are object-based, all are designed for problem-spaces concerned with containers, encapsulation, localizing and tightly-controlled visibility.
On the other hand, C and C++ also belong to a common family. In this case, both support C-style programming and syntax. This is useful when you want to use compilers with a lot of research into techniques behind them. C++ at its slowest was faster than any object-based or object-oriented programming language that required compilers that could learn little or nothing from previous generations of compiler theory. (Experimental languages that follow novel designs and syntax often fall into this category.)
Other examples of languages that fall into a common family and are obviously different: C-shell and BASH. Pascal and Occam. 80x86 and MIPS. Perl and Python. PHP and Javascript. Fortran and BASIC.
It's a small world and it smells funny; I'd buy another if it wasn't for the money; Take back what I paid (SoM)
This is all possible in Perl, but it's rather difficult to manipulate the syntax tree directly as you would in a Lisp or a Scheme. Unambiguous parser overloading is definitely Deep Magic in Perl 5. (Perl 6 makes this much easier.)
how to invest, a novice's guide
First, that's only true if the compiler has all optimizations turned off. Anything from -O on up will reduce that to a wild guess. Second, I'd consider that a weakness of the language. Sure, it's convenient sometimes to know exactly when memory is allocated and freed or what code gets executed when, but I'd much rather have abstracted multi-threading, lazy evaluation, and other non-obvious bits that make code shorter and faster.
C's pretty spiffy when you need that degree of control. When you want to write it quickly and correctly and run it faster than C could, there are better alternatives.
Dewey, what part of this looks like authorities should be involved?
Umm, we kinda guessed that.
Get thee to Casting SPELs in Lisp and work through the fun example. It's only a glimpse of what Lisp can do, but will disavow you of any notions of Perl equivalence pretty quickly.
Dewey, what part of this looks like authorities should be involved?
In my experience the failure is not caused by people not knowing the language. Incompetence and ignorance are curable by education. Not willing to go through review process, being convinced of own superiority and infallibility, this all is equal to sabotaging the project and all is not curable. I have seen millions sunk not because projects had crews that could not code but because they were not able to communicate. We also have seen new brilliant toys that were to provide silver bullet and failed.
I still have to occasionally write code in assembler of the processor that is all but dead and is simulated by virtual machine. It is still cheaper than writing new RT application of the same functionality in new language and just to be able to add this one single module that nobody wants to write in old proprietary language.
What I wanted to say is that the programming language is just a tool, it is a hard heart eeee cool head that allows to use it properly.
"Scala is a modern multi-paradigm programming language designed to express common programming patterns in a concise, elegant, and type-safe way. It smoothly integrates features of object-oriented and functional languages."
http://www.scala-lang.org/intro/index.html
Functional programming is just a part of it. You don't have to use it. Just like you don't have to use generics in java.
If you want to you can use it write something that just looks like cleaner java programs in Scala. That what makes it easy to learn.
I am sure that as soon as the tools get up to speed, we will start seeing people building great things with Scala.
Punch cards and FORTRAN.
D combines C++ like power and Python like productivity in one language.
The basic idea is this: in Haskell (or most other functional languages), you know that different function calls will not interfere with each other (everything is thread safe out of the box), so they can be evaluated in parallel. Function evaluations can be parallelized with the infix operator par. The following evaluates "part1" and "part2" in parallel, before storing them together, as a pair:
let result = (part1 `par` part2) `seq` (part1,part2)
No locks, no writing explicitly threadsafe code. I'm sure there are other languages that are good for parallelism, Haskell just happens to be the one I'm learning.
A cat can't teach a dog to bark.
I'm using PHP for my day-to-day work and deal a lot with Ruby fanboys, but I have to say that Python has a special place in my heart.
... He said it best back in '74, nothing to add here.
Here are the upsides (and some things that make Python exceptional) in my book:
1.) Very much like PHP and Perl, Python lacks the academic stench and has a general overall non-challance and n00by friendlyness to it. Things that *really* bug me about C and Java. And a smell that Ruby is gaining due to all the Java people brining their old bad habbits over to ruby.
2.) It's elegant and has a very neat and clean syntax, lacking the bizar and intimidating curly braces and semi-colons strewn all about in classics such as Java or JS. Or PHP for that matter.
3.) Indentation as block delimiter. The most ridiculed thing about Python (ridiculed by people who've never used Python) is acutally one of it's neatest features. Keeps code clean, minimal, human-readably and it's style in sync across many developers. Great for collaboration. And let's not forget that famous Donald Knuth quote: "We will perhaps eventually be writing only small modules which are identified by name as they are used to build larger ones, so that devices like indentation, rather than delimiters, might become feasible for expressing local structure in the source language."
4.) Python is used in serious non-trivial areas and applications in every field I can think of. Gaming, Multimedia/3D, Science, Large Scale HPC (Google f.i.), Embeded and, last but not least, sophisticated web applications. It apparently integrates very well as a scripting language, judging from the countless applications that use it as their choice of script and it also drives large non-trivial applications as core technology. (Googles Deployment Pipeline or, f.e. Blender)
5.) It's the foundation for the most sophisticated web kit to date: Zope. Zope is way ahead of anything in the Rails ballpark (or any other Web-FW), and it's only due to crappy project marketing on Zope's side that it didn't get as much attention in 2001 as Rails did since 2004. Until the MVC+SQL layering crowd catches up with Zope it will be another few years, until then it will remain the bar for any programmers who've ever come across it. (Like many PHP Framework & CMS developers I know)
6.) It's got a regular Webkit called 'Django' (drinking buddies of the Rails crew) which is quite popular and in itself makes me curious enough to want to pick up Python again.
Bottom line:
If you're looking to learn a new PL, give Python a try. And even if you despise that indentation thing I recommend you try coding in it for 20 minutes. You'll notice that it doesn't bother you at all, since programmers who are experienced enough to worry about that indent correctly all the time anyway.
We suffer more in our imagination than in reality. - Seneca
I am working on bayesian belief networks, and though I have been able to find some nice libraries, I have writing a simple one just to really get it, and to get quick results, I'll be taking a look at python.
A client of mine has been showing interest in IPhone apps, and if he deals with the quirks of the sdk (registering etc), then it will be objective-c for me.
I have never been able to actually learn or use a language without a clear need for it, so even though there are many others I'd be interested in, I know that as long as I do not have something to produce, the learning process just does not work for me.
Personally, I am learning Verilog. I'm tired of the hardware guys telling me how hard it is to design ASICs.
I would recommend http://www-cs-faculty.stanford.edu/~knuth/mmix.html
A great way to train your brain.
Binary.
If you think that C and C++ are one language separated only by a slash, then you probably are better off coming from Java.
C++ has much more in common with Haskell than Java does, because of the un-C-like strict typing, and the template/concept type-level language, which is very close to Haskell's typeclass system. If you know C++ well, then you're probably ready for Haskell.
sub f{($f)=@_;print"$f(q{$f});";}f(q{sub f{($f)=@_;print"$f(q{$f});";}f});
there's been tons of dynamic programming languages coming out, most of which are pretty disappointing.
People say a language is "dynamic" as if it were a selling point, but what they really mean is that it is interpreted, they were too lazy to write a compiler for it, and that type checking is always deferred to runtime, even when you don't want it to be.
There's never really any excuse for not writing a compiler. Sometimes during development you don't want to compile things, and that's fine, but you need the choice. Many languages like Java and Ocaml have both interpreters *and* compilers, and I think that's the right way to go.
As for deferring type checks to runtime, any modern language can do that, but the so called dynamic languages have no choice *except* to do that, and have no mechanism whatsoever for checking for obvious type errors. You can run a python program a thousand times, only on the 1001th time to find that there was actually a type error in some statement that was never executed before. On the other hand Java and C# with generics, and C++ will catch your type errors *the first time you compile*. All these languages support dynamic typing, the difference is they *also* support static typing.
The reason languages like Python, Perl, and Ruby are written, the reason that aren't mentioned when evangelizing these languages, is that writing an interpreter is *easier* than writing a compiler (note I said easier and not easy). There's no need to write assembly for lots of platforms, or deal with things like register allocation, so some of the harder problems are taken off your plate. These languages are generally very ad hoc, and special purpose, and that's fine. They are great for writing dinky one off scripts. However, let's not glorify them to the point where we are doing something more sophisticated than that, say writing large web apps.
On the other hand, writing a c++ compiler is a major endeavor both because it is compiled and it is standardized (you can't just say that the standard is whatever the hell buggy way the reference implementation does it). Now, C++ has some problems of its own, but because it is statically typed, and compiles to a highly optimized form, it gives you a very powerful tool for writing large scale and high performance software. Much of the same can be said of java, although some performance is traded for things like cross platform support and ease of programming (a trade off which is appropriate in a number of domains like web programming).
It's fun to use and it's open source.
Definitely two winning points.
But of course this post, as well as this whole article, is destined to ignite a religious flame war.
I have always thought of programming languages as more of a wrench in your tool box. If you need high horsepower I use ANSI C. If I am doing text processing, I use Perl. I think a good question would also be, what do you need to do and what languages would let you do that? That is a pretty practical view that you actually need to build something you need though.
The suggestion was that there is nothing gained from understanding an unfamiliar abstraction - that it's all just 'mindless' syntax. That's equivalent to saying the only thing a programming language is good for is saving time, or LOC, since that's really the only thing we can empirically measure.
But if you've ever gained new insight into the nature of 'process' while learning a new programming language, you know that is absolutely false. I mean, seriously, if you've ever studied any math you know this is false!
What does 'design-pattern-neutral' mean? 'Abstraction-neutral?' That's like wanting an abstraction-free math. Lisp, which I assume you're talking about, is not 'abstraction-neutral' because it is an implementation of the abstraction for studying process known as the Lambda Calculus.
Choice of language is the only thing that optimizes programmer-time. Algorithm development? Try learning or implementing the Unification algorithm without at least some exposure to Prolog. The things you mention are important, especially for an EE guy. I assume that most of the software you need to write is strictly C or assembly. So yeah, if you need to trade off, you probably won't need to learn Haskell. The original post was assuming there's no point at all to learning new languages.
Your computer's memory is like a bunch of post office boxes (I assume these are the same the world over - a huge wall of little mailboxes labelled in some sort of predictable order).
// Allocates a P.O Box to store the value 55 // Allocates a pointer P.O Box and points it at the box that contains 55 // Prints 55
You can store one number on a piece of paper in each box. If you want to store a string, you need a sequential run of boxes (each one storing a character). Pretty straightforward.
A pointer is just a box that has the number of another box stored in it. In other words, you have a value that tells you which box to open to get the value you want. Accessing the pointer directly gets you an address in memory (a P.O Box number), and dereferencing the pointer means getting the value from the box pointed to.
In our imaginary P.O Box computer:
Box abox = 55
Box *pbox = &abox
print "The box number that has 55 in it is ", pbox
print "The value pointed at by pbox is %d", *pbox
Not hard.
What would your choice be for programmers extending beyond their normal boundaries?
It depends largely upon whether you want a job or not.
The higher the technology, the sharper that two-edged sword.
In general, though, yes, there is a lot of stability in job requirements over time. Certainly enough to be sure that if you learned all that is current now, you'd know almost all that was current five, ten, fifteen years down the road. Those who only learn two or three languages have the most need to speculate, as they're at greatest risk of getting left behind, but those who've mastered the bulk of common languages today are in excellent shape for the future.
Nonetheless, I believe the advice holds true. If you keep learning, you will be the stronger for it, and if you second-guess correctly which way the market will swing in the future, you will be the more secure for it.
It's a small world and it smells funny; I'd buy another if it wasn't for the money; Take back what I paid (SoM)
How about learning how to program some small microcontroller (pic18 series are a nice choice, reasonablly clean architecture, nice package styles, tollerable development tools, free version of the C compiler availible with only minor crippling).
It is a whole different world and learning to deal with systems that are highly resourse limited is a refreshing change from the desktop mentality of "who cares about the bloat just wait for moores law to catch up".
note: i'm known as plugwash most places but i screwd up registering that here somehow in the past and now can't register
I'd love to see Fortress from Sun developed more. It sounds perfect for the scientific computing that I do. Mathematical notation, automatically parallelized matrix-vector operations, and more. It's still a research language though, and doesn't seem to have much development occuring now.
Five years of experience at a minimum is required to work with telephone keypads.
http://thedailywtf.com/Articles/5_years_C-pound_experience.aspx
Everyone feels that any given language is missing something. So make your own that fits your needs.
http://machete-lang.blogspot.com/
Learn D. It's open source under the GNU license.
I find it awesome. Compiled, and object oriented. Garbage collector included. Namespaces too. Templates that are not an eyesore. As fast as C. Comes with a bult-in library, but there is a more popular systems library called Tango.
Arc looks like a promising new programming language that goes back to the roots of what Lisp should be. It's managed to build a reasonable community in a very short amount of time and there's a lot of buzz.
Qu'on me donne six lignes écrites de la main du plus honnête homme, j'y trouverai de quoi le faire pendre.
I would post a example of the versatility and user friendliness of Brainfuck, but the lameness filter cannot handle it. http://en.wikipedia.org/wiki/Brainfuck
http://www.youthrights.org/
Everyone should learn $(SELF->FAVOURITE_LANGUAGE).
There. That will save everyone else the need to post.
I am anarch of all I survey.
Erlang is one of the few languages that is build around concurrency.
From a programming languages viewpoint, there's no fundamental distinction between a "description" language and a "programming" language.
10 PRINT CHR$(205.5+RND(1)); : GOTO 10
Yeehaaw! This has got to be one of the geekiest discussions recently!
-Shawn
What about \lambda calculus?
Also, I haven't heard anybody say, "Ruby? pshaw. Use django instead." Is there a consensus that Ruby is "more valuable" than django?
And third, perhaps most interesting, is the future of programming. I think a few people hinted around the issue here with sentiments such as "they're all the same modulo syntax". Obviously seasoned programmers know better, but there is value in a padawan's comments.
The truth is, all programming languages exist for the same reason, execute a sequence of electronic operations. As time approaches infinity, won't there be some consensus on the perfect blend of power/performance/ease of coding/etc to achieve that electronic operation? Why should we (humans) have 5 ways to do the same thing? The computer SHOULD have 5 ways to the the same thing, but it should decide which is best for a given environment and abstract that from our decision. I don't care!!!
So why you shouldn't code LISP using vim? Hint,"because emacs is better" isn't an answer.
There are 11 types of people, those who know unary and those who don't.
Go and learn 6502 or Z80 assembly. I'm serious. I believe every coder should have some exposure to what goes on underneath the wonderful VM based hardware agnostic platform agnostic Java code we write. You will truly appreciate the complexities and intricacies of what goes on there when you write a "simple" statement like:
a = new int[10];
..on learning yet another language or paradigm, try this:
http://www.google.com/search?hl=en&q=how+to+build+an+outdoor+setting+from+hardwood&btnG=Google+Search
It will make you a better programmer.
> Imagine if C let you hook into the tokenizer and the parser! Why, you could invent your
> own language for solving your problem, and then solve your problem in that language!
Actually, the humble FORTH allowed you to do that; you had access to the entire compilation process. It's a very cool feature, but like self-modifying code, the power comes at the price of responsibility. You can shoot yourself in the foot big time with those.
...it's actually "Lisp is Stupid Parentheses"...
New mod option wanted: -1 DrunkenRambling
One of the joys of C is that it doesn't do this.
I guess you've never seen someone with a hardon for macros. You can make C look a whole lot like fortran if you really want to.
"We returned the General to El Salvador, or maybe Guatemala, it's difficult to tell from 10,000 feet"
A language that I have toyed with from time to time, and that is very dynamic, is Relative Expression Based Object Language. Well worth to give it a try.
/ The Arrow
"How lovely you are. So lovely in my straightjacket..." - Nny
Often developers pick languages on how cool they are for them to program in. But the truth is the industry would prefer the following in a language.
- Easy to localise.
- Easy to maintain.
- Easy to learn.
- Can integrate with existing systems without having to rewrite anything.
What Programming Languages Should You Learn Next?
The one you are using now.
Rome taught me patience and assiduous application to detail. Virtues which temper the boldness of great, general views.
What about \lambda calculus?
Pick up on of the purely functional languages, like Haskell.
Also, I haven't heard anybody say, "Ruby? pshaw. Use django instead." Is there a consensus that Ruby is "more valuable" than django?
Ruby is a general-purpose programming language. Django is a web application framework. Where is the comparison?
"Oppression and harassment is a small price to pay to live in the land of the free." -- Montgomery Burns.
It would have to be IBM Basic assembly language http://en.wikipedia.org/wiki/IBM_Basic_assembly_language; definitely. This is only halfways a joke - think about it; there is a huge number of programming languages in the world, all of them sort of more or less the same. Learn C, then you have easy access to learning most of the rest. But assembler, any assembler, will teach you how a computer works at a deeper level, which has got to be beneficial. Also, you can then amaze yourself with how small programs can actually be.
And why BAL? Why not? How many people do you know who can actually program a mainframe in any language, let alone assembler? Especially young people? It's a little like learning flint knapping; it went out of style a while back, but it's bloody cool to be able to do it.
Uggh...pointers...BAD BAd bAD......no....not...the pointers again....[trembles]
I can deal with about anything, except pointers. Thanks for bringing the nightmares back again....
:-P
As they point, do they say "Ni"?Regarding treating syntax trees as data, the latest version of C# has a feature which shows a movement in this direction. It's called Expression Trees and it allows the code to capture a representation of the compiler's parse tree for an expression and use it as data. It's used to implement Language Integrated Query against external data sources; for example, Microsoft has code that'll transform an expression tree into an SQL expression.
Of course, you are still constrained by the C# expression syntax and compile-time type checking. That's by design, though: the goal here was to ratain type checking, IDE autocomplete and so forth while being able to "remote" your expression evaluation.
Functional program languages are more efficient than object oriented ones. In order to reduce powercompsuntion, a speedful program can use more threads (e.g. Yaws, a web server wrote in erlang). In my opinion, ML and its sons, erlang are the future.
I smell a very specific kind of brain damage.
Maybe you should find others like you and start a support group for MPNDS --- Memory Pointer Neuron Deletion Syndrome!
well qore ( http://qoretechnologies.com/qore ) was designed for multi-threaded programming, but it does so in a more "classical" way, meaning that it offers easy and safe access to shared data, where global variables are shared between threads and everything else is thread-local more or less. It has thread synchronization primitives, deadlock detection, etc and was designed for interfacing and logic embedding. It also has a strong focus on SMP scalability where a significant amount of time was spent to reduce the amount of cache invalidations (which can cause a big performance hit on SMP machines); so to my knowledge it is unique in this respect - being a dynamically-typed scripting language with such a focus on threading, SMP scalability, and logic embedding.
I describe it as a cross between perl and java, but being small it doesn't have the huge APIs and class libraries that those languages have.
However the new version (still in svn) has a QT module for GUI programming and a documented and stable API and ABI...
It's got some other cool features, like perl5 regex support, easy XML and JSON serialization, HTTP and other socket and socket-based protocol classes, many database drivers and some cool features for transaction management and even transparent per-thread datasource allocation with the DatasourcePool class, and more...
check it out if you're interested!
Now you sound just like my father...
I spent the last week or so finally going ahead and learning Haskell, and I am now very sad that I took so long to start.
Haskell is an amazingly enlightening language. When you approach it, like I did, you are likely to hit some overly-academic descriptions of its features, which are extremely hard to understand. Don't let this discourage you, Haskell can be learned without getting a PhD in mathematics.
I recommend Yet Another Haskell Tutorial as a more down-to-earth explanation of what's going on in there.
I find it far more enlightening than Lisp, and that it is quite amazing what a powerful world was built with such simple primitives.
Another note is that most languages (even C and Lisp) are far more similar to one another than they are to Haskell, so even an experienced programmer will take longer to learn Haskell than just any new language.
A bit of a handholder, this book starts out basic but is really accesible for the beginning programmer (or someone just trying to wrap their head around lisp never having used a Functional language):
http://www.cs.cmu.edu/~dst/LispBook/index.html
I would recommend Flaming Thunder, at http://www.flamingthunder.com/
Some of Flaming Thunder's features:
Flaming Thunder is the only language in the world that I know of that has built-in support for CGI scripting and that generates compiled CGIs. Plus, you can cross-compile the CGI scripts for your Linux server on a Windows or Mac, then ftp up the compiled CGIs.
Flaming Thunder is new enough that early adopters can not only learn a new language, but can actually influence the development of the language.
I think the answer to this really depends on whether you are just expanding your horizons (I'm very curious about ruby) or do you need to make a living (if it's windows, your better off learning a .NET language like C#).
I mean..scala? I've never heard of it but I am a bit busy with my clients (doing all sorts of work in C# - that is one very cool thing about it - works great in web or apps) That said, I think I will go check it out.
EK
The very top of programming language technology, as we speak, is Haskell. You'll understand a lot more the other languages if you learn it, and you will be disappointed by the lameness of the other languages when you go back to them.
perl is good to know... python is used as a language in a lot of game engines and 3d apps as well as in other places. asp is ok to know for microsoft junk... but I wouldn't focus solely on it since it's likely to dissappear just like com before it, visual basic when it changed massively, and like .net likely will in the not so distant future. Microsoft centric languages tend to dissappear or become obsolete every time a new OS comes out, mainly to increase sales...
I wish I'd kept up-to-date with programming over the last 40 years. But I got too busy managing something or other. Now I can see what's really needed for human systems is a 'rule engine' (with a friendly UI, and superb net-interoperability). Sure, someone has to do the machine code, but the **user** needs something truly high-level. Object orientation comes close, but I can't see how the ever-adapting 'rules' fit in (that's real-world rules, like contractual terms and multi-factor conditional branches). 'JUDE' comes close, but seems to miss a real-world interface and perhaps compilation. This insight can hardly be a novelty - who's got one, and is it open-source?
I am not recommending for commerical reasons. But because they are fairly new they a new mix of software ideas.
F# is a functional language from MicroSoft Research (not to be confused with MicroSoft). It is along the line sof APL and LISP.
JavaFX is Java-like scripting language entirely integrated into Java and their JVM.
If a programmer asks himself this question, perhaps it's time to consider a "pattern language" ... :-) For programming languages authors: could "Esperanto" be a hint?! Or simply a look to the evolution of the English language, or it's predecessor - the Latin language? ;-)
I went with pascal, fortran, cobol, c, and asm. Was I supposed to learn c++ and java? I mean, I can see Perl but Java?
Having to work for a living is the root of all evil.
Lots of times I want to do some signal processing or plotting or visualize what I am working on ... but I don't have a convenient way to visualize the data I am processing.
I found out recently that you can move your data from C to Matlab and then I can plot the data and actually visualize what I am working on .
What a load of well reasoned crap.
Of course which language matters. Sure many are pretty much the same. Sure it helps to know various paradigms of programming. It always matters which language you code in. It always matters which methodology you perform analysis, design and codding in.
In the simple cases almost all languages are the same, especially within that particular language's paradigm and the group of languages that are similar.
It always matters to the results what language you use.
Sure I can code successfully in almost any programming language, given a month or two of learning curve to grok it's library and weird syntax, or bizarre paradigm; but do I want to? Only if it makes me wealthy doing so. Otherwise, in the general case it does matter to me what language I use.
In fact no one language meets my needs for the systems that I envision. Thus a new language is being born that stands upon the shoulders of giants. In fact I'd rather not create a language at all but that's the nature of computing when you push the limits beyond what others so boringly call the mainstream cutting edge.
One dimensional text based languages are out. New environment based programming paradigms are in. Languages that use text are out; they are so old. Sure the new language under construction will use text as one form of representing computer programs, but it's really only meant for the program rewriting system not for human consumption; at least it's not really meant for the vast majority of programmers, just an automatic programming system to store it's programs and data in an efficient manner that can be read by humans as in the rare cases where it's needed - such as during the bootstrapping of this new system. Once there is enough built up the text based representation can be jettisoned as an artifact of the past. Video game interfaces are the wave of programming in the future - text is just so old.
As two famous advertisers like to say: "Just Do IT! Think Different!".
So while your arguments are well reasoned for the current paradigms of languages, look out and catach the wave of the future or get crushed by the next generation of interactive systems that self program while you use them.
Well, I don't know, I'm half way through, never having used LISP before, and it seems like a nice introduction to me - surely it's best to start with the stuff that makes it worth learning? After all much of the whole point of learning another language is to absorb the culture which comes with it. Haven't read the other book you're recommending though so will take a look.
The problem with using purely functional programming techniques for concurrency is that you must constrain the topology of your concurrent computation to that of a tree. No cycles, no sideways references allowed, or you have to work out a synchronization mechanism, and none are known that are free from side-effects.
It's a difficult problem, which is why lots of research focuses on lock-free synchronization and result-sharing mechanisms for functional languages. Much of the research focuses on whether duplicate computation is generally more efficient than any sort of wait-based rendezvous.
Most schemes offer unhygenic macros these days alongside the hygenic ones.
.c files through the macro processor before running gcc on it, and it works reasonably well.
I don't know about straight C, but there's OpenC++ for writing syntactic transforms to C++, and OpenJava which does the same for Java. Not sure how up to date they are these days. Thing is, all the extra syntax they have to support makes lisp and scheme macros look simple.
There's bolt-on macros for C that I've seen people use before. You essentially feed your
I think it was mainly used in scientific codes when the number of dimensions of an array weren't known, and people didn't want to write N copies of the same function. You'd pass the dimension in at compile-time, and it would spit out the code for that dimensionality.
Kind of ugly, but C doesn't handle it very well otherwise.
Learn. COBOL. Now...
IBM mainframes aren't going away.
You'll never be unemployed.
Besides, somebody has to be around to translate or fix old legacy code to these new-fangled languages (some of which will fall into disuse sooner than you might expect).
A cat can't teach a dog to bark.
There's a reason for that. Erlang is designed for writing robust meshes of tightly interacting processes, and supports things such as on-the-fly code upgrades (0 down time!). That doesn't mesh well with the idea of producing an "executable" file. But, when you come to think about it, what does these days? C might be your best answer, but even there you're more likely to end up with a slew of files that need to be installed for any but the most trivial applications.
I have that problem for the first day or so any time I switch paradigms. Functional programing is different in a lot of subtle ways, and things that would have been the obvious best way to approach a problem in Ruby (to choose another language I like a lot) simply aren't a good idea in erlang. And visa versa. Using runtime reflection to modify classes on the fly can do amazing things in Ruby, but it's a borderline nonsensical trick to try in erlang. Conversely, launching a bazillion threads diving down tail-recursive rabbit holes would quickly bring Ruby to it's knees, and often works great in erlang.
It has more than you might realize in part because they tend to be called "applications" instead of libraries (probably as a consequence of the "everything is a service" philosophy). You don't think so much in terms of calling a library as requesting a service which is provided by an application.
So here's an interesting idea to try, in case you're interested in giving it another shot: how about a highly parallel spam filter? Something that runs on a mail server, vets messages as they come it, and has the following properties:
Try it in erlang, and then try it in java or something, and I think you'll start to see the value of languages like erlang.
--MarkusQ
Thank you!
I love it when someone comes up with a good solid answer to what I'd thought was a rhetorical question.
--MarkusQ
Haskell
Ruby
Erlang
R
Prolog
Groovy
Scala
Lua
Lisp
Smalltalk
Scheme
Ocaml
Ruby and Erlang are the two I've spent the most time with so far. I like Ruby enough so far, that I've decided to write the initial
batch of install scripts for OpenQabal in Ruby.
Outside of that wish-list, I also harbor some vague hope of one day finding time to dabble with Forth, Fortran, Perl, and maybe Dylan.
// TODO: Insert Cool Sig
I'd say that Scheme macros are far more powerful (especially in r6rs) than CL macros for the reasons of both hygiene and referential transparency.
I write code.
if you work for somebody else, learn whatever language they use. if you work for yourself, then stick with fortran if you are an engineer, c if you are a systems programmer, and delphi or visual basic if you are a scientist.