Jakie rodzaje wzorców mogę wymusić na kodzie, aby ułatwić tłumaczenie na inny język programowania? [zamknięte]

zamknięte . To pytanie musi być bardziej skoncentrowane . Obecnie nie przyjmuje odpowiedzi.

chcesz poprawić to pytanie? Update the question so it edytując ten post.

Zamknięte 5 lat temu .

Popraw to pytanie

Zamierzam wykonać projekt poboczny, który ma na celu przetłumaczenie kodu z jednego języka programowania na drugi. Języki, od których zaczynam to PHP i Python (Python to PHP powinno być łatwiej zacząć), ale najlepiej byłoby, gdybym mógł dodać inne języki z (względną) łatwością. Plan jest następujący:

  • Jest to nastawione na tworzenie stron internetowych. Oryginalny i docelowy kod będzie siedział na frameworkach (które też będę musiał napisać). Frameworki te będą obejmować wzorzec projektowy MVC i przestrzegać ścisłych konwencji kodowania. Powinno to nieco ułatwić tłumaczenie.

  • Patrzę również na IOC I zależność wtrysku, ponieważ mogą one ułatwić proces tłumaczenia i mniej podatne na błędy.

  • Użyję modułu parsera Pythona , który pozwala mi bawić się abstrakcyjnym drzewem składni. Wygląda na to, że najbliższe, jakie mogę uzyskać z PHP, to token_get_all () , co jest początkiem.

  • Od tej pory mogę budować AST, tabele symboli i przepływ sterowania.

Wtedy mogę zacząć wysyłać kod. I don ' t need a perfect tłumaczenie . Nadal będę musiał przejrzeć wygenerowany kod i naprawić problemy. Najlepiej, aby Tłumacz oznaczał problematyczne tłumaczenia.

Zanim zapytasz: "jaki to ma sens?"Odpowiedź brzmi:.. To będzie ciekawe doświadczenie w nauce. Jeśli masz jakieś spostrzeżenia, jak to uczynić mniej zniechęcającym, proszę daj mi znać.

EDIT:

Bardziej interesuje mnie to, jakie rodzaje wzorców mogę wyegzekwować w kodzie, aby ułatwić tłumaczenie (ie: IoC, SOA ?) Kod niż Jak zrobić tłumaczenie.

Author: Community, 2010-08-11

6 answers

Byłem Budowanie narzędzi (DMS Software Reengineering Toolkit) do wykonywania manipulacji programów ogólnego przeznaczenia (ze szczególnym przypadkiem Tłumaczenia języka) od 1995 roku, wspierany przez silny zespół informatyków. DMS zapewnia ogólne parsowanie, budowanie AST, tabele symboli, kontrolę i analizę przepływu danych, zastosowanie reguł tłumaczenia, regenerację tekstu źródłowego z komentarzami itp., wszystkie parametryzowane przez jednoznaczne definicje języków komputerowych.

Ilość maszyneria, którą musisz zrobić cóż jest ogromna (szczególnie jeśli chcesz to zrobić dla wielu języków w sposób ogólny), a następnie potrzebujesz niezawodnych parserów dla języków z nierzetelnymi definicjami (PHP jest tego doskonałym przykładem).

Nie ma nic złego w tym, że myślisz o stworzeniu tłumacza języka na język lub próbowaniu go, ale myślę, że to znacznie większe zadanie dla prawdziwych języków, niż się spodziewasz. Mamy około 100 man-lat zainwestowanych w DMS, a kolejne 6-12 miesięcy w każdej "niezawodnej" definicji języka (w tym tej, którą boleśnie zbudowaliśmy dla PHP), znacznie więcej dla takich języków jak C++. To będzie "piekielne doświadczenie uczenia się"; tak było dla nas. (Sekcja dokumenty techniczne na powyższej stronie może być interesująca, aby rozpocząć tę naukę).

Ludzie często próbują zbudować jakiś rodzaj uogólnionej maszyny, zaczynając od jakiegoś kawałka technologii, z którą są zaznajomieni, który robi to część pracy. (Python ASTs są doskonałym przykładem). Dobra wiadomość jest taka, że część pracy została wykonana. Zła wiadomość jest taka, że maszyna ma w sobie miliony założeń, z których większość nie odkryjesz, dopóki nie spróbujesz zmotywować jej do zrobienia czegoś innego. W tym momencie dowiadujesz się, że maszyna jest podłączona do tego, co pierwotnie robi, i naprawdę, naprawdę oprze się Twojej próbie, aby zrobić coś innego. (Podejrzewam, że próba wprowadzenia Pythona AST do modelu PHP będzie dużo zabawa).

