Question

Est-il possible de concevoir quelque chose comme Ruby ou Clojure sans perte de performance significative dans de nombreuses situations par rapport à C / Java? Est-ce que la conception du matériel joue un rôle?

Edit: Avec important je veux dire dans un ordre de grandeur, non seulement procent dix

Edit: Je pense que delnan est correct avec moi signifie des langues dynamiques alors j'ai changé le titre

Était-ce utile?

La solution

La performance dépend de beaucoup de choses. Bien sûr, la sémantique de la langue doivent être conservés même si nous compilons - vous ne pouvez pas supprimer l'envoi dynamique de Ruby, il accélérerait les choses drmatically mais il serait tout à fait casser 95% du tout le code Ruby dans le monde. Mais encore, une grande partie de la performance dépend de la façon intelligente la mise en œuvre est.

Je suppose, par « haut niveau », vous voulez dire « dynamique »? Haskell et OCaml sont extrêmement haut niveau, mais sont compilés est nativement et peuvent surperformer C # ou Java, même C et C ++ dans certains cas, d'angle - surtout si le parallélisme entre en jeu. Et ils ont certainement pas été conçus avec des performances comme objectif n ° 1. Mais écrivains compilateur, en particulier ceux qui sont axés langues onfunctional, sont un peuple très intelligent. Si vous ou moi avons commencé un langage de haut niveau, même si nous avons utilisé par exemple LLVM comme back-end pour la compilation native, nous ne se approcher cette performance.

Faire des langues dynamiques sont rapides est plus difficile - ils retardent beaucoup de décisions (types, membres d'une classe / un objet, ...) à la durée d'exécution au lieu de compiletime, et alors que l'analyse de code statique peuvent parfois se révéler, il est impossible dans les lignes n et m, vous devez toujours porter une exécution avancée autour et faire pas mal de choses compilateur d'un langage statique peut faire à compiletime. Même l'envoi dynamique peut être optimisé avec une machine virtuelle plus intelligent ( Inline Cache anyone?), Mais il est un beaucoup de travail. Plus d'une petite langue nouvelle fangeled pourrait faire, ce qui est.

Voir aussi Steve Langues dynamiques de Yegge Strike Back .

Et bien sûr, ce qui est une perte de peformance importante? 100 fois plus lent que C se lit comme beaucoup, mais comme nous le savons tous, 80% du temps d'exécution est passé à 20% du code = 80% du code ne sera pas avoir un impact notable sur les performances percieved du programme. Pour les 20% restants, vous pouvez toujours le réécrire en C ou C ++ et l'appeler de la langue dynamique. Pour de nombreuses applications, cela suffit (pour certains, vous ne même pas besoin d'Optimize). Pour le reste ... eh bien, si la performance est que critique, vous devez propably écrire dans un langage conçu pour la performance.

Autres conseils

Ne confondez pas la conception de la langue avec la plate-forme qu'il exécute.

Par exemple, Java est un langage de haut niveau. Il fonctionne sur la machine virtuelle Java (comme le fait Clojure - identifié ci-dessus, et JRuby - une version Java de Ruby). La machine virtuelle Java effectuera une analyse byte-code et optimiser la façon dont les pistes de code (en utilisant l'analyse d'échappement, juste à temps la compilation, etc.). Ainsi, la plate-forme a un effet sur la performance qui est en grande partie indépendante de la langue elle-même (voir pour plus d'informations sur les performances Java et des comparaisons à C / C ++)

Perte par rapport à quoi? Si vous avez besoin d'un collecteur d'ordures ou des fermetures alors vous avez besoin, et vous allez payer le prix peu importe. Si une langue les rend facile pour vous d'obtenir à, cela ne signifie pas que vous avez de ne pas les utiliser lorsque vous ne les avez pas besoin.

Si une langue est interprétée au lieu de compilation, qui va introduire un ordre de ralentissement de l'ampleur. Mais le langage d'une telle compensation peut avoir des avantages, comme la facilité d'utilisation, l'indépendance de la plate-forme, et ne pas avoir à compiler. Et, les programmes que vous écrivez en eux peuvent ne pas fonctionner assez longtemps pour que la vitesse d'un problème.

Il peut y avoir des implémentations de langage qui introduisent une lenteur sans raison, mais ceux qui ne doivent pas être utilisés.

Vous pouvez regarder ce que le DARPA HPCS initiative a mis au point. Il y avait 3 langues de programmation proposées: Forteresse de Sun, IBM X10 et la chapelle Cray. Les deux derniers sont encore en développement. Que ce soit l'un de ces rencontrer votre définition de haut niveau Je ne sais pas.

Et oui, la conception matérielle ne jouent certainement un rôle. Tous les trois de ces langues sont ciblées sur des supercalculateurs avec de très nombreux processeurs et présenter des caractéristiques appropriées à ce domaine.

Il est certainement possible. Par exemple, Objective-C est un langage typé dynamiquement qui a des performances comparables à C ++ (bien qu'un petit peu plus lent, en général, mais encore à peu près équivalent).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top