Konwerter source file Javy do source file C++ i/lub na odwrot - czy to trudne ?

0

Witam.
Ma ktos doswiadczenie w pisaniu konwertera jakiegos jezyka programowania wysokiego poziomu na inny jezyk wysokiego poziomu. Czy to jest bardzo trudne zadanie ? Spodobalo mi sie napisac kompilator ale wydaje mi sie ze taki konwerter bylby bardziej przydatny ? Zdaje sobie sprawe ze napisanie kompilatora przerasta moje mozliwosci ale taki konwerter bylby chyba prostszy ? Na pewno na obecnym etapie nauki nie zaczne go pisac bo nie przerobilem Javy nawet w polowie a w C++ jestem dopiero na klasach, ale pytam z ciekawosci.

4

Kompilator to też konwerter, z tą toznicą, że zamiast "wypluwać" tekst wypluwa binarny kod maszynowy.

Co do kompilatora Java -> C++ lub w drugą stronę to bez mocnego ograniczenia języka wejściowego się nie obejdzie, bo inaczej to nie będzie trudne, a astronomicznie trudne.

5
teofrast napisał(a):

Witam.

Ma ktos doswiadczenie w pisaniu konwertera jakiegos jezyka programowania wysokiego poziomu na inny jezyk wysokiego poziomu.

Trochę

Czy to jest bardzo trudne zadanie ?

Trudne

Spodobalo mi sie napisac kompilator ale wydaje mi sie ze taki konwerter bylby bardziej przydatny ?

Wątpię czy przydatny. Poza tym mamy GraalVM który kompiluje Javę do kodu LLVM

Zdaje sobie sprawe ze napisanie kompilatora przerasta moje mozliwosci ale taki konwerter bylby chyba prostszy ?

Zacznij od napisania parsera. Potem może interpretera.
BTW Java jest dość trudnym językiem żeby go parsować. C++ jest jeszcze trudniejszy. C jest prosty. Ale np taki Scheme (dialekt Lispa) jest uberprosty do parsowania i interpretowania

1

Napisanie kompilatora który nie optymalizuje jest dosyć proste.

Tokenizacja -> Parsowanie (np. Antler'em) -> Drzewa AST

Jak już masz drzewa AST

  • Przejście po drzewach tak żeby sprawdzić poprawność (może wymagać kilku przejść, np. w pierwszym przejściu zbieramy info o nazwach zmiennych, w 2 weryfikujemy że każda użyta zmienna jest zadeklarowana i że typy się zgadzają, profesjonalne kompilatory są często jedno przejściowe).
  • Generowanie kodu z drzew AST. Jeżeli generujemy do maszyny stosowanej typu JVM czy .NET to jest to banalnie proste. Podobnie transpilacja do innego jeżyka programowania.

To co jest trudne to generowanie kodu to maszyn "ograniczonych" takich jak x86 gdzie liczba rejestrów jest mała (16) i trzeba odpowiednio przesuwać dane (przydają się algosy kolorowania grafów).
Innym trudnym zagadnieniem (a nawet niesamowicie trudnym) jest optymalizacja. Często korzysta się tutaj z formy pośredniej: AST -> forma pośrednia -> optymalizacja -> forma docelowa.

Generalnie napisanie prostego kompilatora bez optymalizacji i który korzysta z rejestrów w sposób nieoptymalny jest bardzo proste. Można też użyć LLVM'a w ten sposób piszesz tylko "front" czyli gramatykę i semantykę (wykrywanie poprawności), a resztę wykonuje LLVM (trzeba sparsować język i zamienić na formę pośrednią LLVM'a, LLVM zoptymalizuje i wygeneruje object-file np. exe).

0

Według mnie o wiele łatwiej byłoby użyć gotowego oraz maintainowanego przez kogoś sensownego kompilatora Javy aby wygenerować AST, a wykorzystać go w celu wyemitowania swojego kodu CPP

https://github.com/openjdk/jdk/tree/master/src/jdk.compiler/share

Tylko chyba oznaczałoby że trzeba byłoby to pisać w Javce? no bo chyba nie ma portu na C++ tej libki?

Aczkolwiek to jest podejście bardziej gdybyś chciał obsłużyć wszystko co się da, a nie jeżeli chciałbyś tylko pewne elementy konwertować - funkcje, ifki, proste operacje typu var a = <Expression>;

0

To za wysokie progi dla mnie. Moje fantazje byly oderwane od rzeczywistosci. Lepiej zrobic cos malego, prostego, "nudnego", oczywistego i dobrze to przetestowac, skupic sie na rzeczywistosci niz fantazjowac o niemozliwym.

1 użytkowników online, w tym zalogowanych: 0, gości: 1