Powodem, dla którego zacząłem budować DMS pierwotnie było budowanie fundamentów, które miały bardzo niewiele takich założeń wbudowanych. Niektóre przyprawiają nas o bóle głowy. Jak na razie nie ma czarnych dziur. (Najtrudniejszą częścią mojej pracy w ciągu ostatnich 15 lat jest próba zapobieżenia tym założeniom).

Wielu ludzi również popełnia błąd zakładając, że jeśli mogą parsować (i być może uzyskać AST), są na dobrej drodze do zrobienia czegoś skomplikowanego. Jedną z trudnych lekcji jest że potrzebujesz tabel symboli i analizy przepływu, aby wykonać dobrą analizę lub transformację programu. ASTs są konieczne, ale nie wystarczające. Z tego powodu książka kompilatora Aho&Ullmana nie kończy się na rozdziale 2. (OP ma to prawo w tym, że planuje budowę dodatkowych maszyn poza AST). Więcej informacji na ten temat można znaleźć w życie po analizie.

Uwaga o "nie potrzebuję doskonałego tłumaczenia" jest kłopotliwa. To, co robią słabi tłumacze, to konwersja " łatwego" 80% kodu, pozostawiając trudne 20% do zrobienia ręcznie. Jeśli aplikacja, którą zamierzasz przekonwertować, jest dość mała i zamierzasz przekonwertować ją tylko raz, to 20% jest w porządku. Jeśli chcesz przekonwertować wiele aplikacji (lub nawet tę samą z niewielkimi zmianami w czasie), nie jest to miłe. Jeśli próbujesz przekonwertować 100K SLOC, 20% to 20 000 oryginalnych linii kodu, które są trudne do przetłumaczenia, zrozumienia i modyfikacji w kontekście innego 80 000 linii przetłumaczonego programu, którego już nie masz Rozumiem. To wymaga ogromnego wysiłku. Na poziomie linii miliona jest to po prostu niemożliwe w praktyce. (O dziwo są ludzie, którzy nie ufają zautomatyzowanym narzędziom i nalegają na ręczne tłumaczenie milionów systemów liniowych; to nawet trudniejsze i zwykle dowiadują się boleśnie z długimi opóźnieniami, wysokimi kosztami i często wręcz porażką.)

To, co musisz zrobić, aby przetłumaczyć systemy wielkoskalowe, to wysoki procentowy współczynnik konwersji, lub jest prawdopodobne, że nie można ukończyć ręcznej części czynności tłumaczeniowej.

Kolejnym kluczowym aspektem jest rozmiar kodu, który ma zostać przetłumaczony. Potrzeba dużo energii, aby zbudować sprawny, solidny Tłumacz, nawet z dobrymi narzędziami. Chociaż wydaje się to seksowne i fajne, aby zbudować Tłumacz zamiast po prostu zrobić ręczną konwersję, dla małych baz kodu (np. do około 100K SLOC z naszego doświadczenia) Ekonomia po prostu tego nie usprawiedliwia. Nikt nie lubi tej odpowiedzi, ale jeśli naprawdę trzeba przetłumaczyć tylko 10K SLOC kodu, prawdopodobnie lepiej jest po prostu gryźć kulę i robić to. I tak, to bolesne.

Uważam nasze narzędzia za bardzo dobre (ale wtedy jestem dość stronniczy). I wciąż bardzo trudno jest zbudować dobrego tłumacza; zajmuje nam to około 1,5-2 man-lat i wiemy, jak korzystać z naszych narzędzi. Różnica polega na tym, że przy tak dużej ilości maszyn, odnosimy sukcesy znacznie częściej niż przegrywamy.

 122
Author: Ira Baxter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-05 14:03:17

Moja odpowiedź będzie dotyczyć konkretnego zadania parsowania Pythona w celu przetłumaczenia go na inny język, a nie aspektów wyższego poziomu, które Ira dobrze poruszył w swojej odpowiedzi.

