Pour autant que je comprends, tous les langages de script et les principaux programmes scientifiques sont généralement écrits en C; cela rend l'implémentation désordonnée, mais d'une manière directe au point.
Je comprends que ces personnes souhaitent maximiser leurs performances, mais existe-t-il une réelle différence entre l'utilisation de chaînes C et de structures C et l'utilisation de classes C++; C++ semble fonctionner de la même manière, à part les fonctions virtuelles, il stocke une fonction de classe une fois et chaque instance de cette classe appelle cette fonction.
Qu'est-ce qui rend C plus rapide et est-ce une différence notable dans un projet tel que python ou sqlite qui doit être le plus rapide?
Le C++ est souvent utilisé pour les programmes scientifiques. La popularité de C peut décliner dans ce domaine. Fortran reste populaire en tant que langue "bas niveau".
En C++, "vous ne payez que ce que vous utilisez". Il n'y a donc rien de plus lent que C. En particulier pour les programmes scientifiques, les modèles d'expression permettent d'effectuer une optimisation personnalisée en utilisant le moteur de modèle pour traiter la sémantique du programme.
La raison pour laquelle C est choisi pour des projets tels que Python est que beaucoup de gens le comprennent (relativement) complètement, donc une grande base de code ne confondra pas beaucoup d'un grand pool de contributeurs.
SQLite a besoin d'une petite taille de code exécutable, où C a un léger Edge. Une utilisation judicieuse de C++ permet toujours une utilisation dans des applications intégrées, mais elle est moins populaire en raison de la crainte que des fonctionnalités de langage indésirables ne s'introduisent.
Je ne pense pas que la raison soit autant liée aux performances qu'à l'interopérabilité. Le langage C++ est plus complexe que le langage C, mais du point de vue des performances, il ne devrait pas y avoir de différence notable dans les deux sens. Certaines constructions C++ sont plus rapides que l'équivalent C (std::sort
est plus rapide que qsort
) et il existe probablement de bons exemples de l'inverse.
EDIT: Côté interopérabilité ...
Fondamentalement, la norme C++ ne définit pas certaines des choses qui pourraient être nécessaires pour une interopérabilité facile entre des fichiers binaires créés avec différents compilateurs/versions. Le problème le plus notable ici serait la convention de dénomination des symboles dans le binaire. En C, le langage définit un mappage unique de chaque symbole du code au nom du symbole binaire. Une fonction appelée my_function
créera un symbole dans le binaire appelé my_function
. D'autre part, et en raison de fonctionnalités telles que la surcharge de fonctions, les noms des fonctions C++ doivent être mutilés (traduits en différents symboles de fonction dans le binaire, codant les types des arguments et les types de retour), et la norme ne définit pas la façon dont la mutilation est effectuée. Cela signifie à son tour que la même fonction en C++ peut être compilée en différents symboles selon le compilateur (à moins que extern "C"
est utilisé pour forcer l'interopérabilité C pour ces fonctions en C++).
À la fin de la journée, l'interface entre le langage de script et le code natif devrait de toute façon être une interface C, même si les détails de la façon dont il est implémenté en interne pourraient être C/C++/tout autre langage natif.
(Je ne veux pas intentionnellement entrer dans une guerre des flammes des préférences linguistiques, C++ est vraiment puissant, mais c'est aussi un peu effrayant car c'est un langage beaucoup plus complexe que C, et certaines choses qui regardez = simple pourrait avoir un impact sur les performances)
Les langues ne sont pas intrinsèquement plus rapides ou plus lentes, les interprètes et les compilateurs peuvent être plus ou moins efficaces.
Outre cela, les langages de niveau supérieur fournissent des couches d'abstraction qui ont généralement un coût d'exécution. Si vous ne les utilisez pas, le compilateur pourrait être assez intelligent pour les supprimer, mais cela pourrait ne pas être possible si la sémantique du langage ne permet pas de le faire en toute sécurité ... Et si vous en avez besoin, implémentez-les vous-même dans une langue de niveau inférieur sera probablement plus lente que d'utiliser la langue "lente".
Comme Bjarne l'a mentionné dans [D&E], l'efficacité est l'un des principaux objectifs du C++. Ainsi, C++ est plus lent que lorsque le programmeur utilise ses fonctions "supplémentaires" comme les fonctions virtuelles que vous avez mentionnées, les informations rtt, etc.
Je pense donc que c'est plus pour des raisons psychologiques - C est utilisé car il ne permet pas les fonctionnalités C++ "lentes".