Open Source im professionellen Einsatz
Linux-Magazin 03/2015
© Eugene Sergeev, 123RF

© Eugene Sergeev, 123RF

Mixed-Language-Programmierung in Perl

Volle Fahrt voraus

Der Perl-Interpreter perl ist in C geschrieben und bietet recht komfortable Schnittstellen, um ihn mit erstaunlich schnellen Zusatzfunktionen auf Maschinenebene aufzupeppen. Allerdings profitieren nur ganz bestimmte Anwendungen tatsächlich vom Mixed Language Programming.

462

Um gar nicht erst auf Abwege zu geraten, bietet es sich für den Einstieg in das Thema Mixed Language Programming an, gleich auf eine Variante im Perl-Umfeld zu sprechen zu kommen, die fehl am Platze ist. Ein Beispiel: Neulich war der Blog-Artikel eines österreichischen Security-Hobbyforschers [1] zu lesen, der zu Testzwecken einen kostenlosen Internetproxy mit Malware manipulierte. Das dort vorgestellte Perl-Skript enthielt Zeilen wie

system("/usr/bin/wget","-q","-O" [...]

und illustrierte einen häufig von Perl-Neulingen begangenen Denkfehler: Statt Perls ausgeklügelte Funktionen zu nutzen, mutieren ihre Perl-Programme zu mittels »system()« -Anweisungen zusammengeschusterten Shellskripten.

Im hier gezeigten Code-Snippet hätte der Autor besser das Modul LWP::Single vom CPAN genutzt und damit eine zuverlässigere Fehlerbehandlung und bessere Wartbarkeit erreicht. Manchmal ist auch die benutzte Shellfunktion selber bereits in Perl verfügbar: Ein »system("chmod [...]")« ist deshalb unnötig und zudem umständlich, weil »chmod()« schon in Perl eingebaut ist.

Extend oder Embed?

Der Fachmann, der stattdessen die sinnvollen Anwendungen für die Verknüpfung von Perl mit einer anderen Programmiersprache, etwa mit C, betrachtet, unterscheidet grundsätzlich zwischen Extending und Embedding. Die Manualseite »perldoc perlembed« listet ganz am Anfang die einzelnen Varianten auf und verweist auf die jeweils zum Thema passende Dokumentation. Wer seine Perl-Skripte mit C-Code erweitern möchte, der betreibt Extending. Embedding ist hingegen das Einfügen eines Perl-Interpreters in ein schon vorhandenes C-Programm. Wer nicht gerade eine Perl-IDE in C schreibt, für den ist Embedding allerdings selten von Nutzen.

Mit C erweiterte Perl-Bibliotheken erfreuen sich hingegen großer Beliebtheit, und jeder Perl-Programmierer muss sich wohl ein paar Mal in seinem Berufsleben der oft nicht ganz einfachen Aufgabe stellen, eine solche Erweiterung selbst zu schreiben. Typische Erweiterungen in C implementieren neue Perl-Schnittstellen zu bereits vorhandenen C-Bibliotheken, entweder weil es in Perl noch kein Pendant zu Unix-Systemfunktionen wie beispielsweise »ptrace« gibt [2] oder weil eine rechenintensive Anwendung die Ausführung in einer maschinennahen Sprache nahelegt [3].

Vorsicht, Denkfehler!

Dabei wäre es ein gewaltiger Denkfehler anzunehmen, dass jedes Perl-Skript schneller liefe, wenn man es nur in C nachprogrammiert. Richtig ist zwar, dass der Perl-Interpreter seine Instruktionen generell langsamer abarbeitet als die CPU die kompilierten Anweisungen eines C-Programms durchjagt. Aber oft verbirgt sich hinter einer einzelnen Bytecode-Anweisung des Perl-Interpreters der Code aus Dutzenden von C-Programmzeilen, sodass der direkte Vergleich der Laufzeiten pro Zeile Programmcode hier in die Irre führt.

Außerdem verbringt ein typisches Programm seine Zeit hauptsächlich mit Warten. Warten auf Daten, die von der Festplatte oder einem Socket eintrudeln, oder einfach darauf, dass ein fremder Prozess oder Webserver auf eine gestellte Anfrage antwortet. Ist das der Fall, profitiert das entsprechende Perl-Skript praktisch niemals von einer Portierung auf schnellen C-Code.

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 4 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Perl-Snapshot

    Ein neuer Service auf Travis-ci.org listet fein säuberlich Github-Projekte eines Entwicklers auf, schickt den Code bei jedem Push durch deren Testsuites und gibt Rückmeldung, falls der Build bricht. In den zurückgelieferten Testergebnissen machen neugierige Perl-Skripte Zusatzinformationen sichtbar.

  • Perlskript Prereq-grapher malt Abhängigkeiten auf

    Der Perl-Programmierer Neil Bowers hat ein Skript namens Prereq-grapher veröffentlicht, das die Abhängigkeiten von Perl-Programmen und -Modulen grafisch darstellt.

  • Perl-Snapshot

    Damit ein Anwender schnell über womöglich ungewollte Zu- und Abgänge in seinem Netzwerk informiert wird, speichert ein Perl-Daemon periodisch die Daten von Nmap-Scans und gibt sie über ein eingebautes Webinterface an Nagios weiter.

  • Der Screencast zum Perl-Snapshot Linux-Magazin 08/2013

    Am Anfang war der Test: Loginsystem, agil entwickelt. Test-driven Development mit einer nebenbei generierten Testsuite verspricht Code mit weniger Fehlern. Michael "Perlmeister" Schilli betritt gleich den Pfad der Agilität und findet am Wegesrand zufällig ein passendes, nagelneues CPAN-Modul.

  • Getriebeschaden

    Dreht sich das Perl-Rad nur noch knirschend, sind vielleicht Fehler im Perl-Interpreter oder in Erweiterungsmodulen schuld. Der gute alte GDB inspiziert das Getriebe und kommt Problemstellen auf die Schliche.

comments powered by Disqus

Ausgabe 11/2017

Digitale Ausgabe: Preis € 6,40
(inkl. 19% MwSt.)

Stellenmarkt

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.