W skrócie: nie używaj modułu parsera, jest łatwiejszy sposób.

Moduł ast, dostępny od wersji Python 2.6 jest znacznie bardziej odpowiedni do Twoich potrzeb, ponieważ daje Ci gotowy AST do pracy. W zeszłym roku napisałem artykuł na ten temat, ale krótko mówiąc, użyj parse metoda ast do parsowania kodu źródłowego Pythona do AST. Moduł parser da ci drzewo parse, a nie AST. uważaj na różnicę.

Teraz, ponieważ ASTs Pythona są dość szczegółowe, biorąc pod uwagę AST, zadanie front-end nie jest strasznie trudne. Przypuszczam, że można mieć prosty prototyp dla niektórych części funkcjonalności gotowy dość szybko. Jednak dotarcie do kompletnego rozwiązania zajmie więcej czasu, głównie dlatego, że semantyka języków jest inna. Prosty podzbiór języka (funkcje, podstawowe typy i tak dalej) można łatwo przetłumaczyć, ale gdy przejdziesz do bardziej złożonych warstw, będziesz potrzebował ciężkiego sprzętu, aby emulować rdzeń jednego języka w innym. Na przykład rozważ Generatory Pythona i listę składań, które nie istnieją w PHP (według mojej najlepszej wiedzy, co jest co prawda słabe, gdy PHP jest zaangażowane).

Aby dać ci ostatnią radę, rozważ 2to3 Narzędzie stworzone przez programistów Pythona, aby przetłumaczyć Kod Pythona 2 Na Kod Pythona 3. Front-end-wise, zawiera większość elementów potrzebnych do przetłumaczenia Pythona na coś . Jednakże, ponieważ rdzenie Pythona 2 i 3 są podobne, nie jest wymagana żadna maszyna do emulacji.

 13
Author: Eli Bendersky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-14 14:07:20

Napisanie tłumacza nie jest niemożliwe, zwłaszcza biorąc pod uwagę, że stażysta Joela zrobił to latem.

Jeśli chcesz zrobić jeden język, to proste. Jeśli chcesz zrobić więcej, jest to trochę trudniejsze, ale nie za dużo. Najtrudniejsze jest to, że podczas gdy każdy kompletny język Turinga może zrobić to, co robi inny kompletny język Turinga, wbudowane typy danych mogą zmienić to, co robi język fenomenalnie.

Na przykład:

word = 'This is not a word'
print word[::-2]

Pobiera lot Z C++ kod do zduplikowania (ok, dobrze, można to zrobić dość krótko z kilkoma pętlowymi konstrukcjami, ale nadal).

To chyba trochę na bok.

Czy kiedykolwiek napisałeś tokenizer / parser oparty na gramatyce języka? Prawdopodobnie będziesz chciał dowiedzieć się, jak to zrobić, jeśli tego nie zrobiłeś, ponieważ jest to główna część tego projektu. To, co chciałbym zrobić, to wymyślić podstawową składnię Turinga - coś dość podobnego do Pythona bytecode . Następnie tworzymy lexer/parser, który zajmuje gramatyka języka (być może używając BNF) i bazując na gramatyce, kompiluje język do języka pośredniego. Następnie będziesz chciał zrobić odwrotnie-utworzyć parser ze swojego języka na języki docelowe w oparciu o gramatykę.

Najbardziej oczywistym problemem, jaki widzę, jest to, że na początku prawdopodobnie stworzysz potwornie nieefektywny kod, szczególnie w potężniejszych językach*, takich jak Python.

Ale jeśli zrobisz to w ten sposób, prawdopodobnie będziesz w stanie dowiedz się, jak zoptymalizować wydajność w miarę postępów. Podsumowując:
  • przeczytaj gramatykę
  • skompilować program do składni pośredniej (ale także Turing complete)
  • skompiluj program pośredni do języka finalnego (w oparciu o dostarczoną gramatykę)
  • ...?
  • Zysk!(?)

*przez potężny mam na myśli to, że zajmuje to 4 linijki:

myinput = raw_input("Enter something: ")
print myinput.replace('a', 'A')
print sum(ord(c) for c in myinput)
print myinput[::-1]

