The Pragmatic Programmers Sieben Wochen, sieben Sprachen Verstehen Sie die modernen Sprachkonzepte Deutsche Übersetzung von O REILLY Bruce A. Tate Übersetzt von Peter Klicman
Ein wenig über viele Sprachen zu wissen ist eine nützliche Fähigkeit. Ich musste häufig ein wenig von Python oder Ruby verstehen, um ein bestimmtes Problem lösen zu können. Die Programme, die ich aus dem Internet herunterlade, sind in den unterschiedlichsten Sprachen geschrieben und verlangen eine gewisse Anpassung, bevor ich sie nutzen kann. Jede Sprache hat ihren eigenen Satz an Idiomen, Stärken und Schwächen. Indem Sie verschiedene Programmiersprachen lernen, sind Sie in der Lage zu erkennen, welche Sprache für die Art von Problemen am besten geeignet ist, die Sie lösen möchten. Ich freue mich zu sehen, dass Bruces Geschmack bei Programmiersprachen so vielseitig ist. Er behandelt nicht nur so etablierte Sprachen wie Ruby, sondern auch weniger bekannte Sprachen wie Io. Letztlich geht es beim Programmieren um das Verstehen, und beim Verstehen geht es um Ideen. Die Auseinandersetzung mit neuen Ideen ist daher wesentlich für ein tieferes Verständnis dessen, worum es beim Programmieren eigentlich geht. Ein Zen-Meister könnte Ihnen empfehlen, Latein zu lernen, um Mathematik besser zu verstehen. Das gilt auch für das Programmieren. Um das Wesentliche an der OO-Programmierung zu verstehen, sollten Sie sich die logische und funktionale Programmierung (FP) ansehen. Und um die FP besser zu meistern, sollten Sie sich Assembler anschauen. Programmiersprachen vergleichende Bücher waren populär, als ich Programmierer wurde. Doch meist handelte es sich um akademische Schinken, die nur wenige praktische Hinweise zur Nutzung einer Sprache lieferten. Das reflektierte die Technik jener Zeit. Sie konnten etwas über die Ideen einer Sprache nachlesen, doch sie auszuprobieren war nahezu unmöglich. Heute können wir nicht nur etwas über diese Ideen nachlesen, sondern sie auch gleich in der Praxis ausprobieren. Das macht den Unterschied aus: am Beckenrand stehen und sich zu fragen, ob schwimmen Spaß macht, oder einzutauchen und das Wasser genießen. Ich lege Ihnen dieses Buch wärmstens ans Herz und hoffe, dass Sie es so geniessen wie ich. Joe Armstrong, Entwickler von Erlang 2. März 2010 Stockholm Vorwort 9
Kapitel 1 Einführung Menschen lernen Sprachen aus den unterschiedlichsten Gründen. Ihre Muttersprache haben Sie gelernt, um überhaupt leben zu können. Sie stellt das Werkzeug dar, das ihnen dabei hilft, den Alltag zu meistern. Wenn Sie eine zweite Sprache erlernt haben, kann das verschiedene Gründe gehabt haben. Manchmal muss man eine zweite Sprache der Karriere wegen lernen, oder um sich an eine veränderte Umgebung anzupassen. Doch manchmal lässt man sich auf eine neue Sprache ein, nicht weil man sie lernen muss, sondern weil man sie lernen will. Eine zweite Sprache kann Ihnen dabei helfen, neue Welten zu entdecken. Sie könnten sogar Erleuchtung suchen, da Sie wissen, dass jede neue Sprache auch das Denken formt. Das Gleiche gilt für Programmiersprachen. In diesem Buch werde ich Ihnen sieben verschiedene vorstellen. Dabei möchte Sie auf eine Reise mitnehmen, die Sie aufklären und Ihren Blick auf das Programmieren verändern soll. Ich werde Sie nicht zum Experten machen, aber ich werden Ihnen mehr beibringen als bloß Hallo Welt! 1.1 Wahnsinn mit Methode Wenn ich eine neue Programmiersprache oder ein neues Framwork erlerne, suche ich meist nach einem kurzen, interaktiven Tutorial. Mein Ziel ist es, die Sprache in einer komtrollierten Umgebung zu erleben. Bei Bedarf kann ich etwas eingehender untersuchen, doch im Wesentlichen geht es mir um eine schnelle Dosis Koffein, einen Schnappschuss des syntaktischen Zuckers und um die Kernkonzepte.
12 Kapitel 1: Einführung Aber üblicherweise ist diese Erfahrung nicht besonders erhellend. Wenn Sie den wahren Charakter einer Sprache kennenlernen wollen, die mehr ist als eine bloße Erweiterung einer Sprache, die Sie schon kennen, dann wird ein kurzes Tutorial niemals funktionieren. Sie müssen schnell und tief eintauchen. Dieses Buch bietet Ihnen diese Erfahrung nicht nur ein-, sondern gleich siebenmal. Sie finden Antworten auf die folgenden Fragen: Welches Modell der Typisierung wird verwendet? Die Typisierung kann stark (Java) oder schwach (C), statisch (Java) oder dynamisch (Ruby) sein. Die Sprachen in diesem Buch reichen vom stark typisierten Ende des Spektrums bis hin zu einem breiten Mix aus statisch und dynamisch. Sie werden sehen, wie sich die jeweiligen Kompromisse bzw. Nachteile für den Entwickler auswirken. Das Typisierungsmodell prägt die Art und Weise, in der Sie ein Problem angehen, und kontrolliert, wie die Progammiersprache funktionert. Jede Sprache in diesem Buch hat ihre eigenen Typisierungs-Eigenarten. Welches Programmiermodell wird verwendet? Ist es objektorientiert, funktional, prozedural oder irgendeine Art Hybrid? Dieses Buch behandelt Sprachen mit vier verschiedenen Programmiermodellen, manchmal auch Kombinationen mehrerer Modelle. Sie werden eine logikbasierte Programmiersprache (Prolog) vorfinden, zwei Sprachen, die vollständig objektorientierte Konzepte unterstützen (Ruby, Scala), vier Sprachen funktionaler Natur (Scala, Erlang, Clojure, Haskell) sowie eine Prototyp-Sprache (Io). Mehrere Sprachen unterstützen auch mehrere Paradigmen, z. B. Scala. Clojures Multimethoden erlauben es Ihnen sogar, ein eigenes Paradigma zu implementieren. Das Erlernen neuer Programmierparadigmen ist eines der wichtigsten Konzepte dieses Buches. Wie interagiert man mit ihr? Sprachen werden kompiliert oder interpretiert und einige verwenden virtuelle Maschinen, andere hingegen nicht. Ich beginne meine Erkundung mit einer interaktiven Shell, wenn es denn eine gibt. Ich gehe dann zu Dateien über, wenn es an der Zeit ist, größere Projekte anzugehen. Unsere Projekte werden aber nicht groß genug sein, um vollständig in die Paketmodelle einzutauchen.
Die Sprachen 13 Was sind die Entscheidungskonstrukte und die Kern-Datenstrukturen? Sie werden überrascht sein, wie viele Sprachen Entscheidungen mit etwas anderem als Varianten von ifs und whiles treffen können. Sie werden die Mustererkennung (Pattern Matching) in Erlang und die Vereinigung (unification) in Prolog kennenlernen. Collections ( Sammlungen ) spielen in nahezu jeder Sprache eine wichtige Rolle. Bei Sprachen wie Smalltalk und Lisp definieren Collections die Charakeristika der Sprache. Bei anderen, wie C++ und Java, sind Collections überall verstreut und definieren das Erleben des Benutzers durch ihr Fehlen und ein geringeres Maß an Stringenz. So oder so sollte man sich mit Collections gut auskennen. Welche Kerneigenschaften machen die Sprache einzigartig? Einige Sprachen besitzen fortgeschrittene Fähigkeiten für die nebenläufige Programmierung (concurrent programming). Andere bieten einzigartige High-Level-Konstrukte wie etwa Clojures Makros oder Ios Message-Interpretation. Andere bieten eine leistungsfähige virtuelle Maschine, wie etwa Erlangs BEAM: Dank ihr kann man mit Erlang fehlertolerante, verteilte Systeme wesentlich schneller aufbauen, als es mit anderen Sprachen möglich ist. Einige Programmiersprachen unterstützen Programmiermodelle, die sich auf ein bestimmtes Problem konzentrieren. Etwa die Verwendung von Logik zur Lösung von Beschränkungen (constraints). Wenn Sie mit diesem Buch fertig sind, werden Sie kein Experte für eine dieser Sprachen sein, aber Sie werden wissen, welche einzigartigen Eigenschaften sie besitzen. Sehen wir uns die Sprachen an. 1.2 Die Sprachen Die Auswahl der Sprachen für dieses Buch war wesentlich einfacher, als Sie vielleicht glauben: Ich habe einfach potenzielle Leser gefragt. Nachdem wir uns alle Daten näher angesehen hatten, blieben acht Kandidaten übrig. Ich habe JavaScript gestrichen, weil es mir zu beliebt ist, und durch die zweitpopulärste Prototypsprache Io ersetzt. Ich habe auch Python gestrichen, weil ich nur eine objektorientierte Sprache wollte und Ruby höher auf der Liste stand. Das schuf Raum für einen überraschenden Kandidaten, Prolog, das auf der Liste unter den Top- Ten war. Hier die Sprachen, die es geschafft haben, sowie die Gründe für ihre Wahl: