Quelle est la signification de la phrase «nous voulions qu'elle soit compilée afin qu'elle ne brûle pas le CPU en faisant les mauvaises choses».

10

Je lisais cet article. Il contient le paragraphe suivant.

Et Scala s'est-elle avérée rapide? Eh bien, quelle est votre définition du jeûne? À peu près aussi rapide que Java. Il ne doit pas être aussi rapide que C ou Assembly. Python n'est pas beaucoup plus rapide que Ruby. Nous voulions faire plus avec moins de machines, en tirant un meilleur parti de la concurrence; nous voulions qu'il soit compilé afin qu'il ne brûle pas le CPU en faisant les mauvaises choses.

Je cherche le sens de la dernière phrase. Comment le langage interprété incitera-t-il le CPU à faire des "mauvaises" choses?

user2434
la source
3
Appeler tout ce qui se compile en code octet JVM interprété est un peu libéral avec l'usage.
Rig

Réponses:

47

Si le code dit

A = A + 1

le code compilé fait cela

add A, 1

le code interprété fait cela (ou une certaine variation)

look up the location of A in the symbol table
find the value of A
see that 1 is a constant
get its value
add the value of A and the value of 1
look up the location of A in the symbol table
store the new value of A

vous avez l'idée?

Mike Dunlavey
la source
3
Parfois, une simplification excessive rend vraiment l'image plus claire ;-) (juste pour être complet: de nombreux interprètes bien connus optimisent certaines des étapes, ils sont donc à mi-chemin entre les deux exemples "d'implémentations" ici).
Joachim Sauer
3
@JoachimSauer: Vous avez bien sûr raison. Il est toujours difficile de faire fonctionner un interprète avec moins d'un facteur de 10 pénalités de vitesse par rapport au code compilé. Si le langage passe vraiment tout son temps dans des fonctions compilées subordonnées qui doivent être appelées de toute façon, comme les bibliothèques mathématiques ou les E / S, le coût de l'interprétation n'est pas un problème.
Mike Dunlavey
1
Ceci est une description étonnante
Jamie Taylor
13

nous voulions qu'il soit compilé afin qu'il ne brûle pas le CPU en faisant les mauvaises choses.

On dirait qu'ils font référence à compilé vs interprété. Très probablement à toute l'histoire de Twitter déplaçant des tâches de traitement en arrière-plan vers Scala (compilé) après avoir initialement développé dans Ruby On Rails (interprété).

Une explication du code compilé vs interprété ici .

Avec un langage compilé, le code que vous entrez est réduit à un ensemble d'instructions spécifiques à la machine avant d'être enregistré en tant que fichier exécutable. Avec les langues interprétées, le code est enregistré dans le même format que vous avez entré. Les programmes compilés s'exécutent généralement plus rapidement que les programmes interprétés car les programmes interprétés doivent être réduits aux instructions machine lors de l'exécution.

KrisG
la source
Heureux de vous donner votre premier +1. Bienvenue chez P.SE!
haylem
4
(Il vaut peut-être la peine de mentionner que Scala - car il se trouve sur la JVM - n'est techniquement compilé qu'en octets).
haylem
Je ne savais pas que Scala était basé sur JVM. Ce qui signifie que c'est probablement JIT compilé. Dans ce cas, pourquoi Twitter n'est-il pas simplement passé de Ruby on Rails à JRuby? Vous penseriez que ce serait une migration plus facile avec l'avantage de compilé.
KrisG
3
Ils cherchaient également un meilleur modèle de concurrence et ils avaient des problèmes avec la collecte des ordures de Ruby. L'article le décrit en détail.
scrwtp
9

«Mauvais truc» signifie ici la surcharge nécessaire à l'interpréteur pour analyser et traiter le code. Il est lié à la notion de langages interprétés vs compilés. Il existe plusieurs modèles de traduction de code utilisés, qui entrent dans l'une des catégories suivantes:

  • Compilation native - le code source est directement compilé en code machine. Meilleures performances au détriment de la portabilité. Communément associé à C et C ++,
  • Compilation intermédiaire - le code source est compilé dans un langage intermédiaire simplifié (bytecode), qui est ensuite interprété ou compilé (compilation juste à temps) en code machine pendant l'exécution. Meilleure portabilité que le code natif, meilleures performances que l'interprétation pure tout en conservant certains des avantages de l'interprétation (comme la liaison tardive). Les exemples incluent C #, Java et d'autres langages ciblant JVM et .NET CLR,
  • Interprétation - le code source n'est pas directement traduit en code machine, il est plutôt interprété et exécuté par un programme d'interprétation dédié. Les interpréteurs varient en sophistication, dans l'implémentation naïve, mais cela revient à analyser, analyser et exécuter le code source ligne par ligne. L'interprétation permet une plus grande flexibilité que la compilation, par conséquent les langages interprétés utilisent plus largement le typage dynamique ou la réflexion, par exemple. Les langages interprétés sont souvent considérés comme offrant une productivité accrue des développeurs, car ils nécessitent moins de code standard et se prêtent bien à un prototypage rapide. L'inconvénient est une performance réduite. Communément associé à JavaScript, Ruby ou Python.

Par conséquent, le choix entre le langage interprété et le langage compilé se résume à la question: qu'est-ce que nous apprécions le plus, la productivité ou les performances des développeurs? La migration décrite dans l'article semble suivre la même ligne de pensée, avec un langage de prototypage puissant Ruby remplacé par Scala basé sur JVM pour des raisons de performances.

scrwtp
la source
-1 la façon dont la réponse est formulée, semble trop simpliste. Il ignore complètement des choses comme JIT (compilation juste à temps ) - qui est d'ailleurs la façon dont Scala s'exécute sur JVM / CLR
gnat
Vrai. Réécrit la réponse, il ajoutait peu au sujet pour ainsi dire.
scrwtp
-3

Dans ce cas, j'ai pris the wrong stuffpour signifier le manque de sécurité de type dans le code non compilé.

Ainsi, non seulement le code est interprété plus lentement, mais il est également plus bogué ...

Neil Twist
la source
8
Vous supposez que les langages compilés sont sûrs pour les types et que ceux interprétés ne le sont pas. Il existe de nombreux contre-exemples. Par exemple, lisp peut être compilé et n'est pas fortement typé, tandis que Haskell peut être interprété et est TRÈS sûr pour le type
Zachary K
1
Assimiler "pas sûr type" avec "plus de buggy" est FUD poussé par les personnes ayant des produits à vendre.
user16764
1
@ user16764: Ce n'est pas du FUD si c'est vrai. IME les gens qui poussent des bêtises sur le sujet pour vendre des produits sont ceux qui essaient de minimiser le lien entre la frappe dynamique et les erreurs. ("Ce n'est qu'un type d'erreur ", etc.)
Mason Wheeler