Pokaż mi inny język, który może zrobić coś takiego w 4 linijkach, a pokażę Ci język równie potężny jak Python.

 5
Author: Wayne Werner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-18 22:43:55

Jest kilka odpowiedzi mówiących, żebyś się nie trudził. Jak bardzo to pomocne? Chcesz się nauczyć? Możesz się nauczyć. To kompilacja. Tak się składa, że twoim językiem docelowym nie jest kod maszynowy, ale kolejny język wysokiego poziomu. To się robi cały czas.

Jest stosunkowo łatwy sposób, aby zacząć. Najpierw idź po http://sourceforge.net/projects/lime-php/ (Jeśli chcesz pracować w PHP) lub coś takiego i przejść przez przykładowy kod. Następnie możesz napisać leksykę analizator wykorzystujący sekwencję wyrażeń regularnych i tokeny do generowanego parsera. Twoje działania semantyczne mogą albo generować kod bezpośrednio w innym języku, albo budować jakąś strukturę danych (think objects, man), którą możesz masować i przemierzać, aby wygenerować kod wyjściowy.

Masz szczęście z PHP i Pythonem, ponieważ pod wieloma względami są one tym samym językiem, co siebie, ale z inną składnią. Najtrudniejsze jest pokonanie różnic semantycznych między formami gramatycznymi i struktur danych. Na przykład Python ma listy i słowniki, podczas gdy PHP ma tylko tablice assoc.

Podejście" uczący się " polega na zbudowaniu czegoś, co działa dobrze dla ograniczonego podzbioru języka (takiego jak tylko instrukcje drukowania, prosta matematyka i przypisywanie zmiennych), a następnie stopniowym usuwaniu ograniczeń. To w zasadzie to, co robili "wielcy" faceci w terenie.

Aha, a skoro nie masz statycznych typów w Pythonie, to najlepiej pisać i polegać na PHP funkcje takie jak" python_add", które dodają liczby, łańcuchy znaków lub obiekty zgodnie ze sposobem, w jaki robi to Python.

Oczywiście, to może być znacznie większe, jeśli na to pozwolisz.

 3
Author: Ian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-17 12:08:17

Będę drugi punkt widzenia @ EliBendersky dotyczące korzystania z ast.parse zamiast parsera (o którym wcześniej nie wiedziałem). Gorąco polecam również przejrzenie jego bloga. Użyłem ast.parse to do Python - >JavaScript translator (@ https://bitbucket.org/amirouche/pythonium ). wymyśliłem Pythonium design by nieco przeglądając inne implementacje i wypróbowując je na własną rękę. I forked Pythonium from https://github.com/PythonJS/PythonJS które również zacząłem, To właściwie kompletna przeróbka . Całość wzorowana jest na PyPy i http://www.hpl.hp.com/techreports/Compaq-DEC/WRL-89-1.pdf papier.

Wszystko próbowałem, od początku do najlepszego rozwiązania, nawet jeśli wygląda to na marketing Pythonium to naprawdę nie jest (nie wahaj się powiedzieć mi, jeśli coś nie wydaje się poprawne do netykiety): {]}

  • Implementacja semantyki Pythona w zwykłym starym JavaScript przy użyciu dziedziczenia prototypów: AFAIK to niemożliwe zaimplementowanie dziedziczenia wielokrotnego Pythona przy użyciu js prototype object system. Później próbowałem to zrobić innymi sztuczkami (por. getattribute). O ile wiem, nie ma implementacji Pythona multiple inheritance w JavaScript, najlepsze co istnieje to single inheritance + mixins i nie jestem pewien, czy obsługują dziedziczenie diamentowe. Trochę podobny do Skulpt, ale bez google clojure.

  • Próbowałem z Google clojure, tak jak skulpt (kompilator) zamiast czytać Skulpt kod # fail. W każdym razie z powodu js prototype based object system nadal niemożliwe. Tworzenie wiązania było bardzo trudne, trzeba napisać JavaScript i dużo kodu boilerplate (por. https://github.com/skulpt/skulpt/issues/50 Gdzie jestem Duchem). W tym czasie nie było jasnego sposobu na zintegrowanie oprawy w systemie budowania. Myślę, że Skulpt jest biblioteką i po prostu trzeba dołączyć swoje pliki. py w html do wykonania, nie jest wymagana Faza kompilacji do wykonania przez programista.

  • Próbowałem pyjaco (kompilator), ale tworzenie wiązań (wywołanie kodu Javascript z kodu Pythona) było bardzo trudne, za każdym razem było za dużo kodu boilerplate, aby utworzyć. Teraz myślę, że pyjaco jest tym bardziej blisko Pythonium. pyjaco jest napisane w Pythonie (ast.parse zbyt), ale wiele jest napisane w JavaScript i używa dziedziczenia prototypów.

