Florian octo Forster's Homepage

Perl vs. PHP; octo's subjektiver Vergleich

Inhalt

Ich habe diesen subjektiven Vergleich im Jahr 2005 geschrieben. Er ist an dieser Stelle noch zu lesen, weil Speicherplatz und Transfervolumen billig sind. Außerdem amüsiert es mich prächtig, hin und wieder über die Referrer-Logs auf ein Forum voller PHP-Fankiddies zu stoßen, die sich nach der Lektüre dieser Seite gegenseitig auf die Schultern klopfen müssen.

Gemein haben die Teilnehmer dieser Foren normalerweise, dass sie nicht wissen was „subjektiv“ heißt (oder, dass sie keine Überschriften lesen). Daher an dieser Stelle noch einmal ausdrücklich: Dieser Vergleich versucht nicht objektiv zu sein. Implizit oder explizit geäußerte Meinung ist beabsichtigt und genau das, eine persönliche Meinung. Ein neutraler Standpunkt ist nicht die Absicht dieses Textes!

Des weiteren möchte ich anmerken, dass ich meine persönliche Meinung zwischenzeitlich geändert habe; zwar nicht zu Gunsten von PHP, aber zum Nachteil von Perl. Allen, die ernsthaft Anstoß an dieser Seite nehmen, rate ich: Werdet erwachsen und lernt C! —octo

Vorwort

»PHP (recursive acronym for "PHP: Hypertext Preprocessor")«, so steht es in Kapitel Eins der PHP Dokumentation. "Perl" dagegen ist ein Akronym für "Practical Extraction and Report Language". Warum sollte ich meine Zeit damit verschwenden, einen HTML-Preprocessor, der vermutlich als Preprozessor schon m4 unterlegen ist, mit einer Sprache, die für Strings und String-Bearbeitung jeglicher Art geschrieben wurde, vergleichen? Schließlich vergleiche ich ja auch nicht ein Bierfass mit einer Tropfschale oder einen schweizer Taschenmesser mit einer Nagelfeile.. Der Grund ist, dass viele Benutzer der Nagelfeile, sich selbst PHP-"Programmierer" nennend, über eine krass verzerrende Wahrnehmung verfügen. Sie behaupten nicht nur, dass es PHP mit Perl aufnehmen könnte, sondern denken sogar Argumente dafür zu haben, dass PHP eine Programmiersprache sei.

Um den Vergleich zumindest ein bisschen objektiv zu machen gehe ich nur auf generelle Aspekte und Bereiche rund um dynamische Webinhalte ein. Immerhin das Gebiet auf dem PHP noch die beste Figur macht und, leider, "Marktführer" ist. Der Einfachheit halber beziehe ich mich manchmal auf mod_perl, auch wenn ich von Perl spreche. Sollte ich hier versehentlich grobe Unwahrheiten verbreiten, lasst es mich bitte wissen. Jetzt aber viel Spass ;)

Generelle Merkmale

Perl / mod_perl PHP
Variablen Perl kennt Scalare, Arrays und Hashes. Dabei unterscheiden sich Scalare noch, unter Anderen in Strings, Nummern und Referenzen. Variablen können (Modul-)Global, Modul-Privat oder lexikalisch deklariert werden. Mit sogenannten "Closures" kann man auch eine Art "Funktions Globale" Variablen erzeugen. PHP kennt Scalare und "associative Arrays", also Hashes. "Referenzen" sind eigentlich Variablen-Aliase; "richtige" Referenzen existieren nicht. Variablen können nicht deklariert werden, bzw. können deklariert werden, aber das hat keinen Einfluss auf die Lebensdauer der Variable und macht auch sonst keinen Unterschied. Namespaces gibt es nur in der Form, dass eine Funktion ihren eigenen Namespace haben kann (wenn dies in der php.ini entsprechend aktiviert wurde) und in diesen dann die globalen Variablen importieren muss, falls sie diese benutzen möchte.
Einsatzgebiete Kann vielfältig für fast alle Aufgaben eingesetzt werden. Die Ursprüngliche String- und Dateiverarbeitungssprache ist mit ihren Aufgaben gewachsen und gilt heute als "duct tape of the internet". Ist praktisch auf Web-Anwendungen beschränkt. Es besteht zwar die Möglichkeit, PHP mit "CLI" zu bauen, aber selbst dann muss man den Interpreter mit php -q aufrufen um einen HTTP-Header zu unterdrücken. Tatsächliche, Nicht-Web-Programme, die in PHP geschrieben sind, sind extrem selten und akademischer Natur.
Dokumentation Perl selbst umfasst über 100 Manpages, die von der Sprach-Syntax bis zu Implementierungsdetails alles abdecken was wissenswert über Perl ist oder sein könnte. Homepages rund um CPAN bieten für alle und jedes Perl-Modul die entsprechende Dokumentation als Webpage an. Ist das Modul erst mal installiert kann die Dokumentation durch den Integrierten POD-Mechanismus leicht eingesehen, in Manpages umgewandelt und auf andere Art und Weise weiterbehandelt werden.
$ man php
No manual entry for php
Sagt das nicht schon alles? Die Dokumentation auf der Homepage behandelt zwar auf den ersten Blick alle möglichen "Module", aber der Teufel steckt im Detail: So werden "deprecated functions" garnicht mehr dokumentiert - auch wenn es in älteren Versionen keine Alternative gibt und sich das Interface inzwischen geändert hat (Beispiel: domxml_open_mem und xmldoc). Häufig werden Konstanten zwar aufgelistet, eine Beschreibung über ihre Wirkung aber fehlt (Beispiel: DOMXML_LOAD_SUBSTITUTE_ENTITIES). Und ich bin über das DOM-XML-Modul noch nicht hinausgekommen..
Erweiterbarkeit Das Comprehensive Perl Archive Network (kurz: CPAN) beherbergt und strukturiert unzählige Perl-Module um den Funktionsumfang quasi beliebig auszubauen. Mit XS und SWIG stehen zwei leistungsfähige Schnittstellen zur Integration von C-Code zur Verfügung. Module in dem Sinn existieren nicht. Dateien, die eingebunden werden, werden komplett in den jeweiligen Namespace geladen. Libraries, die lediglich eine C-Schnittstelle besitzen müssen in den PHP-Interpreter gelinkt werden, was für Produktivsysteme keine Option ist.
Beständigkeit Syntax und Semantik der Perl-Primitiven hat sich seit der Version 5 nicht mehr geändert. Für die "Pragmas" und Module gilt das nicht so uneingeschränkt: Das "warnings"-Pragma kam beispielsweise erst in der Version 5.6 dazu, die IO-Layer sind in der Version 5.8 neu. Die Kern-Funktionalität ist aber die gleiche geblieben. "Einstellungen", die das Verhalten des Interpreters ändern, werden durch das Laden bestimmter "Pragmas" vorgenommen und sind so von jeden Script selbst zu bestimmen. PHP's Beständigkeit leidet darunter, dass alle "Module" Bestandteil der Sprache sind. Daher werden dauernd neue Funktionen hinzugefügt und alte umbenannt, ändern sich Parameter und verschwinden Konstante; und das sogar zwischen Patch-Versionen. Zum Beispiel hat sich die Semantik der Funktion imagegd2 zur Version 4.3.2 hin geändert. Das größte Problem allerdings ist, dass wichtige Verhaltensmerkmale von globalen Einstellungen in der php.ini anhängen. So zu programmieren, dass der Code unabhängig von Einstellungen in dieser Datei ist, ist eine Herausforderung der sich die Wenigsten stellen.
Geschwindigkeit Zwar ist es nicht gerade sinnvoll sich bei Scriptsprachen Gedanken über die Performance zu machen, aber wer sich trotzdem dafür interessiert kann im The Computer Language Shootout nachlesen dass Perl schneller ist als PHP.

Web-Tauglichkeit

Perl / mod_perl PHP
Strings Perl kennt zahlreiche Wege Strings zu definieren. Neben den typischen single- und double-quotes werden sogenannte "here-doc"- und "Quote-Like"-Operatoren zur Verfügung gestellt. Konstrukte wie qq( ... ) machen in einer Umgebung mit vielen Quotes im String das Leben leichter. "here-doc"-Operatoren können auch in Funktionsaufrufen und ähnlichen Umgebungen verwendet werden. PHP bietet ebenfalls single- und double-Quotes an und beherrscht "here-doc"-Operatoren. Die here-docs funktionieren aber anders als in der Bourne Shell und Perl. Nicht nur, dass PHP das Konstrukt "<<<" verwendet, auch das Semikolon folgt auf das schließende Wort. Ausserdem gibt es keine Möglichkeit die Variablenersetzung auszuschalten oder here-docs in Funktionsaufrufen zu verwenden. Eine weitere Besonderheit von PHP sind "magic quotes": Dieses tolle "Feature" escaped in allen Strings, die als Parameter übergeben werden, die Quote-Zeichen. Das ist sehr sinnvoll, weil.. Ja, warum eigentlich? Escapen funktioniert in HTML nicht mit Backslashes und auch SQL verwendet »""«..
Webserver-Integration mod_perl kann als "Handler" für jede der elf Phasen eines HTTP-Requests dienen. Eine dieser Phasen ist die "Response Phase", alle anderen haben mit der Generierung der Contents wenig zu tun. Entsprechend vielseitig kann mod_perl zum Beispiel zum Loggen in Datenbanken, Zugriffsbeschränkungen und vieles weitere eingesetzt werden. mod_perl Module wie Apache::ePerl stellen in HTML eingebettetes Perl, ganz ähnlich zu PHP, zur Verfügung. PHPs Interaktion mit dem Webserver ist mehr oder weniger auf die Variable $_SERVER beschränkt, mit der man ein paar Informationen über den Webserver erfragen kann. Ansonsten eignet sich PHP nur um Content zu generieren. Und selbst hier muss man sich vorsehen, dass PHP nicht von selbst behauptet es handle sich um text/html..

