Можно ли преобразовать байт-код LLVM в байт-код Java? - PullRequest
37 голосов
/ 08 февраля 2011

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

Ответы [ 4 ]

28 голосов
/ 24 ноября 2012

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

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

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

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

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

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

  1. Создание понятного человеку представления промежуточного представления LLVM (llfile)
  2. Передайте этот файл ll в качестве аргумента в систему компиляции proteus
  3. Приведенное выше описание создаст файл jar Java, который можно выполнить или использовать в качестве библиотеки

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

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

7 голосов
/ 08 февраля 2011

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

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

5 голосов
/ 29 августа 2017

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

0 голосов
/ 08 февраля 2011

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

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

...