Nigdy nie udało mi się uruchomić Piżamy #fail i nigdy więcej nie próbowałem odczytać kodu #fail. Ale w mój umysł robił tranlację API- > API (lub framework do frameworka) a nie Tłumaczenie Pythona na JavaScript. Struktura JavaScript zużywa dane, które są już na stronie lub dane z serwera. Kod Pythona to tylko "hydraulika". Po tym odkryłem, że Pidżama to rzeczywiście prawdziwy python->Tłumacz js.

Nadal myślę, że można zrobić tłumaczenie API - > API (lub framework - > framework) i to jest zasadniczo to, co robię w Pythonium, ale na niższym poziomie. Prawdopodobnie Piżamy używają ten sam algorytm co Pythonium...

Potem odkryłem brithon w pełni napisany w Javascript jak Skulpt, bez potrzeby kompilacji i dużo puchu... ale napisane w JavaScript.

Od początkowego wiersza napisanego w trakcie tego projektu, wiedziałem o PyPy, nawet zapleczu JavaScript dla PyPy. Tak, możesz, jeśli go znajdziesz, bezpośrednio wygenerować interpreter Pythona w JavaScript z PyPy. Ludzie mówią, że to była katastrofa. Czytam nie gdzie dlaczego. Ale myślę, że powodem jest to, że język pośredni, którego używają do implementacji interpretera, RPython, jest podzbiorem Pythona dostosowanym do tłumaczenia na język C (a może asm). Ira Baxter mówi, że zawsze robisz założenia, gdy coś budujesz i prawdopodobnie dostroisz to, aby było najlepsze w tym, co ma robić w przypadku PyPy: Python->C translation. Założenia te mogą nie być istotne w innym kontekście gorzej mogą wywnioskować, inaczej powiedział bezpośrednie tłumaczenie będzie najprawdopodobniej zawsze lepiej.

Posiadanie interpretera napisanego w Pythonie brzmiało jak (bardzo) dobry pomysł. Ale bardziej interesował mnie kompilator ze względu na wydajność, a także łatwiej jest skompilować Pythona do JavaScript niż go zinterpretować.

