Darwins Erbe im Computer
Von Alan Turings Ideen zur Künstlichen Intelligenz über die zellulären Automaten des John von Neumann bis hin zu modernen Konzepten der Programmierung kommerzieller Software-Projekte finden sich Spuren von Charles Darwins Evolutionsgedanken auch in den Computerwissenschaften wieder. Die Entwicklung führt dabei aber nicht nur zu "sexy Code", sondern auch zu fossilen Programmiersprachen und Software, die nie das Betastadium verlässt.
Man könnte es als eine Laune der menschlichen Natur bezeichnen, dass ausgerechnet ein Enkel des Naturforschers Darwin die Bedeutung eines Artikels von Turing nicht erkannte und mit den Worten ablehnte, das sei ein Schulaufsatz.
Sir Charles Galton Darwin nämlich leitete bis 1948 das National Physical Labratory (NPL) in England, und er war alles andere als angetan, als er sich Turings Aufsatz "Intelligence Machines" durchlas, schrieben die neuseeländischen Philosophen Jack Copeland und Diane Proudfoot in ihrem Aufsatz über Turings zunächst "vergessene Ideen".
Heute zählen diese Arbeiten, die Turing kurz nach dem Krieg verfasste, zu jenen Werken, die die Anfänge von neuronalen Netzwerken prägten. Turing beschäftigte sich darin weniger mit Mathematik und Technik, sondern mit Neurologie und Psychologie und formulierte die Idee, dass ein ausreichend komplexes mechanisches System die Fähigkeit zu "lernen" erlangen und schließlich sogar Schmerz und Freude empfinden könnte.
Aufsätze zum Thema:
Von biologischen Systemen lernen
Von der Natur ließen sich in den 1940er Jahren auch andere IT-Pioniere inspirieren. Stanislaw Ulam und Von Neumann zum Beispiel entwarfen die Theorie der zellulären Automaten. Der Mathematiker Stephen Wolfram ("A New Kind of Science") beschreibt diese Idee als "einfache mathematische Idealisierung von natürlichen Systemen".
Von Neumann versuchte mit dieser Theorie aufzuzeigen, dass die Fortpflanzung eine Charakteristik sowohl von biologischen als auch von Computersystemen sei.
Nerven zeigen
Das Nervensystem zum Vorbild nahmen sich Anfang der 1940er Jahre die Kybernetiker Warren McCulloch und Walter Pitts. Mit Neural Computing versuchten sie, gleich zwei Fliegen mit einer Klappe zu schlagen: Indem man sich das Nervensystem von lebenden Organismen zum Vorbild nehme, so die Annahme, könne man auch das Rätsel Gehirn lösen.
Und indem man beim Bau von Rechenmaschinen den Prinzipien der Informationsverarbeitung des Gehirns folge, erhalte man auch gleich die Chance, "intelligente" Rechenmaschinen zu bauen.
Das Prinzip Optimierung
Aber nicht alle Wissenschaftler, die sich bei ihrem Computerdesign von biologischen Systemen beeinflussen ließen - Stichwort künstliche Intelligenz - dachten dabei an das Gehirn. Schließlich gibt es auch Darwin und seine Theorien zur Entstehung der Arten. Anstatt den Merkmalen eines einzigen biologischen Systems nachzueifern, ließen sich die Anhänger von evolutionärem Computing von der dynamischen Entwicklung ganzer Spezies inspirieren.
Gleich drei Forschungsrichtungen wurden in den 1960er Jahren dazu kreiert. Lawrence Fogel in den USA ersann den Begriff evolutionäres Programmieren. Der 2007 verstorbene Wissenschaftler wollte durch die Erschaffung einer Population von Software-Agenten die Optimierungstechniken der Natur im Computer simulieren.
Überlebensfähiger Code
Sein Kollege John Holland nannte seine Arbeit zum selben Thema Genetic Algorithm. Dafür nimmt man, vereinfacht gesagt, zwei unterschiedliche Bit-Strings, die als "Eltern" fungieren, schneide sie in der Mitte auseinander und klebe Prä- und Suffix neu zusammen - schon ist ein "Codekind" geboren, das dann seine Überlebenstüchtigkeit unter Beweis stellen muss.
Ein anders Optimierungsverfahren strebten die beiden deutschen Wissenschaftler Ingo Rechenberg und Hans-Paul Schwefel mit ihrer Evolutionsstrategie an. Dabei geht es um die Nachbildung von Vorgehensweisen, die zum Beispiel Insekten entwickelt haben. Derzeit stößt ein Besucher am Institut für Bionik in Berlin auf eine Art Aquarium im Eingangsbereich. Darin werden Sandfische aus der Sahara gehalten, die schon deswegen interessant sind, weil sie mit "kleinster Festkörperreibung und minimalen Antrieb unter dem Sand der Dünen schwimmen", verrät die Homepage.
Evolution und Schwarmintelligenz
In den frühen 1990er Jahren wurden diese drei Forschungsrichtungen schließlich zusammengeführt und werden seitdem unter dem Begriff Evolutionary Programming diskutiert. Natural Programming ist ein weiterer, etwas jüngerer Begriff, der die Vielzahl der Entwicklungen in diesem Bereich vereinen soll: Swarm Intelligences zum Beispiel, das Erforschen und mathematische Abbilden des Schwarmverhaltens von Insekten, Delphinen, Ameisen, Bienen und Vögeln.
Die Prinzipien einer maschinellen Evolution
Auch der US-Computerexperte Richard Gabriel glaubt in der Softwareentwicklung evolutionäre Mechanismen am Werk zu sehen. Gabriel, der die Programmiersprache Common Lisp mitentwickelt hat, wird von seinen Freunden gerne als "Zar der Java-Community" bezeichnet. Genauso wie ein Organismus ist für ihn auch ein Programmcode von mehr oder weniger zufälligen Veränderungen betroffen.
Fossile Programmiersprachen
Wer erinnert sich heute noch an die von Jean Sammet in den 1960er Jahren entwickelte Sprache FORMAC (FORmula MAniputlation Compiler) und an "Gedanken", eine von John Reynolds in den 70er Jahren entwickelte Programmiersprache?
Auf der anderen Seite prägt das von Von Neumann und Kollegen forcierte Stored Programming Concept noch immer unseren Alltag am Computer. Es besagt, dass sich Programmbefehle wie auch Daten einen Speicher teilen sollen.
Sexy Code
Damit ein Code überlebt, muss er nicht nur "schön" sein, sondern er sollte auch in der Lage sein, sich zu reproduzieren. In diesem Punkt unterscheidet er sich nicht allzu sehr vom Menschen. Auch ein Programmcode sollte in der Lage sein, neue Verbindungen einzugehen.
Weiters steigen die Überlebenschancen, wenn die "Fitnessfunktion" stimmt. Sie entscheidet vielleicht darüber, ob ein Code einen längeren Zeitraum überlebt oder in den Tiefen von Sourceforge für immer verschwindet. "Der Fantasie in der Programmierung seien keine Grenzen gesetzt", meint Gabriel.
Fit nach drei Versionen
Das Muster der Evolution ist für Gabriel, der heute die Gestaltungsprinzipien sehr großer Systeme erforscht, bei vielen Dingen erkennbar. Auch bei der Entwicklung von kommerzieller Software. Software-Firmen, so Gabriel, durchliefen bei ihrer Codeproduktion mehrere Evolutionsschritte. Es brauche immer mehrere Anläufe und Releases, bis die Programme tatsächlich benutzbar seien. Das hänge mit dem evolutionären Designprozess zusammen, dem sich die meisten Unternehmen verschrieben hätten. Gabriel gliedert diesen Prozess in drei Phasen.
Für das erste Release klaubt man wahllos aus ähnlichen, bereits existierenden Programmen die eine oder andere Charakteristik heraus und flickt diese Teile mehr recht als schlecht neu zusammen. Nichts funktioniert perfekt, aber das Programm läuft und kommt somit auf den Markt. Early Adopter geben nützliches Feedback, und für die Entwickler selbst ist es von Vorteil, ihre Weiterentwicklungen anhand von etwas Konkretem voranzutreiben. Das helfe ihnen, so Gabriel, das Produkt besser zu verstehen und zu erkennen, wie das Design eigentlich von Anfang an hätte sein sollen.
Vom Konkurrenten lernen
"In dem Fall, dass sie auf dem Markt einen Konkurrenten haben, wird der Aspekt der sexuellen Reproduktion eingeführt", sagt Gabriel. Wenn zwei identisches Produkte von zwei unterschiedlichen Firmen auf den Markt kommen, so ist es mehr als wahrscheinlich, dass das Konkurrenzprodukt genauer unter die Lupe genommen wird: Bietet es mehr? Funktioniert es besser? So lauten in diesem Fall die Designfragen, die dazu führen, dass ein fremder Code übernommen und ein eigener verworfen wird.
Der Markt bekommt die Ergebnisse dieser Codeversion unter dem Label Version 2 serviert. Wieder warten die Produzenten gespannt auf Reaktionen, die der Version 3 den finalen Schliff verleihen. Im Vergleich mit den Reproduktionsmethoden des Genetic Programming sind drei Evolutionsschritte durchaus wenig. 5.000 Durchläufe und mehr sind dort keine Seltenheit, bis ein Code generiert wird, der funktioniert.
Langsame Evolution
Diese Tatsache, so Gabriel, sollten sich all jene zu Herzen nehmen, die heute versuchen, mit genetischen Algorithmen große Systeme zu entwickeln. Derzeit kommt es dabei zu Mutationen, die sich Menschen nicht mehr erklären können: So funktioniert zum Beispiel in einem Forschungsprojekt über programmierbare integrierte Schaltkreise (FPGA) der mit genetischen Algorithmen entworfene Chip nur dann, wenn eine Zelle vorhanden ist, die weder mit irgendeiner aktiven Zelle des Chips in Verbindung steht noch messbare Impulse aussendet.
Es sei das wahrscheinlich "die bizarrste, mysteriöseste und unkonventionellste Entwicklung eines Chips", kommentierte Adrian Thomson das Ergebnis seiner Arbeit zu evolutionärer Hardware.
Die Fortpflanzung der Bugs
800 Milliarden Codezeilen, so der Amerikaner Grady Booch, seien seit 1945 geschrieben worden. Eine stolze Zahl. Und trotzdem, so Richard Gabriel, sind Programmierer nicht besonders gut darin, große Systeme zu erschaffen oder gar zu kontrollieren.
Das Dilemma derzeit ist nur, dass heute keiner sagen kann, was passiert, wenn einmal ein zur Reproduktion fähiger Code in großen Systemen anfängt, verrückt zu spielen. Viren und Trojaner bieten da nur einen kleinen Vorgeschmack.
(Mariann Unterluggauer)
