Keno réponse est sur place, mais je peux peut-être donner un peu plus de détail sur ce qu'il se passe et ce que nous allons faire à ce sujet.
Actuellement il y a seulement un LLVM JIT mode:
- Il y a une très trivial interprète pour une simple top-niveau des états.
- Le reste du code est jitted en code machine avant l'exécution. Le code est agressive spécialisées à l'aide de l'exécution des types de valeurs que le code est appliqué, propagé à travers le programme d'aide dynamique de l'inférence de type.
C'est de cette façon Julia obtient de bonnes performances, même lorsque le code est écrit sans annotations de type: si vous appelez f(1)
vous obtenez le code spécialisés pour Int64
- le type d' 1
sur les systèmes 64 bits; si vous appelez f(1.0)
, vous obtenez un nouveau jitted version qui est spécialisé pour Float64
- le type d' 1.0
sur tous les systèmes. Puisque chaque version compilée de la fonction sait quels types il sera arriver, il peut s'exécuter au C de la vitesse. Vous pouvez sabotage cela par l'écriture et l'utilisation de type "instable" de fonctions dont le type de retour dépend des données d'exécution, plutôt que de simplement les types, mais nous avons pris grand soin de ne pas le faire dans la conception de la base de la langue et de la bibliothèque standard.
La plupart de Julia est écrit en lui-même, puis analysé, le type déduit et jitted, de sorte que le démarrage de l'ensemble du système à partir de zéro prend 15 à 20 secondes. Pour le rendre plus rapide, nous avons une mise en scène système qui nous permet d'analyser, de type déduire, et puis mettre en cache une version sérialisée du type déduit de l'AST dans le fichier sys.ji
. Ce fichier est alors chargé et utilisé pour faire fonctionner le système lorsque vous exécutez julia
. Pas de LLVM code ou code machine est mise en cache en sys.ji
, cependant, de sorte que tous les LLVM jitting doit encore être fait à chaque fois julia
démarre, ce qui prend environ 2 secondes.
Ce 2-deuxième retard de démarrage est assez ennuyeux, et nous avons un plan pour le fixer. Le plan de base est d'être en mesure de compiler l'ensemble de Julia programmes binaires: soit des fichiers exécutables qui peuvent être exécutés ou .so
/.dylib
bibliothèques partagées qui peuvent être appelées à partir d'autres programmes comme si elles étaient simplement des bibliothèques C partagées. Le temps de démarrage d'un fichier binaire sera comme n'importe quel autre programme C, de sorte que les 2 secondes le délai de démarrage de la disparition.
Addendum: Depuis novembre 2013, la version de développement de Julia n'a plus de 2 secondes le délai de démarrage car il précompilation de la bibliothèque standard en code binaire. Le temps de démarrage est encore 10x plus lent que Python et Ruby, donc il n'y a de place pour l'amélioration, mais il est assez rapide. La prochaine étape sera de permettre à la précompilation des paquets et des scripts afin que ceux-ci peuvent démarrage rapide, comme Julia elle-même déjà fait.