[quote=betterworld,03.09.2005, 16:46]Besonders schlimm ist auch "eval". Im Prinzip muss jedes Programm, welches eval enthaelt, den ganzen Perl-Parser mit einkompiliert bekommen, wenn man es nach Assembler kompiliert.
Und selbst ohne eval muesste man den ganzen Code fuer Regulaere Ausdruecke etc immer mit einbinden, d. h. das wird nicht klein.[/quote]
Das ist zwar prinzipiell richtig, aber durchaus umgehbar: Wenn man alle statischen regulären Ausdrücke in Maschinencode kompiliert, kann man Programme, die weder eval noch variable reguläre Ausdrücke verwenden relativ klein halten -- und ziemlich viele Programme fallen, denke ich, in diese Kategorie.
Außerdem würde man natürlich das Laufzeitsystem, das System für Codegenerierung zur Laufzeit sowie den Perlparser jeweils in eine eigene dynamische Bibliothek packen, die man dann bei Bedarf linken kann.
Die weiter oben angemerkten Probleme mit der Speicherverwaltung sind auch keine echten Probleme, wie man an der Kompilierbarkeit vieler anderer Sprachen mit automatischer Speicherverwaltung sieht (z.B. Java durch gcj).
Das einzige wirkliche Problem ist also, dass noch niemand sich die Mühe gemacht hat, so einen Compiler zu schreiben, denn perlcc kann man beileibe nicht als ausgereift bezeichnen. Ich habe so das dumpfe Gefühl, dass die Perl Laufzeitbibliothek nicht mit dem Gedanken an einen Compiler entwickelt wurde, so dass man sie eigentlich fast neu schreiben müsste, um etwas anständiges auf die Beine zu stellen. Natürlich hat niemand Lust, so ein Projekt zu starten, zumal mit Perl 6 ja ein compilerbasiertes Perl kommen wird. Da wird man sicherlich wesentlich einfacher neben dem Parrot Backend auch ein native Backend einbauen können.
Was die Effizienz des Codes betrifft, so kann man sich sowieso trefflich darüber streiten, ob ein kompiliertes Programm, dass aber eine komplexe und umfangreiche Laufzeitbibliothek benötigt, wirklich deutlich effizienter ist, als ein gut interpretiertes. Das Konzept, das Perl da verfolgt ist eigentlich ziemlich brauchbar. Notfalls kann man ja immer noch die wirklich zeitkritischen Routinen in C oder direkt in Assembler implementieren und zum Beispiel mittels XSUB einbinden.
[edit: Absatz über Effizienz]\n\n
<!--EDIT|murphy|1125783967-->
When C++ is your hammer, every problem looks like your thumb.