2009-06-30 18 views
15

W mojej nowej pracy więcej osób używa Pythona niż Perla, a ja mam bardzo przydatne API, które sam napisałem i chciałbym udostępnić moim współpracownikom w Pythonie.Czy są narzędzia programistyczne do Perla do konwersji w Pythonie?

Pomyślałem, że kompilator, który skompilował kod Perla do kodu Pythona, byłby bardzo przydatny do takiego zadania. Zanim spróbuję napisać coś, co parsuje Perla (lub przynajmniej podzbiór Perla, którego używałem przy definiowaniu mojego API), natknąłem się na konsultację z bridgekeeper.

Prawie na pewno nie warto zainwestować w konsultacje, aby przetłumaczyć ten interfejs API, ale to naprawdę ciekawe narzędzie.

Czy ktoś wie o kompilatorze, który będzie analizować (lub próbować analizować!) Kod Perl5 i skompilować go w Pythonie? Jeśli czegoś takiego nie ma, jak mam zacząć pisać prosty kompilator, który analizuje mój zorientowany obiektowo kod Perla i zamienia go w Python? Czy istnieje gramatyka ANTLR lub YACC, z której mogę korzystać jako punkt wyjścia?

Edytuj: Znalazłem perl.y, co może być punktem wyjścia, gdybym miał przetasować mój własny kompilator.

Odpowiedz

28

James,

polecam Ci po prostu przepisać moduł w Pythonie, z kilku powodów:

  1. analizowaniem Perl jest DARN CIĘŻKO. Jeśli nie jest to ważne i pożądane ćwiczenie dla ciebie, wydajesz się spędzać więcej czasu na tłumaczenie niż na użytecznej pracy.
  2. Poprzez przepisanie, będziesz miał wielką szansę ćwiczyć Pythona. Uczenie się najlepiej wykonuje się wykonując, a posiadanie zadania, którego naprawdę potrzebujesz, jest wielkim dobrodziejstwem.
  3. Wreszcie, Python i Perl mają zupełnie inne filozofie. Aby uzyskać bardziej Pythonic API, najlepiej jest po prostu przepisać go w Pythonie.
+1

PERL jest PEŁNYM konstruktem, który nie jest trywialnie tłumaczony na język Python. PERL wymaga od człowieka przeczytania i zrozumienia intencji kryjącej się za kodem. –

+6

s/PERL/Perl/g (chyba, że ​​jesteś krzykliwy, niż podejrzewam) – ijw

+0

@ijw: co oznacza "s/PERL/Perl/g"? –

6

Nigdy go nie wypróbowałem i wydaje mi się, że nie było to możliwe, ale może PyPerl jest opcją?

Jak duży jest ten interfejs API? Jeśli to naprawdę przydatne, to dlaczego nie przepisujesz go w pythonie. Napisanie automatycznego konwertera prawdopodobnie potrwa dłużej niż przepisanie interfejsu API.

Nawet jeśli uda ci się go przepisać automatycznie, wynikowy kod prawdopodobnie nie będzie zbyt pytoniczny.

Koniecznie sprawdź odpowiedzi przez weismat i eliben

+0

lub Inline :: Python –

16

Myślę, że powinieneś przepisać swój kod. Jakość wyników analizy parsowania zależy od stylu kodowania Perla. Myślę, że poniższy cytat bardzo dobrze podsumowuje stronę teoretyczną. Z Wikipedii:. Perl in Wikipedia

Perl ma Turing-kompletną gramatykę ponieważ parsowanie może wpływać kodu run-time wykonywanego na etapie kompilacji [25] Dlatego Perl nie może być analizowany przez prostą kombinację Lexx/Yacc Lexer/Parser. Zamiast tego interpreter implementuje własny lexer, który koordynuje ze zmodyfikowanym parserem GNU Bison w celu rozwiązania niejasności w języku.

Często mówi się, że "tylko perl może parsować Perla", co oznacza, że ​​tylko interpreter Perla (perl) może analizować język Perla (Perl), ale nawet to nie jest, ogólnie rzecz biorąc, prawdziwe. Ponieważ interpreter języka Perl może symulować maszynę Turinga podczas fazy kompilacji, musiałby zdecydować o problemie zatrzymania, aby zakończyć przetwarzanie w każdym przypadku. To długotrwały wynik, że problem zatrzymania jest nierozstrzygalny, a zatem nawet Perl nie może zawsze parsować Perla. Perl dokonuje niezwykłego wyboru, dając użytkownikowi dostęp do pełnej mocy programistycznej we własnej fazie kompilacji. Koszt pod względem teoretycznej czystości jest wysoki, ale praktyczne niedogodności wydają się rzadkie.

Inne programy, które zobowiązują się parsować Perla, takie jak analizatory kodu źródłowego i auto-wcięcia, muszą walczyć nie tylko z niejednoznacznymi konstruktami składniowymi, ale także z nierozstrzygalnością analizy Perla w ogólnym przypadku. Projekt PPI Adama Kennedy'ego skupił się na analizie kodu Perla jako dokumentu (zachowując jego integralność jako dokumentu), zamiast parsowania Perla jako kodu wykonywalnego (którego nawet Perl sam nie może zrobić). To Kennedy po raz pierwszy domyślił się, że "parsowanie Perla cierpi z powodu" problemu zatrzymania ". [26], a to zostało później udowodnione. [27]

7

Począwszy od 5.10 można skompilować perla z eksperymentalnym Misc Attribute Decoration włączoną i ustawić zmienną środowiskową PERL_XMLDUMP do nazwy pliku, aby uzyskać zrzut XML drzewa parse (w tym komentarzy - bardzo pomocne dla tłumaczy języka). Chociaż, jak mówi dokument, jest to praca w toku.

4

Choć może to być zabawne, aby go przekonwertować lub przerobić w pythonie, nie zrobiłbym żadnego z nich jako pierwszego wyboru. Wtedy utknąłbyś z rozwidloną bazą kodu. Wszelkie modyfikacje, które wprowadzisz, będą musiały zostać powielone.

Napisz rodzaj otoki dla interfejsu API, do którego możesz uzyskać dostęp spoza Perla. Jedną z możliwości jest interfejs RESTful. Innym, jeśli nie chcesz zajmować się problemami z siecią, jest stworzenie zestawu narzędzi wiersza poleceń, które uzyskują dostęp do API (prawdopodobnie przekazując informacje jako JSON). Następnie możesz napisać łatwą bibliotekę Pythona, która uzyskuje dostęp do otoki API za pomocą httplib2 lub podprocesu (w zależności od tego, jak zaimplementowałeś opakowanie).

Będziesz musiał zaktualizować interfejs API Pythona za każdym razem, gdy zmieni się interfejs, ale teraz jest to tylko zmiana interfejsu.

+0

Mogłabym też przełączyć się na Python. To nie byłoby takie złe! –

3

Możesz spróbować napisać parser z PPI, zrzucić go do jakiejś pośredniczącej formy i napisać w ten sposób sprytnie Python. Trudne, ale wykonalne. Przydatny? Er ...

Albo możesz przenieść swój kod do Perl 6, poczekać na Pynie, aby być na tyle gotowym, aby umożliwić bezpośrednie połączenie z Pythona do Perl6 w tym samym środowisku wykonawczym! W końcu nie jest tak daleko. Szkoda, że ​​Ponie jest martwy.

Powiązane problemy