Zacząłem PythonJS z myślą o stworzeniu podzbioru Pythona, który mógłbym łatwo przetłumaczyć na JavaScript. Na początku nawet nie trudziłem się implementacją systemu OO z powodu wcześniejszych doświadczeń. Podzbiór Pythona, który udało mi się przetłumaczyć do JavaScript są:

  • funkcja z pełnymi parametrami semantycznymi zarówno w definicji, jak i w wywołaniu. To część, z której jestem najbardziej dumny.
  • while / if / elif / else
  • typy Pythona zostały przekonwertowane na typy JavaScript (nie ma żadnych typów Pythona)
  • Dla może iterować tylko na tablicach Javascript (dla tablicy in)
  • Transparent access to JavaScript: jeśli napiszesz tablicę w kodzie Pythona, zostanie ona przetłumaczona na tablicę w javascript. To jest największe osiągnięcie pod względem użyteczności nad konkurencją.
  • możesz przekazać funkcje zdefiniowane w źródle Pythona do funkcji javascript. Domyślne argumenty będą brane pod uwagę.
  • It add posiada specjalną funkcję o nazwie new, która jest tłumaczona na JavaScript new np: new(Python)(1, 2, spam, "egg") jest tłumaczona na "new Python(1, 2, spam, "egg").
  • "var" są automatycznie obsługiwane przez tłumacza. (bardzo ładne znalezisko od Bretta (PythonJS współpracownik).
  • globalne słowo kluczowe
  • zamknięcia
  • lambda
  • składanie listy
  • Import jest obsługiwany przez requirejs
  • dziedziczenie pojedynczych klas + mixin poprzez classyjs

Wydaje się to dużo, ale w rzeczywistości bardzo wąskie w porównaniu do pełnego semantycznego Pythona. To naprawdę JavaScript ze składnią Pythona.

Wygenerowany JS jest idealny ie. nie ma kosztów ogólnych, nie można go poprawić pod względem wydajności przez dalsze edycja. Jeśli możesz poprawić wygenerowany kod, możesz to zrobić również z pliku źródłowego Pythona. Ponadto kompilator nie polegał na żadnych sztuczkach JS, które można znaleźć w .js napisane przez http://superherojs.com/ , więc jest bardzo czytelny.

Bezpośredni potomek tej części PythonJS jest Pythonium Veloce mode. Pełną realizację można znaleźć @ https://bitbucket.org/amirouche/pythonium/src/33898da731ee2d768ced392f1c369afd746c25d7/pythonium/veloce/veloce.py?at=master 793 SLOC + około 100 SLOC wspólnego kodu z drugim tłumaczem.

Adaptowana wersja pystones.py można przetłumaczyć w trybie Veloce cf. https://bitbucket.org/amirouche/pythonium/src/33898da731ee2d768ced392f1c369afd746c25d7/pystone/?at=master

Po skonfigurowaniu basic Python - > JavaScript translation wybrałem inną ścieżkę do Przetłumacz pełny Python do JavaScript. Glib robi obiektowy kod oparty na klasach, z wyjątkiem języka docelowego jest JS, więc masz dostęp do tablic, obiektów podobnych do map i wielu innych sztuczek, a cała ta część została napisana w Pythonie. IIRC nie ma kodu javascript napisanego przez tłumacza Pythonium. Uzyskanie pojedynczego dziedziczenia nie jest trudne oto trudne części, które sprawiają, że Pythonium jest w pełni zgodne z Pythonem: {]}

  • spam.egg w Pythonie jest zawsze tłumaczone na getattribute(spam, "egg") zrobiłem nie profil tego w szczególności, ale myślę, że tam, gdzie tracą dużo czasu i nie jestem pewien, czy mogę poprawić go z asm.js czy cokolwiek innego.
  • kolejność rozwiązywania metod: nawet z algorytmem napisanym w Pythonie, tłumaczenie go na kod zgodny z Pythonem Veloce było dużym przedsięwzięciem.
  • Getattribute: algorytm rozdzielczości getattribute jest dość skomplikowany i nadal nie obsługuje deskryptorów danych]}
  • metaclass class based: I know where to plug kod, ale i tak...
  • last bu not least: some_callable(...) jest zawsze transalted do "call (some_callable)". AFAIK tłumacz w ogóle nie używa wnioskowania, więc za każdym razem, gdy wykonujesz wywołanie, musisz sprawdzić, jaki rodzaj obiektu to nazwać, aby go tak nazwać.

Ta część jest uwzględniona w https://bitbucket.org/amirouche/pythonium/src/33898da731ee2d768ced392f1c369afd746c25d7/pythonium/compliant/runtime.py?at=master{[5]jest napisane w Pythonie kompatybilny z Python Veloce.

Rzeczywisty zgodny Tłumacz https://bitbucket.org/amirouche/pythonium/src/33898da731ee2d768ced392f1c369afd746c25d7/pythonium/compliant/compliant.py?at=master nie generuje kodu JavaScript bezpośrednio i co najważniejsze nie wykonuje transformacji ast->AST. Próbowałem ast - >AST rzecz i ast nawet jeśli ładniejszy niż cst nie jest miło pracować nawet z ast.NodeTransformer i co ważniejsze nie muszę robić ast - >ast.

Robiąc python ast do python ast w moim przypadku przynajmniej może być poprawa wydajności, ponieważ kiedyś sprawdzić Zawartość bloku przed wygenerowaniem kodu związanego z nim, na przykład:

  • var/global: aby móc coś var, muszę wiedzieć, co muszę, a nie var. Zamiast generować blok śledzenia, które zmienne są tworzone w danym bloku i wstawiania go na górze generowanego bloku funkcyjnego po prostu szukam przypisania zmiennej po wpisaniu blok przed faktycznym odwiedzeniem węzła potomnego w celu wygenerowania powiązanego kodu.
  • wydajność, Generatory mają, jak na razie, specjalną składnię w JS, więc muszę wiedzieć, która funkcja Pythona jest generatorem, gdy chcę napisać "var my_generator = function"

