2009-06-30 7 views
15

Dans mon nouveau travail, plus de gens utilisent Python que Perl, et j'ai une API très utile que j'ai écrite moi-même et que j'aimerais mettre à la disposition de mes collègues en Python.Existe-t-il des outils programmatiques pour la conversion de Perl en Python?

Je pensais qu'un compilateur qui compilait du code Perl en code Python serait vraiment utile pour une telle tâche. Avant d'essayer d'écrire quelque chose qui a analysé Perl (ou du moins le sous-ensemble de Perl que j'ai utilisé pour définir mon API), je suis tombé sur bridgekeeper à partir d'un cabinet de conseil.

Cela ne vaut certainement pas la peine que j'engage un consultant pour traduire cette API, mais c'est un outil vraiment intéressant.

Est-ce que quelqu'un sait d'un compilateur qui va analyser (ou essayer d'analyser!) Perl5 code et le compiler en Python? S'il n'y a pas une telle chose, comment dois-je commencer à écrire un compilateur simple qui analyse mon code Perl orienté objet et le transforme en Python? Y a-t-il une grammaire ANTLR ou YACC que je peux utiliser comme point de départ? Editer: J'ai trouvé perl.y, ce qui pourrait être un point de départ si je devais lancer mon propre compilateur.

Répondre

28

James,

Je vous recommande de simplement réécrire le module en Python, pour plusieurs raisons:

  1. Parsing Perl est DARN DIFFICILE. À moins que ce soit un exercice important et souhaitable pour vous, vous vous retrouverez à consacrer beaucoup plus de temps à la traduction qu'à un travail utile. En le réécrivant, vous aurez une grande chance de pratiquer Python. L'apprentissage est mieux fait en faisant, et avoir une tâche que vous avez vraiment besoin de faire est un grand avantage.
  2. Enfin, Python et Perl ont des philosophies assez différentes. Pour obtenir une API plus Pythonic, il est préférable de simplement la réécrire en Python.
+1

PERL est plein de constructions qui ne sont pas trivialement à Python traduisent. PERL nécessite un humain pour lire et comprendre l'intention derrière le code. –

+6

s/PERL/Perl/g (sauf si vous êtes plus suspect que je ne le soupçonne) – ijw

+0

@ijw: que signifie "s/PERL/Perl/g"? –

6

Je n'ai jamais essayé et il semble non maintenu, mais peut-être PyPerl est une option?

Quelle est la taille de cette API? Si c'est vraiment utile alors pourquoi ne pas le réécrire en python. L'écriture d'un convertisseur automatique prendra probablement plus de temps que la réécriture de l'API.

Et même si vous parvenez à le réécrire automatiquement, le code résultant ne sera probablement pas très pythonique de toute façon.

Assurez-vous de vérifier les réponses par weismat et eliben

+0

ou Inline :: Python –

16

Je pense que vous devriez réécrire votre code. La qualité des résultats d'un effort d'analyse dépend de votre style de codage Perl. Je pense que la citation ci-dessous résume très bien le côté théorique. de Wikipédia:. Perl in Wikipedia

Perl a une grammaire Turing-complet, car l'analyse syntaxique peut être affectée par code d'exécution de temps exécuté au cours de la phase de compilation [25] Par conséquent, Perl ne peut pas être analysé par une combinaison Lex/Yacc lexer/parser droite. Au lieu de cela, l'interpréteur implémente son propre lexer, qui coordonne avec un analyseur bison GNU modifié pour résoudre les ambiguïtés dans le langage.On dit souvent que "Perl seulement peut analyser Perl", ce qui signifie que seul l'interpréteur Perl (Perl) peut analyser le langage Perl (Perl), mais même cela n'est pas vrai en général. Étant donné que l'interpréteur Perl peut simuler une machine de Turing pendant sa phase de compilation, il doit décider du problème d'arrêt afin de terminer l'analyse dans tous les cas. C'est un résultat de longue date que le problème d'arrêt est indécidable, et donc même Perl ne peut pas toujours analyser Perl. Perl fait le choix inhabituel de donner à l'utilisateur l'accès à sa pleine puissance de programmation dans sa propre phase de compilation. Le coût en termes de pureté théorique est élevé, mais les inconvénients pratiques semblent être rares.

Autres programmes qui engagent à analyser Perl, tels que des analyseurs de code source et auto-pénétrateurs, doivent faire face non seulement avec des constructions syntaxiques ambiguës, mais aussi avec l'indécidabilité de Perl analyse syntaxique dans le cas général. Le projet PPI d'Adam Kennedy se concentrait sur l'analyse du code Perl en tant que document (en conservant son intégrité en tant que document), au lieu d'analyser Perl comme code exécutable (ce que Perl lui-même ne peut pas toujours faire). C'est Kennedy qui a le premier conjecturé que «l'analyse de Perl souffre du« problème d'arrêt ».» [26], et cela a été prouvé plus tard. [27]

7

À partir de 5.10, vous pouvez compiler Perl avec le Misc Attribute Decoration expérimental activé et la variable d'environnement PERL_XMLDUMP à un nom de fichier pour obtenir une décharge XML de l'arbre d'analyse syntaxique (y compris les commentaires - très utiles pour les traducteurs de langue). Bien que, comme le dit le doc, c'est un travail en cours.

4

Autant il peut être amusant de le convertir ou réécrire en python, je ne fais ni de ceux mon premier choix. Ensuite, vous seriez coincé avec une base de code fourchue. Toutes les modifications que vous effectuez devront être dupliquées.

Ecrire une sorte d'emballage pour votre API que vous pouvez accéder à l'extérieur de Perl. Une possibilité est une interface RESTful. Un autre, si vous ne voulez pas faire face à des problèmes de réseau, est de créer un ensemble d'outils de ligne de commande qui accèdent à l'API (en passant éventuellement des informations en JSON). Ensuite, vous pouvez écrire une bibliothèque python facile qui accède à l'API wrapper en utilisant httplib2 ou subprocess (en fonction de la façon dont vous avez implémenté le wrapper).

Vous aurez encore à mettre à jour l'API Python chaque fois que les modifications de l'interface, mais maintenant il est seulement pour les changements d'interface.

+0

Ou je pourrais juste passer à Python. Ce ne serait pas si mal! –

3

Vous pouvez essayer d'écrire un analyseur avec PPI, le vider dans une forme intermédiaire et écrire mécaniquement Python à partir de là. Dur, mais faisable. Utile? Er ....

Ou vous pourriez porter votre code à Perl 6, attendez Pynie pour être prêt assez pour permettre l'appel direct de Python à Perl6 dans le même temps d'exécution! Ce n'est pas si loin après tout. Dommage que le Ponie soit mort.