Kleine Scharmützel am Entwicklerstammtisch zwischen den Anhängern unterschiedlicher Progammiersprachen sind zwar meist unterhaltsam, verlaufen aber in der Regel ergebnislos. Wirklich vereint ernsthafte Entwickler nur die allerletzte Erkenntniss, dass die Frage nach der einen, der einzigen, der universellen Programmiersprache eher akademischer Natur ist. Allgemeine Zustimmung findet da meist auch die These, dass sich unterschiedliche Sprachen für manche Anwendungsszenarien besser oder schlechter eignen als andere.
Um in diesen Sprachverwirrungen einen Überblick zu gewinnen, hat das Linux-Magazin prominente Entwickler gebeten, eine überschaubare Programmieraufgabe in ihrer Lieblingssprache zu lösen. Gefordert war, eine Textdatei neu zu sortieren, deren Fußnoten durcheinandergeraten sind (siehe Kasten "Die Spezifikation der Aufgabe"). Der Algorithmus zur Lösung sollte keinen Sprachpapst vor unlösbare Herausforderungen stellen, und die Teilnehmer sollten sich weniger in einem Programmierwettbewerb wähnen, sondern sich eher als Botschafter der Konzepte der unterschiedlichen Sprachen verstehen. Aus diesem Grund durften sie die Aufgabenstellungen in einem gewissen Grad variieren, wenn sie das glaubhaft rechtfertigen konnten.
Primär war also nicht, wer die Aufgabe mit den wenigsten Zeilen löst oder welcher Code am schnellsten läuft, sondern wie die in den Sprachen angelegten Denkmodelle sich in den Lösungen niederschlagen.
|
Ein Text möge ungeordnete Fußnoten enthalten. Am Ende des Textes folgt ein getrennter Abschnitt, der auf die Verweise im Text Bezug nimmt. Jede Fußnote zeigt genau zu einem Verweiseintrag, es darf jedoch mehrere Fußnoten geben, die auf den gleichen Eintrag verweisen. In der Eingabedatei sind sowohl Fußnoten als auch die Verweiseinträge am Textende ungeordnet, beide beginnen nicht notwendigerweise mit 1, die Reihenfolge darf Lücken aufweisen. Die Lösung ist ein Programm, das die Fußnoten aufsteigend nummeriert. Format
Die Eingabedatei besteht aus Text, kodiert im Format ISO-8859-15, und enthält Fußnoten der Form »[13]«. Die Fußnoten dürfen überall im Text stehen, allerdings steht der Verweis immer ungetrennt auf einer Zeile.
Die eigentlichen Einträge folgen am Ende des Textes nach der Markierung »@footnote:«. Alle Nummern in eckigen Klammern nach dem Marker sind folglich Verweisziele, keine Verweise. Beispiel:
A great brown fox [13] jumped of a pile
of lorem ipsum [4], [7]. He met with a
silver penguin, browsing the Linux Kernel
Mailinglist [3]. They debated other the
question whether to start a C-program with
"main (int argc, char **argv)" or with
"main (int argc, char *argv[])". Square
brackets annoyed them [9999].
@footnote:
[13] Al Fabetus: "On characters and animals", 1888, self published.
[4] Lorem Ipsum, <a href="http://en.wikipedia.org/wiki/Lorem_ipsum">UWeb Link</a>
[9999] Annoying Link.
[7] B. Fox: "More on Blind Text".
[3] Linux Kernel Maintainers: LKML
Die Aufgabenstellung bearbeitet eine einzelne Textdatei, deren Namen ihr der Anwender als Aufrufparameter nennt. Das Ergebnis dazu erhält er direkt auf der Standardausgabe. Die Texte können von sehr unterschiedlicher Länge sein, angefangen von einigen wenigen KBytes bis hin zu mehreren Hundert MBytes.
Die Nummerierung der Implementierung soll einer der beiden folgenden Varianten folgen oder beide ermöglichen:
-
Die Einträge im unteren Abschnitt sind aufsteigend ab 1
nummeriert. Die Fußnoten tragen entsprechende Nummern, die diese Reihenfolge reflektieren.
-
Die Fußnoten im eigentlichen Text sind aufsteigend
numeriert. Wenn mehrere Fußnoten auf den gleichen Eintrag
zeigen, wiederholt sich im Text die Nummer des ersten Auftretens.
Die Einträge im zweiten Textteil sortiert das Programm entsprechend um, sodass diese ebenfalls sortiert sind.
|
Fünf Kandidaten auf dem Prüfstand
Ins Feld zogen schließlich PHP, Perl, Java, Python und Java FX. Gern hätte die Redaktion auch Ruby und andere antreten lassen, allein es erklärten sich keine VIPs dafür bereit. Alle Lösungen, die dieser Artikel in der Reihenfolge ihres Eingangs in der Redaktion präsentiert, konnten die geforderte Aufgabe lösen, auch wenn einzelne Entwickler kleine Modifikationen vorgenommen haben. Der Test bewertet dabei aber nicht nur die programmiertechnische Korrektheit, sondern auch den Ressourcenverbrauch des Programms.
Ein Thinkpad X60s im 32-Bit-Modus unter einem Intel Core Duo L2400 mit 1,6 GHz diente als Testsystem. Den vorhandenen üppigen Speicherausbau von 3 GByte schöpfte allerdings keines der Programme aus. Für die Messung zogen die Tester eine 55 MByte große Datei heran, in die sie eine Million zufällige Fußnoten eingetragen hatten.
PHP
PHP ist eine für Webanwendungen optimierte Skriptsprache mit einer C-ähnlichen Syntax, die als vergleichsweise leicht zu erlernen gilt [1]. Die Sprache ist schwach typisiert, seit Version 4 (ab Mitte 2000) enthält PHP erste Sprachkonstrukte für objektorientierte Programmierung, die Version 5 (ab Mitte 2004) vervollständigt.
Viele verbreitete Webanwendungen wie Typo3 [2], Wordpress [3] oder Joomla [4] sind in PHP geschrieben. Der Repository-Crawler Ohloh.net [5] bescheinigt der Sprache mit 107 Kernentwicklern eines der größten Teams in der Open-Source-Welt. Als Mängel gelten Inkonsistenzen der Syntax wie unterschiedliche Parameterreihenfolgen bei Funktionen mit ähnlicher Aufgabe, das fehlen eines Bytecode-Cache, fehlende Thread-Sicherheit, was den Einsatz des Apache-MPM Worker ausschließt, sowie die erst für Ende 2008 in Version 6 erwartete durchgängige Unicode-Untersützung [6].
Der Einsender der PHP-Lösung, Zeev Suraski (siehe Abbildung 1), entwickelte 1998 zusammen mit Andi Gutmans PHP 3, das auf der Konzeption von Rasmus Lerdorf basierte.
Abbildung 1: Zeev Suraski gründete zuammen mit Andi Gutmanns die Firma Zend, die nach wie vor treibende Kraft hinter PHP ist.