Existe-t-il un compilateur juste à temps pour les langages compilés, tels que C et C ++? (Les premiers noms qui me viennent à l'esprit sont Clang et LLVM! Mais je ne pense pas qu'ils le supportent actuellement.)
Explication:
Je pense que le logiciel pourrait tirer parti des retours d'informations sur les profils d'exécution et d'une recompilation optimisée de manière agressive des zones sensibles au moment de l'exécution, même pour les langages compilés sur machines tels que C et C ++.
L'optimisation guidée par le profil fait le même travail, mais à la différence un JIT serait plus flexible dans différents environnements. Dans PGO, vous exécutez votre binaire avant de le publier. Une fois que vous l'avez publié, il n'utiliserait aucun retour d'informations sur l'environnement / les entrées collectées lors de l'exécution. Par conséquent, si le modèle d'entrée est modifié, il en résulte une dégradation des performances. Mais JIT fonctionne bien même dans ces conditions.
Cependant, je pense qu’il est controversé de savoir si l’ECM compilant l’avantage lié aux performances dépasse ses propres frais généraux.
la source
Réponses:
[Voir l'historique des modifications pour une réponse très différente, à présent obsolète.]
Oui, il existe deux compilateurs JIT pour C et / ou C ++.
Cling (comme vous pouvez le deviner dans le jeu) est basé sur Clang / LLVM. Il agit comme un interprète. Autrement dit, vous lui donnez du code source, vous lui donnez une commande et il s'exécute. L'accent est mis ici principalement sur la commodité et la compilation rapide, pas sur l'optimisation maximale. En tant que tel, bien que techniquement une réponse à la question elle-même, cela ne convient pas vraiment à l'intention du PO.
Une autre possibilité est NativeJIT . Cela correspond à la question un peu différemment. En particulier, il n'accepte pas le code source C ou C ++, ne le compile pas et ne l'exécute pas. C'est plutôt un petit compilateur que vous pouvez compiler dans votre programme C ++. Il accepte une expression qui est fondamentalement exprimée sous la forme d'un EDSL dans votre programme C ++ et génère le code machine réel à partir de celui-ci, que vous pouvez ensuite exécuter. Cela correspond beaucoup mieux à un cadre dans lequel vous pouvez compiler la plupart de votre programme avec un compilateur normal, tout en ayant quelques expressions que vous ne saurez pas avant l'exécution, que vous voulez exécuter avec quelque chose qui approche de la vitesse d'exécution optimale.
En ce qui concerne l’intention apparente de la question initiale, je pense que l’essentiel de ma réponse reste valable: même si un compilateur JIT peut s’adapter, par exemple, à des données qui varient d’une exécution à l’autre, ou qui varient même de manière dynamique au cours d’une exécution unique, la réalité est que cela fait relativement peu de différence, du moins en règle générale. Dans la plupart des cas, l'exécution d'un compilateur au moment de l'exécution signifie que vous devez renoncer à un peu d'optimisation. Par conséquent, le mieux que vous puissiez espérer, c'est qu'il soit presque aussi rapide que ce qu'un compilateur traditionnel produirait.
Bien qu'il soit possible de postuler des situations dans lesquelles les informations disponibles pour un compilateur JIT pourraient lui permettre de générer un code nettement supérieur à celui d'un compilateur conventionnel, il semble en pratique que cela se produise dans la pratique (et dans la plupart des cas où j'ai pu vérifier c’est vraiment dû à un problème dans le code source, pas au modèle de compilation statique).
la source
Oui, il existe des compilateurs JIT pour C ++. Du point de vue des performances pures, je pense que l’optimisation guidée par le profil (PGO) est toujours supérieure.
Cependant, cela ne signifie pas que la compilation JIT n'est pas encore utilisée dans la pratique. Par exemple, Apple utilise LLVM en tant que JIT pour son pipeline OpenGL. C'est un domaine dans lequel vous disposez de beaucoup plus d'informations au moment de l'exécution, ce qui peut être utilisé pour supprimer beaucoup de code mort.
Une autre application intéressante de JIT est Cling, un interpréteur C ++ interactif basé sur LLVM et Clang: https://root.cern.ch/cling
Voici un exemple de session:
Ce n'est pas un projet de jouet, mais il est effectivement utilisé au CERN, par exemple, pour développer le code du grand collisionneur de hadrons.
la source
C ++ / CLI est jeté. Certes, C ++ / CLI n'est pas C ++ mais c'est assez proche. Cela dit, JIT de Microsoft ne fait pas les optimisations super intelligentes / mignonnes basées sur le comportement d'exécution que vous demandez, du moins pas à ma connaissance. Donc, cela n'aide vraiment pas.
http://nestedvm.ibex.org/ transforme MIPS en bytecode Java qui serait ensuite jeté. Le problème avec cette approche de votre question est que vous perdez une grande partie de l’information utile au moment où elle parvient à l’ECM.
la source
Tout d'abord, je suppose que vous voudriez un jit de traçage plutôt qu'un jit de méthode.
La meilleure approche consiste à compiler le code dans llvm IR, puis à ajouter du code de traçage avant de produire un exécutable natif. Une fois qu'un bloc de code est suffisamment utilisé et une fois que suffisamment d'informations sur les valeurs (et non les types comme dans les langages dynamiques) des variables ont été collectées, le code peut être recompilé (à partir de l'IR) avec des gardes basés sur les valeurs des variables.
Je crois me souvenir qu’il ya eu quelques progrès dans la fabrication de j / c ++ jit in clang sous le nom libclang.
la source