Datenbankinteraktion

Perl / mod_perl PHP
FlatFile Datenbanken Mit dem core-Modul DB_File besteht eine komfortable und mächtige API zur Berkley DB. Auserdem existiert noch das AnyDBM_File Framework als einheitliche Schnittstelle zu weiteren DBM Formaten. PHP bietet zwar auch die Möglichkeit auf viele Datenbanken zuzugreifen, aber weder durch eine einheitliche API (zur Zeit, also August 2005, gibt es 13 verschiedene connect-Befehle) noch sind zusätzliche Datenbanken problemlos nachrüstbar. Platzhalter in Queries, die das Kompilieren weiterer Anfragen ersparen, sind genausowenig möglich wie ein sinnvoller Umgang mit Transaktionen.
Relationale Datenbanken Die DBI wurde als API für Datenbanken konzipiert. Diese extrem mächtige Rahmenstruktur ist Datenbank unabhängig und bedient sich sogenannter "DBD"s, die die Treiberschicht zwischen der DBI und der eigentlichen Datenbank bilden. Diese DBDs sind für fast (?) alle Datenbanken verfügbar, zum Beispiel: mySQL, PosgreSQL, CVS, Oracle und sogar ODBC und Excel.
Persistenz Datenbank-Verbindungen und Statement-Handles können halbwegs problemlos persistent angelegt und verwendet werden. Der Programmierer muss sich allerdings entweder selbst darum kümmern oder explizit Apache::DBI verwenden. Datenbank-Verbindungen werden per default versucht persistent zu halten. Das Problem ist vielmehr, dass auch Ergebnisse gecached werden, was bei unvorsichtigem Umgang zu Massenvernichtung von Arbeitsspeicher führt. Und Usern, für die "magic quotes" eingeführt wurden, unterstelle ich einen unvorsichtigen Umgang.

Grafikerstellung

Dynamische Grafiken stehen fast schon so häufig auf dem Programm eines Webdesigners wie dynamische Webseiten. Ob das nun grundsätzlich gut oder schlecht ist, ist eine andere Geschichte. Sowohl Perl als auch PHP bieten Möglichkeiten, Grafiken "on-the-fly" zu erzeugen. Perl wie gewohnt mit Hilfe von Modulen, PHP wie erwartet mit "build-in"-Funktionen.

Perl / mod_perl PHP
GD Das Modul GD.pm von Lincoln Stein stellt die komplette GD-API unter Perl zur Verfügung. PHP hat, falls zur Zeit des kompilierens mit der GD verlinkt, ebenfalls die Funktionalität der GD. Dass dazu Tausend und eine Funktion in den default "Namespace" importiert werden werden PHP Anhänger vermutlich noch zur Design-Ideologie erheben..
Andere Im CPAN finden sich viele weitere Module für grafische Belange, von alternativen Formaten, wie "VRML", über alternative Bibliotheken, etwa Image::Magick, bis zu Graph-Modulen wie GD::Graph. Von den Möglichkeiten, die die Gimp-Integration eröffnen ganz zu schweigen.. PHP besitzt Support für einige wenige weitere Formate, zum Beispiel "SWF". Für einzelne Anwendungsgebiete, etwa das Zeichnen von Graphen, gibt es Code von externen Anbietern.

Persönliche Gründe

Meine ganz persönlichen Gründe die eine Programmiersprache zu bevorzugen und eine andere nicht zu mögen unterliegen weder obligatorischen Zwängen, faktischer oder politischer Korrektness noch objektiver Auseinandersetzung mit der anderen Sprache. Nur um es nochmal zu betonen: Diese gesamte Gegenüberstellung ist subjektiv!

für Perl / mod_perl gegen PHP
  • Ich kenne einige Perl-Freaks aber kaum (fähige) PHP-"Programmierer".
  • Das Perl-Logo ist definitiv cooler.
  • Es gibt coole Perl-T-Shirts.
  • Larry Wall gibt coole Zitate von sich.
  • slashdot benutzt Perl
  • "hash" klingt besser als "associative array".
  • Meine Ausgabe der "PHP Pocket Reference" ist ein Fehldruck.
  • Ein nicht unwesentlicher Teil meiner Arbeit ist, die Fehler von PHP-"Programmierern" zu lösen..
  • Das Syntax-Highlighting vom vim für PHP ist hässlich.