Я слышал, что движок Google может запускать любой язык программирования, который можно преобразовать в байт-код Java через него JVM
. Я задавался вопросом, можно ли преобразовать байт-код LLVM в байт-код Java, так как было бы интересно запустить языки, поддерживаемые LLVM
в Google App Engine JVM
.
Возможно ли преобразовать байт-код LLVM в байт-код Java?
Ответ 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/. Я не уверен, что это поможет вам, но, похоже, это актуально.
Примечание. Этот проект не поддерживается более.
Ответ 5
По состоянию на сентябрь 2019 года GraalVM является более доступным и стабильным вариантом для рассмотрения.
https://www.graalvm.org/docs/reference-manual/languages/llvm/