Чи можливо зробити порт з програми C ++ на Java через LLVM


9

наскільки життєздатним є перенесення програми C ++ на байт-код Java за допомогою LLVM (я думаю, LLJVM)?

Річ у тім, що в даний час у нас є процес, написаний на C ++, але новий клієнт зробив обов'язковим для того, щоб мати змогу запускати програму в декількох платформах , використовуючи віртуальну машину Java без явного коду (без JNI). Ідея полягає в тому, щоб мати можливість взяти створений jar і скопіювати його в різні системи (Linux, Win, 32 біти - 64 біти), і це повинно просто працювати.

Озирнувшись, схоже, можна компілювати C ++ до ІК-коду LLVM, а потім цей код - байт-код Java. Немає необхідності у створеному коді для читання.

Я трохи перевірив подібні речі за допомогою emscripten, для цього потрібен код C ++ і компілюється в JavaScript. Результат дійсний JS, але абсолютно нечитабельний (схожий на Assambler).

  • Хтось робив порт програми з C ++ до байт-коду Java, використовуючи цю техніку?
  • З якими проблемами ми могли б зіткнутися?
  • Чи правильний підхід до виробничого коду?

Щоб зробити більш чітким свою думку після деяких коментарів, можливо, порт не використовується належним чином, я не очікую, що в результаті читається вихідний код, просто байт-код Java, тому це вже не "порт", який буде розроблятися вже більше, тільки що цільовою платформою повинен бути java JVM, а не рідний ассимблер.

Примітка. Я знаю, що в даний час у нас є кілька нестандартних C ++ і бібліотек із закритим вихідним кодом, ми прагнемо видалити цей нестандартний код і всі бібліотеки з закритим вихідним кодом та використовувати Free Libre Open Source Software, тому припустимо, що весь код є стандартним кодом C ++ з весь код, наявний під час компіляції.

Примітка2: Неможливо написати портативний код C ++, а потім компілювати його до потрібної цільової платформи, складена програма повинна бути багатоплатформою, таким чином, використання JVM.

Примітка3: Зараз ми не розглядаємо подібні рішення, застосовані до Python або іншої мовної бази, але я також хотів би почути про це. З цього я маю на увазі, що нашим цільовим виконуваним файлом повинен бути байт-код Java, але якщо є варіанти для компіляції C ++ до дійсного компільованого python-коду, я також хотів би почути про них.


не впевнений, що ви маєте на увазі в останньому реченні про Python, але Jython точно такий же: використовуйте JVM замість VM Python, і використовуйте саме в такому сценарії: програмісти хочуть використовувати Python, розгортання повинно бути на JVM.
— Хав'єр

Про скільки рядків коду ми говоримо? Можливо, варто витратити час, щоб переписати його, але це не просте рішення. Крім того, якщо ваш код має якусь арифметику вказівника, мені було б цікаво дізнатися, як це обробляється під час роботи над JVM.
— Леві Моррісон

1
Налагодження, що має бути цікавим O_o
— Daniel Gratzer

@LeviMorrison. Код є досить обширним (різні бібліотечні залежності від комунікацій, функцій utlity), але передбачається, що ми маємо доступний весь код під час компіляції. А також якщо інший клієнт цього не вимагає, ми все одно генеруємо нативну бінарну.
— Хав'єр Містер

@jozefg. Щодо арифметики вказівника та наміченої налагодження, я не сподіваюся бути налагоджуваною. Наприклад, Emscripten робить те ж саме, але цільовою мовою є Javascript, ви закінчуєте просто великим байтовим масивом як купу і бітові мудрі операції для лічильника програм і просто операції з байтами без об'єктів, рядків чи подібних речей. Я очікую, що результат, схожий на assamblear в байт-коді Java, можна вважати, що він не стане налагоджуваним.
— Хав'єр Містер

Відповіді:


11

Я дуже сумніваюся, що це спрацює. Можливо, ви зможете перевести свій код у байт-код Java, але він не буде магічним чином переводити дзвінки бібліотеки в еквівалентні дзвінки до Java-режиму виконання та бібліотеки. Можливо, навіть не існує еквівалентних дзвінків під час виконання Java! Навіть якщо ви видалите всі власні бібліотеки, вам все одно залишається стандартна бібліотека C ++.

Щоб зробити це конкретним: ваша програма C ++ може містити виклик до fprintf (). Ця функція реалізована в стандартній бібліотеці С, і вона цілком легітимно називає програму C ++. Перекладач LLVM на LLJVM, ймовірно, не збирається магічно розібратися в послідовності викликів часу запуску Java, які дадуть еквівалентний результат fprintf () та замінять їх. байт-код.

Є деякі інструменти, які виконують C ++ до перекладу Java, але вони конвертують лише кілька простих викликів бібліотеки виконання. Решта залишається вам розібратися.


Я бачу вашу думку, але наскільки я розумію, emscripten робить щось подібне з цільовим Javascript, якщо я не зрозумів, що emscripten надає спеціальну стандартну бібліотеку, щоб уникнути того, на що ви вказали (і навіть відображення для webGL через бібліотеку SDL ). Але я не можу знайти еквівалент Java (LLJVM здається покинутим). Я думаю, пропоную байт-код llvm як платформу незалежної збірки (звичайно, без гілок компіляції залежно від платформи, за API чи даними; використовуючи aprабо подібне)
— Хав'єр Містер

3
lljvm забезпечує бібліотеку виконання C, частково як C, зібраний у байт-код JVM, а частково як Java-класи. Це досить повний ліб. Вам потрібно створити еквівалент libstdc ++. Також поки що lljvm поки що фактично не підтримує C ++. Я намагався налаштувати lljvm, щоб працювати з новітньою збіркою llvm. Це повільно, оскільки API та інструменти llvm постійно змінюються між випусками. Ви можете слідувати далі, зараз він майже в зручній формі. github.com/hyc/lljvm/tree/llvm3.3
— HyC
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.