web-dev-qa-db-fra.com

Est-il possible de transformer le bytecode LLVM en un bytecode Java?

J'ai entendu dire que Google App Engine pouvait exécuter n'importe quel langage de programmation pouvant être transformé en bytecode Java via JVM. Je me suis demandé s'il serait possible de convertir le bytecode LLVM en un bytecode Java, car il serait intéressant d'utiliser des langages que LLVM prend en charge dans Google App Engine JVM.

33
Ben Page

Il semble maintenant possible de convertir le bytecode LLVM IR en un octet Java, en utilisant le interpréteur LLJVM .

Il y a un intéressant { commentaire Disqus } (21/03/11) de Grzegorz sur kraytracing.com qui explique, avec le code, comment il a modifié la routine de sortie de la classe Java de LLJVM pour émettre des non -Les classes Java monolithiques dont le nombre correspond aux modules d'entrée C/C++. Il suggère que sa technique semble éviter les signatures d'arguments de la méthode Java Constructor 'composées' excessivement longues généralement générées par LLJVM, et il fournit des liens vers ses modifications et exemples.

Bien que LLJVM ne semble pas être en développement actif depuis quelques années maintenant, elle est toujours hébergée sur Github et une documentation est toujours disponible sur son ancien référentiel sur GoogleCode:

LLJVM @ Github
Documentation de LLJVM @ GoogleCode

Je suis également tombé sur le projet ' Proteuscc ' qui utilise également LLVM pour générer du code en octets Java (cela suggère que c'est spécifiquement pour C/C++, bien que je suppose que le projet pourrait être modifié ou alimenté par LLVM Intermediate Representation ( IR)). De http://proteuscc.sourceforge.net :

Le processus général de production d’un exécutable Java avec Proteus peut ensuite être résumé comme suit.

  1. Générer une représentation lisible par l'homme de la représentation intermédiaire de LLVM (fichier lll)
  2. Transmettez ce fichier ll comme argument au système de compilation Proteus
  3. Ce qui précède produira un fichier jar Java qui peut être exécuté ou utilisé en tant que bibliothèque.

J'ai étendu un script bash pour compiler les dernières versions de LLVM et Clang sur Ubuntu }, il peut être trouvé sous la forme d'un Github Gist, ici .

[ UPDATE 31/03/14 ] - LLJVM semble être mort depuis quelque temps, cependant, Howard Chu ( https://github.com/hyc ) semble avoir rendu LLJVM compatible avec la dernière version de LLVM (3.3). Voir branche de Howard LLJVM-LLVM3.3 sur Github, ici

25
Big Rich

Je doute que vous puissiez le faire, du moins pas sans un effort considérable et des abstractions d’exécution (par exemple, la construction d’un demi-ordinateur Von Neumann pour exécuter certains opcodes). LLVM bitcode permet à toute la gamme de fonctionnalités de bas niveau non sécurisées "faites ce que vous voulez, mais nous ne nettoierons pas le désordre", allant de l’allocation de mémoire directe, brute, sans constructeur jusqu’à des conversions totalement non contrôlées - des conversions réelles, pas des conversions - vous pouvez utiliser i32 et bitcast pour un %stuff * si vous le souhaitez. En outre, les machines virtuelles sont fortement axées sur les objets et les méthodes, alors que les gars de LLVM ont de la chance de disposer de pointeurs et de structures de fonction.

D'autre part, il semble que C puisse être compilé en Java bytecode et Le bitcode LLVM peut être compilé en Javascript (bien que de nombreuses fonctionnalités, telles que le chargement dynamique et les fonctions stdlib, manquent), être possible, avec suffisamment d'effort.

7
user395760

En retard à la discussion: Sulong exécute LLVM IR sur la JVM. Il crée des noeuds exécutables (qui sont des objets Java) à partir du LLVM IR au lieu de convertir le LLVM IR en bytecode Java. Ces nœuds exécutables forment un interpréteur AST. Vous pouvez consulter le projet à https://github.com/graalvm/sulong ou lire un article à ce sujet à http://dl.acm.org/citation.cfm?id=2998416 . Disclaimer: Je travaille sur ce projet.

3
box

Lisez ceci: http://vmkit.llvm.org/ . Je ne suis pas sûr que cela vous aidera, mais cela semble être pertinent.

Note: Ce projet n'est plus maintenu.

0
AlexR