Auch wenn dieses Buch “Pragmatics” im Titel hat ist es ausnahmsweise mal nicht von den Pragmatic Programmers. Dementsprechend ist auch der Umfang eher mit üblichen Informatikbüchern zu vergleichen: Auf gut 800 Seiten wird so ziemlich alles über verschiedenste Programmiersprachen erklärt. Achtung, es geht nicht um die Syntax von Programmiersprachen, deren Beherrschung muss man als Leser schon selbst mitbringen, vielmehr handelt das Buch von Konzepten. Man lernt sehr viel über die Geschichte und Evolution der heutzutage modernen Sprachen und deren Vorgänger.

2e_small.jpg

Angefangen wird mit Scannern und Parsern, danach geht es weiter mit Names, Scopes und Bindings. Hier fing das Buch an richtig Spass zu machen, zum Beispiel beim Thema Dynamic Scoping (ich wusste nicht mal, dass es das gibt). Die nächsten zwei Kapitel fand ich weniger interessant, sie behandelten die semantische Analyse und Mikroprozessorarchitektur. Die nächsten, relativ langen Kapitel behandeln Kontrollfluss und Datentypen. Sehr interessant fand ich die Erklärungen wie alles mit goto began und dann weiterentwickelt wurde, über verschiedene Stufen zu den bekannten Schleifen und Selektionsmöglichkeiten. Sehr schön fand ich die Erklärungen zum Case/Switch-Statement. Dieses Konstrukt dient nämlich nicht bloss zur Vermeidung von unschön aussehenden verschachtelten if..then..else Aufrufen, der Compiler kann damit ziemlich effizienten Code erstellen. Folgender Ruby Code:

case arg
  when 0 then puts "null"
  when 1..5 then puts "one to five"
  when 6, 8 then puts "six or eight"
  else
    puts "else"
  end
end

könnte man auch als Tabelle auffassen:

[0] puts "null"
[1] puts "one to five"
[2] puts "one to five"
[3] puts "one to five"
[4] puts "one to five"
[5] puts "one to five"
[6] puts "six or eight"
[7] puts "else"
[8] puts "six or eight"

arg kann dann einfach als Index in die Tabelle genommen werden. Ziemlich cool, nicht? :) Grundsätzlich wird das so gemacht, wobei natürlich nicht nur mit Ganzzahlen als Indizes sondern auch mit einer Hashtabelle oder ähnlichem gearbeitet werden kann.

Bei der Behandlung von Typen wird zuerst auf Grundlagen wie Polymorphismus und Type Checking eingegangen, danach verschiedene Typen erklärt (Records, Variants, Arrays, Strings, Sets, Lists, …). Weitere Themen im Buch sind Objekt Orientierung, Funktionale Programmiersprachen, Logische Sprachen und zum Schluss auch sogenannte Scriptsprachen, also Shell-Sprachen, Ruby, Python, Perl, Tcl und so weiter, wobei diese Teile eher kurz sind.

Insgesamt ein wirklich geniales Buch, das eigentlich jeder Programmierer mal gelesen haben sollte. Es kann auch gut als Nachschlagewerk benutzt werden, wenn man mal nicht mehr weiss was z.b. “true iterators” sind oder wie das Typensystem von ML funktioniert.

Ausserdem habe ich schon einige Ideen, welche Programmiersprachen ich als nächstes lernen möchte: Lisp (kann ich schon ein wenig, aber vertiefen wäre schön), Smalltalk (sehr interessante Konzepte) und Haskell (keine imperativen Sprachfeatures). Mal schauen ob ich die Zeit finde!