Je me demande pourquoi beaucoup de programmeurs prétendent que Lua est plus rapide que n'importe quel autre langage de script?
Qu'ont-ils fait de plus efficace que les autres langages?
Y a-t-il quelque chose de complètement différent dans leur approche?
Qu'est-ce qui fait que leur code s'exécute plus rapidement que Python, par exemple?
Réponses
Trop de publicités?Ils sont vraiment de bons ingénieurs et font cela depuis longtemps. Les deux grandes réussites semblent être leur VM basée sur les registres et leur bonne gestion de la mémoire.
-
Je pense que c'était Roberto Ierusalimschy et David Gregg qui ont réalisé une série d'expériences très précises comparant les VM basées sur les registres avec les VM basées sur la pile. Les VM basées sur les registres s'avèrent exprimer des programmes similaires avec moins d'instructions de VM et donc moins de surdécodage.
-
La gestion de la mémoire est un collecteur de déchets incrementiel sérieux, et il est complètement précis, non conservateur. Pas de jonglage avec le comptage des références. Pour rendre cela possible, l'API C est très soigneusement conçue pour ne pas exposer directement aux objets Lua alloués sur le tas au code C. Vous pouvez voir cela dans l'évolution de Lua 2.5 à Lua 5.
Quelques autres choses qui contribuent à la vitesse :
-
Ils ont une implémentation extrêmement astucieuse des fonctions de première classe qui fait exactement les bons compromis pour un langage de script dans lequel il est rare qu'une fonction renvoie une fonction. De ce fait, ils obtiennent généralement un accès extrêmement rapide aux variables locales.
-
Ils ont mis beaucoup d'efforts dans leur implémentation de tables (dictionnaires, hachages, tableaux associatifs, peu importe comment vous voulez les appeler) afin qu'elles soient très efficaces aussi bien lorsqu'elles sont utilisées comme listes, ensembles, tableaux, ou structures de données polyvalentes. Un bon exemple de comment réussir en ne faisant qu'une seule chose et en la faisant très bien - la table Lua est la seule structure de données mutable dans le langage.
Il a été conçu pour un embedding très léger. Lua en tant qu'exécutable ne fait que 50k et ne dispose presque pas de bibliothèques. Son design est d'être un langage de script pour se superposer à C, donc il ne s'embête pas avec un parseur regex complet ou même une bibliothèque de sockets. Il est plus rapide que d'autres langages interprétés car il a été optimisé pour la vitesse plutôt que pour la commodité.
Cela ne veut pas dire pour autant que c'est nécessairement le langage interprété LE PLUS RAPIDE non plus. Il y a d'autres langages moins connus comme IO et angelscript qui peuvent donner du fil à retordre à lua dans les tests de vitesse.
De Wikipedia:
Les programmes Lua ne sont pas interprétés directement à partir du fichier Lua textuel, mais sont compilés en bytecode qui est ensuite exécuté sur la machine virtuelle Lua. Le processus de compilation est généralement transparent pour l'utilisateur et est effectué pendant l'exécution, mais il peut être fait hors ligne afin de augmenter les performances de chargement ou de réduire l'empreinte mémoire de l'hôte environnement en laissant de côté le compilateur.
Comme la plupart des processeurs, et contrairement à la plupart des machines virtuelles (qui sont basées sur la pile), la VM Lua est basée sur les registres, et donc ressemble davantage à une conception matérielle réelle. L'architecture des registres à la fois évite les copies excessives de valeurs et réduit le nombre total d'instructions par fonction. La machine virtuelle de Lua 5 est la première MV basée sur les registres à avoir un usage étendu.[4] Parrot (actuellement en développement) est une autre MV basée sur les registres bien connue.
Lua semble également être un langage plus petit que par exemple Python qui doit prendre en charge beaucoup plus de situations (méta-programmation).
En plus de la réponse de Norman, notez que lorsque les gens disent que Lua est le "langage de script le plus rapide", ils veulent souvent dire sa mise en œuvre LuaJIT.
Le LuaJIT est rapide car il combine ce qui est probablement le compilateur JIT de traçage le plus avancé au monde avec un interprète Lua super-rapide comportant de nombreuses parties écrites en langage d'assemblage (cet interprète seul est beaucoup plus rapide que l'implémentation de référence de Lua, qui a d'autres objectifs tels que la portabilité).
La raison pour laquelle cette merveille technologique cible Lua, cependant, est que c'est un langage très simple comparé à la plupart des langages de script, ce qui rend son implémentation plus facile. Considérez que LuaJIT est écrit par une seule personne, Mike Pall. Il pense cependant que quelque chose de similaire pourrait être fait pour d'autres langages, mais cela demanderait plus d'efforts.
Pour en savoir plus à ce sujet, consultez ce commentaire de Brendan Eich (créateur de JavaScript), celui de Mike Pall et le reste de ce superbe fil de discussion LtU pendant que vous y êtes ;)
À propos de l'affirmation : il semble que certains benchmarks comme le Jeu de benchmarks de langages informatiques montre que, pour la plupart des programmes, il est plus rapide que la plupart des langages interprétés.
Pourquoi ? Je ne suis pas spécialiste, mais je sais que le langage a été conçu par un petit nombre de personnes (mais en écoutant les remarques et suggestions des utilisateurs), en utilisant un analyseur syntaxique et une machine virtuelle soigneusement optimisés à la main, avec un collecteur de déchets conçu pour la vitesse (pour être utilisable dans les jeux), etc.