jak opłacalne jest przeniesienie aplikacji C ++ do kodu bajtowego Java za pomocą LLVM (chyba LLJVM)?
Chodzi o to, że obecnie mamy proces napisany w C ++, ale nowy klient wprowadził obowiązek uruchamiania programu w sposób wieloplatformowy, używając wirtualnej maszyny Java bez oczywistego kodu natywnego (bez JNI). Chodzi o to, aby móc wygenerować słoik i skopiować go do różnych systemów (Linux, Win, 32 bity - 64 bity) i powinien on po prostu działać.
Rozglądanie się wygląda na to, że można skompilować C ++ do kodu IR LLVM, a następnie ten kod do kodu bajtowego java. Wygenerowany kod nie musi być czytelny.
Testowałem trochę z podobnymi rzeczami przy użyciu emscripten, to pobiera kod C ++ i kompiluję go do JavaScript. Wynik jest prawidłowy JS, ale całkowicie nieczytelny (wygląda jak assambler).
- Czy ktoś zrobił port aplikacji od C ++ do kodu bajtowego Java za pomocą tej techniki?
- Z jakimi problemami możemy się zmierzyć?
- Czy poprawne jest podejście do kodu produkcyjnego?
Aby wyjaśnić moją uwagę po kilku komentarzach, być może port nie jest dobrze używany, dlatego nie oczekuję czytelnego kodu źródłowego, po prostu kod bajtowy java, więc nie jest to „port”, który zostanie opracowany dla tego, tylko że docelowa platforma musi być maszyną Java JVM, a nie rodzimym narzędziem Assamblear.
Uwaga: Zdaję sobie sprawę, że obecnie mamy niektóre niestandardowe biblioteki C ++ i bliskie źródła, chcemy usunąć ten niestandardowy kod i wszystkie bliskie biblioteki źródłowe oraz użyć darmowego oprogramowania Open Source Libre, więc załóżmy, że cały kod jest standardowym kodem C ++ z cały kod dostępny w czasie kompilacji.
Uwaga 2: Nie jest możliwe napisanie przenośnego kodu C ++, a następnie skompilowanie go na pożądanej platformie docelowej, skompilowany program musi być wieloplatformowy, dlatego należy użyć JVM.
Uwaga 3: W tej chwili nie szukamy podobnych rozwiązań stosowanych w Pythonie lub innej bazie językowej, ale chciałbym również o tym usłyszeć. Rozumiem przez to, że naszym docelowym plikiem wykonywalnym musi być kod bajtowy Java, ale jeśli istnieją opcje kompilacji C ++ do poprawnego skompilowanego kodu python, chciałbym również o nich usłyszeć.
Odpowiedzi:
Naprawdę wątpię, żeby to zadziałało. Być może będziesz w stanie przetłumaczyć swój kod na bajtowy kod Java, ale nie spowoduje to magicznej translacji wywołań biblioteki na równoważne wywołania środowiska wykonawczego i bibliotek Java. Mogą nawet nie istnieć równoważne wywołania środowiska wykonawczego Java! Nawet jeśli wyeliminujesz wszystkie zastrzeżone biblioteki, nadal będziesz mieć standardową bibliotekę C ++.
Aby uczynić to konkretnym: twój program C ++ może zawierać wywołanie fprintf (). Ta funkcja jest zaimplementowana w standardowej bibliotece C i jest całkowicie uzasadniona, aby program C ++ mógł ją wywołać. Translator LLVM na LLJVM prawdopodobnie nie zamierza magicznie ustalić sekwencji wywołań środowiska wykonawczego Java, które dadzą wynik równoważny z funkcją fprintf () i zastąpi je w. Aby zapewnić tę funkcję, konieczne będzie zasadniczo ponowne wdrożenie środowisk wykonawczych C i C ++ w Javie kod bajtowy.
Istnieje kilka narzędzi, które wykonują tłumaczenie z C ++ na Java, ale konwertują tylko kilka prostszych wywołań biblioteki wykonawczej. Resztę pozostawiasz do rozgryzienia.
źródło
apr
lub podobnych)