PL 101A Learning Lounge course about Programming Languages.
First, we'd like to explain why we feel the need to introduce some ideas here from around the spectrum, and to explain our choices: the best way to put this is expressed in an old essay: Teaching the Fatal Disease (or) Introductory Computer Programming Using PL/I, written in 1972 by Richard C. Holt, but re-published in 1999, probably due to the inordinate number of programmers introduced to programming lately via C++ and Java.
Starting Forth by Leo Brodie is a great first approach to programming. The book lets you learn basic concepts to understand how a computer works, with a paradigm good for low-level and high-level programming alike. It was followed up by another book Thinking Forth. Unfortunately, Starting Forth is out of print. Any person studying FORTH must have these on their shelf.
Concepts, Techniques and Models of Computer Programming by Peter Van Roy and Seif Haridi. The authors give this summary (excerpt):
[..] The book is organized around programming concepts. It starts with a small language containing just a few concepts. It shows how to design, write programs, and reason in this language. It then adds concepts one by one to the language to overcome limitations in expressiveness. In this way, it situates most well-known programming paradigms in a uniform framework. More than twenty paradigms are given, all represented as subsets of the multiparadigm language Oz. [..]Note: this is a big book, the April 26, 2003 Draft is 976 pages.
The TeachScheme! project has many good books.
The Structure and Interpretation of Computer Programs is a very insightful intro to many programming paradigms. It requires the reader to be quite good at abstract thinking, and a background in math or physics helps a lot.
Programming Languages: Application and Interpretation is another good source, freely available online.
Does a Practical Theory of Programming belong here or elsewhere?
Programming Language Concepts and Paradigms (is this online anywhere?) is another good intro to the subject, utilizing ML.
Here are just some examples of what to study and gain some experience in after that:
- On Lisp by Paul Graham, on the power of macros.
A D. B. Lamkins wrote Successful Lisp that will help if lack of familiarity with Common Lisp is a problem.
- Self, as an example of prototype-based oo but also as a first contact with self-contained reflective dynamically compiled systems. Alternatives: Squeak, Lisp machines.
- Something on Meta-Object Protocols and aspect-oriented programming.
- OCaml or Haskell for functional programming, rather than Standard ML. What's wrong with SML?
- Mercury or Mozart/Oz for modern declarative programming, rather than Prolog.
- JoCaml or Mozart/Oz or O'Haskell for parallellism and distribution.
- For the essence of obfuscation: unlambda (plain combinators), brainfuck (minimal virtual machine), intercal (fascist arbitrary limitations), etc. Knowing how things can be wrong can help you understand better how they should be right.
Prof Leavens' page about teaching programming languages.