Чи можливо зробити порт з програми 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.