Więc tak naprawdę nie odwiedzam każdego węzła raz dla każdej fazy tłumaczenia.

Cały proces można opisać jako:

Python source code -> Python ast -> Python source code compatible with Veloce mode -> Python ast -> JavaScript source code

Python builtins są napisane w kodzie Pythona (!), IIRC jest kilka ograniczenia związane z typami bootstraping, ale masz dostęp do wszystkiego, co może przetłumaczyć Pythonium w trybie zgodnym. Zobacz też https://bitbucket.org/amirouche/pythonium/src/33898da731ee2d768ced392f1c369afd746c25d7/pythonium/compliant/builtins/?at=master

Odczyt kodu JS wygenerowanego z pythonium można zrozumieć, ale mapy źródłowe bardzo pomogą.

Cenne rady, które mogę ci dać w świetle tego doświadczenia, są bardzo stare. Bąków:

    [16]}obszerny przegląd tematu zarówno w literaturze, jak i istniejących projektach zamkniętych lub wolnych. Kiedy przeglądałem różne istniejące projekty, powinienem był dać mu o wiele więcej czasu i motywacji.
  • zadawaj pytania! Gdybym wiedział wcześniej, że backend PyPy jest bezużyteczny z powodu narzutu z powodu niedopasowania semantycznego C / Javascript. Ja bym chyba miał pomysł z Pythonium już 6 miesięcy temu może 3 lata temu.
  • Wiesz, co chcesz zrobić, masz cel. Na ten projekt miałem różne cele: pratice trochę javascript, dowiedzieć się więcej Pythona i być w stanie napisać kod Pythona, który będzie działać w przeglądarce (więcej i że poniżej).
  • porażka to doświadczenie
  • mały krok to krok
  • start small
  • dream big
  • do dema
  • iterate

