
"This comprehensive text uses a simple and concise framework to teach key ideas in programming language design and implementation. The book's unique approach is based on a family of syntactically simple pedagogical languages that allow students to explore programming language concepts systematically. It takes as its premise and starting point the idea that when language behaviors become incredibly complex, the description of the behaviors must be incredibly simple." "The book is suitable as a text for an introductory graduate or advanced undergraduate programming languages course; it can also serve as a reference for researchers and practitioners."--Jacket.
1) Advanced Programming Language Design by Raphael Finkel - A classic (late 90s) book comparing a whole smorgasbord of languages.
2) Design Concepts in Programming Languages by Franklyn Turbak et al. - A comprehensive (and big) book on PL design.
3) Concepts, Techniques and Models of Computer Programming by Peter Van Roy et al. - Shows how to organically add different programming paradigms to a simple core language.
I found the following useful to get back (ongoing) my "joy of programming";
1) Advanced Programming Language Design by Raphael Finkel.
2) Concepts, Techniques, and Models of Computer Programming by Peter Van Roy and Seif Haridi.
3) Understanding Formal Methods by Jean-Francois Monin.
4) Design Concepts in Programming Languages by Turbak and Gifford.
You will want Knuth's TAOCP (especially since you mentioned you've had trouble with sorting and searching algorithms), but it's not something to start with. Likewise, Hopcroft and Ullman's "Introduction to Automata Theory, Languages and Computation" is a crucial text, but it's highly abstract (much more so than Knuth, which is a very practical work) and very, very slow going. Pick it up later when you're comfortable with mathematical formalisms.
You'll want to, relatively early on, find a readable introduction to discrete mathematics (the mathematics of "countable" objects, like sets and integers) and some of the more useful optimization techniques like linear programming. I used Grimaldi's "Discrete and Combinatorial Mathematics" to good effect.
Eventually, pick up some good textbooks on programming language design (not parsing and compilation), like Turbak et al's "Design Concepts in Programming Languages" and Finkel's "Advanced Programming Language Design."
Also, a few more sitting on my bookshelf that I also highly recommend -- "Computer Organization and Design," "Operating System Concepts" (the famous "Dinosaur book"), and (if you want to get into the nuts and volts of hardware), Horowitz's "Art of Electronics." Great works.
That should tide you over for the next few years -- but it'll be fun reading. Really!
Regarding the list: I think it's a nice effort, but lacks several excellent and remarkable books. Just quickly browsing, I found the following essential books missing:
* In algorithms:
- Aho, Hopcroft, Ullman: The Design and Analysis of Algorithms.
- Wirth: Algorithms and Data Structures.
* In Compilers:
- Wirth: Compiler Construction.
- Grune, Bal, Jacobs, Cerial: Modern Compiler Design.
- Muchnick: Advanced Compiler Design and Implementation.
* In Lambda calculus:
- Barendregt: Introduction to Lambda Calculus.
* In theoretical computer science:
- Kozen: Automata and Computability.
- Davis: Computability and Unsolvability.
* In concepts of PLs:
- Turbak, Gifford, Sheldon: Design Concepts in Programming Languages.
(In general, the list does not mention any of Wirth's books, which is a shame. The Project Oberon book should also be mentioned in OS stuff, I guess...)Regarding compiler construction: As has been previously mentioned several times on HN, Cooper's and Torczon's "Engineering a Compiler" is a more recent and (IMHO much more readable and accessible) choice.