Насколько жизнеспособно портировать приложение C ++ на байт-код Java, используя LLVM (я думаю, LLJVM)?
Дело в том, что в настоящее время у нас есть процесс, написанный на C ++, но новый клиент сделал обязательным, чтобы иметь возможность запускать программу многоплатформенным способом, используя виртуальную машину Java без явно собственного кода (без JNI). Идея состоит в том, чтобы иметь возможность взять сгенерированный jar и затем скопировать его в разные системы (Linux, Win, 32 бит - 64 бит), и он должен просто работать.
Осмотр выглядит так, как будто можно скомпилировать C ++ в код LLVM IR, а затем этот код в байт-код Java. Сгенерированный код не нужен для чтения.
Я немного протестировал подобные вещи, используя emscripten, он берет код C ++ и компилирует его в JavaScript. Результат действительный JS, но совершенно нечитаемый (выглядит как ассамблер).
- Кто-нибудь сделал порт приложения из C ++ в Java байт-код, используя эту технику?
- С какими проблемами мы можем столкнуться?
- Является ли действительный подход для производственного кода?
Чтобы прояснить мою точку зрения после некоторых комментариев, возможно, порт используется недостаточно хорошо, я не ожидаю читабельный исходный код в результате, просто байт-код Java, так что это не «порт», который будет разрабатываться больше, просто целевой платформой должна быть Java JVM, а не нативная ассамбляр.
Примечание. Мне известно, что в настоящее время у нас есть несколько нестандартных библиотек C ++ и закрытых исходных кодов, мы собираемся удалить этот нестандартный код и все библиотеки закрытых исходных кодов и использовать бесплатное программное обеспечение с открытым исходным кодом Libre, поэтому предположим, что весь код является стандартным кодом C ++ весь код доступен во время компиляции.
Примечание 2: Это не вариант написания переносимого кода на C ++, а затем компиляции его на нужную целевую платформу, скомпилированная программа должна быть многоплатформенной, поэтому используется JVM.
Примечание 3: В настоящее время мы не рассматриваем похожие решения, применяемые к Python или другой языковой базе, но я также хотел бы услышать об этом. Под этим я подразумеваю, что нашим целевым исполняемым файлом должен быть байт-код java, но если есть варианты для компиляции C ++ в допустимый скомпилированный код на python, я также хотел бы услышать о них.
Ответы:
Я действительно сомневаюсь, что это сработает. Возможно, вы сможете преобразовать свой код в байт-код Java, но он не будет магическим образом переводить вызовы библиотеки в эквивалентные вызовы среды выполнения Java и библиотек. Может даже не быть эквивалентных вызовов времени выполнения Java! Даже если вы удалите все проприетарные библиотеки, вы все равно останетесь со стандартной библиотекой C ++.
Чтобы сделать это более конкретным: ваша C ++ программа может содержать вызов fprintf (). Эта функция реализована в стандартной библиотеке C, и она вполне допустима для программы на C ++. Переводчик LLVM в LLJVM, вероятно, не собирается волшебным образом выяснять последовательность вызовов времени выполнения Java, которые приведут к эквивалентному результату для fprintf (), и подставлять их в. Чтобы обеспечить, что средство потребует существенного переопределения времени выполнения C и C ++ в Java байт код
Есть некоторые инструменты, которые выполняют перевод C ++ в Java, но они конвертируют лишь несколько простых вызовов библиотеки времени выполнения. Остальные оставлены для вас, чтобы выяснить.
источник
apr
или подобное)