Y a-t-il un outil disponible qui convertira le code source dans Perl en code source en C? Toute plate-forme va bien. P>
6 Réponses :
La réponse va être à peu près "non". Perl est une langue extrêmement dynamique. C est une langue pour les types de données de taille statique. Toute traduction de Perl to C sera probablement quasiment "exécuter cet appel de sous-programme pour simuler ce que Perl fait" à plusieurs reprises. Et il y a peu de points dans la construction d'un tel traducteur, car il est peu probable que l'exécution de Perl beaucoup plus rapidement que Perl. P>
Eh bien, Perl a des types de données fixes, tout comme beaucoup d'entre eux. Le problème est que Perl est dynamique. Il peut compiler différemment en fonction de tout nombre de facteurs, ce qui peut modifier la manière dont le compilateur agit pour le code source à venir.
Il y a perlcc qui "traduit" Perl sur C. < / p>
Ce n'est pas vraiment un compilateur de Perl to C; Sa sortie est simplement un paquet de l'interprète Perl et le partsed Bytecode de votre programme. P>
Perlcc et B :: Les modules B :: sont maintenus séparément sur CPAN par REINII URBAN.
b :: C code> et
b :: cc code> semble être cassé à ce moment-là.
C'est décevant. Cython (C de Python) fonctionne bien et il est malheureux, il n'y a pas de solution de travail pour Perl.
La réponse canonique à ceci est MJD "Pourquoi ne pas traduire Perl à C? ". P>
-1, le vieil blogue ancien de MJD est de 2001 et longtemps obsolète. Vous ne gagnerez pas de différences avec des fonctions de manutention SPLIT et d'autres chaînes, mais vous obtiendrez beaucoup d'économies de mémoire, de temps de démarrage, de temps de destruction et de temps d'exécution pour l'int, le flotteur et l'ESP. Manipulation du tableau, car MJD a souligné à la fin de son poste. Voir par exemple blogs.perl.org/users/ Rurban / 2012/10 / ... pour une référence 6 fois plus rapide avec B :: CC compilé Perl.
Honnêtement, je suis revécu que ce qui suit est indiqué dans un commentaire, comme je sais qu'il est difficile d'avaler. La dure vérité .... Perl est lente comme l'enfer, mais être juste, de même que la plupart des interprètes, à l'exclusion de Lua. Ce poste est trompeur et répond à la question très étroitement. Si vous avez fait toutes les choses inefficaces de votre Perl, il sera toujours incroyablement lent. Maintenant, si vous réécrivez manuellement la signification de ce que votre code PERL accomplit, en C / C ++ / OCAML / Go ... Nous savons tous qu'il s'exécute de manière exponentielle plus rapide
Les deux articles sont de bonnes lectures. Je n'appellerais pas Perl lent comme l'enfer, pour ce que je dirais que je dirais que c'est rapide comme l'enfer et cela semble être si tout ce que vous faites est de la chaîne Manip et utilise les fonctions de base, alors c ne vous achètera pas beaucoup; avec la seule réserve de tableaux. Si j'ai bien compris le poste de M. Urbain de 2012 correctement, il semble que Perl ait un tas de flexibilité accompagnant qui se ralentit et s'il y avait une option pour en faire tomber, il ne serait toujours pas plus rapide que natif c, mais ne traînerait pas autant. Le programmeur devra savoir quand ils devraient optimiser.
Ajout de mes 2 x 0,01 €, en utilisant un couple de Libs de chaîne, puis traduisant manuellement Perl sur c, vous utilisez la lib quand une regex apparaît (...), puis beaucoup de choses vont beaucoup plus vite: quand vous connaissez le type gagné 'T Modification, évitez de nombreuses conversions STR / INT, en appliquant une recherche régulière Remplacer lorsqu'une regex n'est pas nécessaire, les sous-titres de Sous-tête, ... pourraient être des travaux de la 1ère conversion, mais devraient être plus faciles pour les prochains. En fait, je ferai ce genre de travail dans les semaines suivantes, je vous le ferai savoir;)
Le convertisseur est appelé un programmeur em> et le processus de conversion programmation em>. Sérieusement, la langue appropriée de Perl est si vaste et puissante que quiconque tenter d'écrire un convertisseur examinerait une tâche de vie. De plus, l'effet de l'amélioration des performances pourrait ne pas être un ordre de grandeur, alors pourquoi déranger? P>
J'ai écrit un programme assez important à Perl qui crée PDF en fonction des requêtes HTML et de base de données qui agissent pratiquement comme un navigateur. Le volume total de code source est supérieur à 1 Mo. Les programmes évaluient HTML, crée des requêtes SQL et récupère des données, recherchent des images sur le disque ou les télécharge à partir de serveurs HTTP, crée une structure de document, effectue toutes les calculs de mise en page et, enfin, produit un PDF.
Je devais savoir comment accélérer l'opération de différentes manières. Sur la base de cela, j'étère que Perl est assez rapide et de nombreuses tâches ont été remplies rapidement et avec succès à Perl prennent beaucoup de temps en C, et même C ++. P>
Il y a 2 façons de faire de la perl lente ou de consommer de la mémoire: un grand nombre de structures de données complexes - elles ont besoin de beaucoup de mémoire - et un grand nombre de calculs. Oui, le calcul est en effet très lent dans Perl. Un terme simple comme p> prend beaucoup de temps en Perl, mais très rapide dans n'importe quel langage compilé. Les opérandes peuvent même être des entiers, pas les variables de points flottants - c'est lent. Je suppose que c'est la raison pour laquelle Perl scores plutôt mauvais dans le concours de fusillade linguistique [http://shooooTout.alioth.debian.org/](Le jeu de référence de langue informatique). P> J'ai trouvé mon joli grand Le programme -Il utilise de nombreux modules CPAN et de nombreux modules CPAN supplémentaires pour commencer rapidement, malgré leur inteprétation. P> Il fonctionne très bien ... jusqu'à ce qu'il s'agisse du calcul des tailles de texte et des coordonnées de mise en page. C'est très chronométré. Après avoir déclaré cela, j'ai écrit de petits programmes de test Perl faisant des millions de calculs arithmétiques et les ont trouvés très lents. P> En plus, j'utilise et l'approche orientée objet pour modéliser chaque élément de mise en page. Chaque objet est représenté par un hachage - c'est au moins environ 10 kmbytes par objet. S'il existe une grande quantité de données à imprimer, une consommation de mémoire de plusieurs 100 MBYtes n'est pas inhabituelle pour ce programme. p> Donc, j'ai toujours une bonne raison de déplacer la pièce calculant la disposition en C, en utilisant des structures où je dispose maintenant de hachages avec des clés fixes et que cithégèrent l'arithmétique entier où Perl fait maintenant un travail lent. p> Mais tout le reste a été fait et testé rapidement et court si vite que je ne vois aucune raison de changer. Je trouve également le code Perl beaucoup plus pratique pour écrire et tester que C code. Et beaucoup de modules CPAN fournissent des solutions que vous n'avez pas à travailler vous-même. Beaucoup d'entre eux sont bien testés et documentés. P> Après cette dicussion assez longue, je conclus: s'il s'agit d'un programme de ligne de serveur ou de commande, envisagez Perl. Mais si ce programme doit renforcer d'énormes structures de données ou beaucoup d'arithmétiques, considérez quelque chose plus rapide. Parfois, il peut s'agir d'un programme Perl avec un module écrit en c. P> p>
"De nombreuses tâches sont complétées rapidement et avec succès à Perl prendre beaucoup de temps en C, et même C ++." I> Êtes-vous sûr de cela? N'oubliez pas que Perl est écrit en C, donc tout ce que Perl fait est déjà fait en C :-)
Il y a Perl aux traducteurs C, mais aucun n'est parfait. Idéalement, vous voudriez un traducteur à la fois correct et élégant. Hélas, vous ne pouvez pas avoir les deux, le code Perl simple n'est pas un code C simple équivalent, vous devez donc avoir une traduction à 100% correcte ou est aussi complexe que Perl elle-même. Cela a conduit certains pour croire que vous ne devriez pas essayer de traduire Perl. Il serait plus précis de dire que vous devez être clair ce que vous voulez réaliser de la traduction et ne pas vous attendre à des miracles. P>
100% correct est facile: si votre script Perl est myperl.pl alors le programme C RPPERL peut atteindre des économies de vitesse, mais est très limitée dans ce qu'elle peut traduire. p>
Pour un exemple de traducteur de "élégant mais non correct" trivial, voir le prototype perl2c ++. PL . Cela fonctionne en remplaçant (quelques-uns) standard perl-isms avec C ++ - ISMS. C ++ a été choisi car il s'agit d'une langue de haut niveau comme Perl, mais partage toujours la même éthique nue-métaux de c. P>
Dans le cas d'un simple générateur de nombres pseudo-aléatoires LCG LCG. PL , la sortie de Pour le logiciel pour lequel Perl convient bien, mais vous voulez simplement aller un peu plus vite, l'approche JIT utilisée par JavaScript (et finalement Perl 6) est plus prometteuse. P> vide () {système ("Système (" perl myperl.pl ")} code> fera exactement ce que myperl.pl ça ira; C'est plutôt inutile cependant. Le compilateur
perlcc code> est un peu plus sophistiqué, mais ne semble toujours pas donner beaucoup d'avantages. Je n'ai pas remarqué
perlcc code> étant plus rapide que Perl ordinaire. De plus, tandis que le code Perl peut être notoirement difficile à lire, je préfère
print "bonjour world \ n" code> à la monstruosité longue de 700 lignes que
perlcc code> le traduit. Je n'ai pas vu ces programmes produiraient quelque chose qui passerait une critique de code comme un code C écrit Elegant C. OTOH, si vous voulez un compilateur parce que vous ne souhaitez pas distribuer votre code source de manière non obscurcie, alors
perlcc code> pourrait faire des merveilles. p>
perl2c ++. PL code> est propre et succinct Code C ++ qui fonctionne des dizaines de fois plus rapidement que le Perl d'origine et ne dépend pas des bibliothèques PERL. Il pourrait être étendu pour rechercher toutes les réponses standard à "Comment faire x sur Perl" et le remplacer par "Comment faire x en C ++". Ensuite, cela pourrait traduire avec succès de nombreux scripts de Perl mondiaux simples mais réels et aider à traduire un logiciel Perl non trivial dans un code C ++ élégant. Cela serait très utile si vous vous trouvez en train de rédiger un logiciel numérique dans Perl qui aurait dû être écrit en C ++ en premier lieu. P>