Tylko w trybie Python Veloce, jestem bardzo zadowolony! Ale po drodze odkryłem, że to, czego naprawdę Szukam, to wyzwalanie mnie i innych od Javascript, ale co ważniejsze możliwość tworzenia w wygodny sposób. To prowadzi mnie do Scheme, DSL, modele i ostatecznie modele specyficzne dla domeny (por. http://dsmforum.org/).

O tym, co Ira Baxter odpowiedzi:

Szacunki nie są w ogóle pomocne. Zajęło mi mniej więcej 6 miesięcy wolnego czasu zarówno dla PythonJS i Pythonium. Więc mogę oczekiwać więcej od pełnego czasu 6 miesięcy. Myślę, że wszyscy wiemy, co 100 człowiek-rok w kontekście przedsiębiorstwa może oznaczać, a nie w ogóle...

Kiedy ktoś mówi, że coś jest trudne lub częściej niemożliwe, odpowiadam, że "potrzeba czasu, aby znaleźć rozwiązanie problemu, który jest niemożliwy" w przeciwnym razie powiedział, że nic nie jest niemożliwe, chyba że udowodniono, że jest niemożliwe w tym przypadku dowód matematyczny...

Jeśli nie jest to niemożliwe, to pozostawia miejsce na wyobraźnię:

  • znalezienie dowodu udowadniającego, że to niemożliwe

I

  • jeśli jest to niemożliwe, może być "gorszy" problem, który może mieć rozwiązanie.

Lub

  • jeśli nie jest to niemożliwe, znalezienie rozwiązania
To nie tylko optymistyczne myślenie. Kiedy zacząłem Python - > Javascript wszyscy mówili, że to niemożliwe. PyPy niemożliwe. Metaklasy są zbyt twarde. itd... Myślę, że jedyną rewolucją, która przynosi PyPy nad Scheme-> C papier (który ma 25 lat) jest jakieś automatyczne generowanie JIT (oparte na podpowiedziach napisanych w interpreterze RPython I myśl). Większość ludzi, którzy mówią, że coś jest "trudne" lub "niemożliwe", nie podaje powodów. C++ trudno analizować? Wiem, że nadal są (wolnymi) parserami C++. Zło tkwi w szczegółach? Wiem o tym. Mówienie, że samo jest niemożliwe, nie jest pomocne, jest nawet gorsze niż "Nie pomocne", zniechęca, a niektórzy ludzie chcą zniechęcić innych. Słyszałem o tym pytaniu przez https://stackoverflow.com/questions/22621164/how-to-automatically-generate-a-parser-code-to-code-translator-from-a-corpus.

Jaka byłaby dla Ciebie doskonałość? W ten sposób definiujesz następny cel i być może osiągasz ogólny cel.

[[3]}bardziej interesuje mnie to, jakie wzory mogę wyegzekwować na kod, aby ułatwić tłumaczenie (ie: IoC, SOA ?) kod niż Jak zrobić tłumaczenie.

Nie widzę wzorców, które nie można przetłumaczyć z jednego języka na inny język przynajmniej w mniej niż doskonały sposób. Ponieważ tłumaczenie z języka na język jest możliwe, lepiej dążyć do tego najpierw. Ponieważ, myślę, że według http://en.wikipedia.org/wiki/Graph_isomorphism_problem , tłumaczenie między dwoma językami komputerowymi jest izomorfizmem drzewa lub DAG. Nawet jeśli już wiemy, że obie są pełne Turinga, więc...

Framework - > Framework który lepiej wizualizować jako API - > API tłumaczenie nadal może być coś, co można pamiętać jako sposób na poprawę wygenerowanego kodu. E. g: Prolog jako bardzo specyficzna składnia, ale nadal można wykonywać prolog jak obliczenia opisując ten sam wykres w Pythonie... Gdybym miał zaimplementować Prolog do tłumacza Pythona, nie zaimplementowałbym unifikacji w Pythonie, ale w bibliotece C i wymyślił" składnię Pythona", która jest bardzo czytelna dla Pythona. W końcu składnia to tylko "malowanie", dla którego nadajemy sens (dlatego zacząłem schemat). Zło tkwi w szczegółach języka i nie mówię o składni. Pojęcia używane w języku getattribute hook (można żyć bez niego), ale wymagane funkcje maszyny wirtualnej, takie jak optymalizacja rekurencji ogonowej, mogą być trudne do opanowania. Nie obchodzi cię, czy początkowy program nie używa rekurencji ogonowej i nawet jeśli nie ma rekurencji ogonowej w języku docelowym, możesz ją emulować za pomocą greenlets/pętli event.

Dla języków docelowych i źródłowych, poszukaj za:

  • Wielkie i konkretne pomysły
  • małe i wspólne pomysły

Z tego wyłoni się:

  • rzeczy, które łatwo przetłumaczyć
  • rzeczy, które trudno przetłumaczyć

Prawdopodobnie będziesz również w stanie wiedzieć, co zostanie przetłumaczone na szybki i powolny kod.

Jest również pytanie o stdlib lub dowolną bibliotekę, ale nie ma jasnej odpowiedzi, to zależy od twoich celów.

Kod Idiomatyczny lub czytelny wygenerowany kod ma również rozwiązania...

Kierowanie na platformę taką jak PHP jest znacznie łatwiejsze niż kierowanie na przeglądarki, ponieważ możesz zapewnić C-implementację powolnej i/lub krytycznej ścieżki.

Biorąc pod uwagę, że pierwszy projekt to tłumaczenie Pythona na PHP, przynajmniej dla podzbioru PHP3, który znam, dostosowując veloce.py to twoja najlepsza szansa. Jeśli możesz wdrożyć veloce.py dla PHP wtedy prawdopodobnie będziesz mógł uruchomić tryb zgodny... Również jeśli możesz przetłumaczyć PHP na podzbiór PHP możesz wygenerować za pomocą php_veloce.py oznacza to, że można przetłumaczyć PHP na podzbiór Pythona, który veloce.py może zużywać, co oznaczałoby, że można przetłumaczyć PHP na Javascript. Tak tylko mówię...

Możesz też zajrzeć do tych bibliotek:

Również może Cię zainteresować ten wpis na blogu (i komentarze): https://www.rfk.id.au/blog/entry/pypy-js-poc-jit/

 2
Author: amirouche,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:01:49

W języku C#można też znaleźć kompilator Vala, który tłumaczy Vala (język podobny do C#) na C.

 0
Author: ptomato,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-18 09:35:22