Подтвердить что ты не робот

Возможно ли преобразовать байт-код LLVM в байт-код Java?

Я слышал, что движок Google может запускать любой язык программирования, который можно преобразовать в байт-код Java через него JVM. Я задавался вопросом, можно ли преобразовать байт-код LLVM в байт-код Java, так как было бы интересно запустить языки, поддерживаемые LLVM в Google App Engine JVM.

4b9b3361

Ответ 1

Теперь представляется возможным преобразовать байт-код LLVM IR в байт-код Java, используя интерпретатор LLJVM.

Есть интересный комментарий Disqus (21/03/11) от Grzegorz kraytracing.com, который объясняет вместе с кодом, как он модифицировал процедуру вывода класса Java LLJVM, чтобы испускать немонолитные классы Java, которые согласуются по числу с входными модулями C/С++. Он предполагает, что его техника, как представляется, позволяет избежать чрезмерно длинных "составных" сигнатур аргументов метода Java Constructor, обычно генерируемых LLJVM, и он предоставляет ссылки на его модификации и примеры.

Хотя LLJVM не выглядит так, будто он находится в активной разработке уже пару лет, его по-прежнему размещают в Github, и некоторая документация все еще может быть найдена в его прежнем хранилище в GoogleCode:

LLJVM @Github
Документация LLJVM @GoogleCode

Я также наткнулся на проект Proteuscc, который также использует LLVM для вывода кода байт Java (это говорит о том, что это специально для C/С++, хотя я предполагаю, что проект может быть изменен или передан промежуточным представлением LLVM (IR)). Из http://proteuscc.sourceforge.net:

Общий процесс создания исполняемого файла Java с помощью Proteus можно резюмировать, как показано ниже.

  • Генерировать читаемое человеком представление промежуточного продукта LLVM представление (ll файл)
  • Передайте этот ll файл в качестве аргумента для система компиляции протума
  • Вышеприведенный файл Java jar который может быть выполнен или использован как библиотека.

Я добавил a bash script для компиляции последних версий LLVM и Clang на Ubuntu, он может быть найден как a Github Gist, здесь.

[ ОБНОВЛЕНИЕ 31/03/14] - LLJVM, казалось, был мертв на некоторое время, однако Говард Чу (https://github.com/hyc) сделал LLJVM совместим с последней версией LLVM (3.3). См. ветвь Howard LLJVM-LLVM3.3 в Github, здесь

Ответ 2

Я сомневаюсь, что вы можете, по крайней мере, не без значительных усилий и абстракций во время выполнения (например, построить половину машины фон Неймана для выполнения определенных кодов операций). LLVM-бит-код позволяет использовать весь спектр низкоуровневых небезопасных "делать то, что вы хотите, но мы не будем очищать беспорядок", от прямого, необработанного, без конструктивного распределения памяти до полностью неконтролируемых отбросов - реальных отбросов, а не конверсий - вы можете взять i32 и bitcast до , если хотите. Кроме того, JVM сильно ориентированы на объекты и методы, а ребятам из LLVM повезло, что у них есть указатели на функции и структуры.

С другой стороны, кажется, что C может быть скомпилирован в байт-код Java и LLVM биткод может быть скомпилирован в Javascript (хотя многие функции, например динамическая загрузка и функции stdlib, отсутствуют), поэтому это должно быть возможным, учитывая достаточные усилия.

Ответ 3

Поздно для обсуждения: Sulong выполняет LLVM IR на JVM. Он создает исполняемые узлы (которые являются объектами Java) из IR LLVM вместо преобразования IR LLVM в байт-код Java. Эти исполняемые узлы образуют интерпретатор AST. Вы можете проверить проект на https://github.com/graalvm/sulong или прочитать статью о нем на http://dl.acm.org/citation.cfm?id=2998416. Отказ от ответственности: я работаю над этим проектом.

Ответ 4

Прочтите это: http://vmkit.llvm.org/. Я не уверен, что это поможет вам, но, похоже, это актуально.

Примечание. Этот проект не поддерживается более.