I would not recommend any one language but rather a set of languages, each of which embodies a programming concept or paradigm, as it is popularly referred to. If you are in it for the long haul, I would suggest that you learn these these languages in the same order as I have listed them below.
1. The C Programming Language (Procedural/Imperative). I start with C because it is both straightforward and low-level enough to get started off easily while at the same time it helps you understand system architecture deeply. The most powerful aspect of C is the use of pointers, using which you literally have access to the entire system, to do as you please. C gives you raw power, no doubt about it. Once you have learned and mastered C, learning Assembly language may not be necessary.
2. Lisp/Clojure (Functional). Lisp is the second oldest language in the history of computing and it is still used today, and for good reasons. It’s the kind of language that does not get in your way: what I mean to say is that it has very little native syntax, but behind its deceptive simplicity lies a giant powerhouse.
Like I always say, while C is architected for the machine, Lisp is architected for the human mind. In other words, it’s a thinker’s language, and there’s a period of incubation that you have to afford yourself before you finally “get it.” As Eric Raymond very aptly put it: “Lisp is worth learning for the profound enlightenment experience you will have when you finally get it; that experience will make you a better programmer for the rest of your days, even if you never actually use Lisp itself a lot.” There are a lot of concepts that originate from Lisp, and those concepts may not make much sense to you unless you have a background in Lisp. You have to be immersed in it to understand it.
Yet another thing to know about Lisp is that there is no one language that is *the* Lisp; we only have Lisp dialects. Three of the more popular Lisp dialects are Common Lisp (CL), Scheme, and Clojure, among sundry others. Of these, I would strongly recommend CL and/or Clojure, and I would definitely *not* recommend Scheme. Not that I have anything against Scheme (it’s a beautiful dialect of Lisp), but if you have limited time on your hands, Clojure is the way to go since it runs on the JVM and you also get access to the Java libraries and garbage collection, all of which are very attractive bonuses. Secondly, Clojure is easier to understand than CL since it uses different types of parentheses for denoting different types of lists.
3. C++/Java/C# (Object-oriented). Of these, I would strongly recommend C++ and C#. C++ is one of my favourite languages and its creator Dr Bjarne Stroustrup is one the most admired people in my list of favourites.
C++ combines the best of C (pointers and references to boot), while ingeniously using C’s native constructs to deliver its OO power. Secondly, if you have learned C (which I assume you have when you come around to checking this item in this list), C++ will have a very lower learning curve since you will already be equipped with the power of C.
I also recommend C# since the language is evolving very rapidly under the captaincy of Microsoft, and is incorporating elements of various paradigms in it like functional programming.