Sur la page Wikipedia pour Windows , il indique que Windows est écrit en assembleur pour le chargeur de démarrage et le sélecteur de tâches, et en C et C ++ pour les routines du noyau.
IIRC, vous pouvez appeler des fonctions C ++ à partir d'un extern "C"
bloc 'd'. Je peux utiliser C pour les fonctions du noyau afin que les applications C pures puissent les utiliser (comme printf
et telles), mais si elles peuvent simplement être enveloppées dans un extern "C "
bloc, alors pourquoi coder en C?
c++
c
language-choice
kernel
Cole Johnson
la source
la source
this
variableRéponses:
C'est principalement pour des raisons historiques. Certaines parties du noyau Windows ont été écrites à l'origine en C, car en 1983, il y a plus de trois décennies, lorsque Windows 1.0 a été déclenché , C ++ était à peine sorti. Maintenant, ces bibliothèques C y resteront "pour toujours", car Microsoft a fait de la rétrocompatibilité un argument de vente et la réécriture d'une version compatible avec les bogues des parties C en C ++ nécessite énormément d'efforts sans aucun avantage réel.
la source
Comme la plupart des gens l'ont souligné, les raisons sont de loin historiques, mais il y a autre chose que personne ne mentionne et je pense que c'est la raison pour laquelle les gens écrivent toujours du code C pour les bas niveaux.
C est un petit langage dans le sens où la spécification est (relativement) courte. C ++ est énorme et c'est un euphémisme. Cela peut ne pas être très important pour le programmeur (bien que je pense que oui), mais c'est extrêmement important si vous voulez faire une vérification formelle . De plus, il existe des outils établis pour l'analyse du code C, qui pourraient aider à prévenir les bogues, etc.
Et cela est très important dans les logiciels embarqués, où le coût d'un bogue qui est déployé est extrêmement élevé, par rapport au reste de l'industrie (comparez le Web, où vous pouvez appliquer un correctif immédiatement à tous les utilisateurs). Sans parler des logiciels critiques et des trucs médicaux.
Il y a eu des tentatives pour déplacer C de sa place dominante dans la programmation de bas niveau avec des langages encore meilleurs dans ce domaine, comme BitC, mais ils n'ont pas réussi jusqu'à présent.
la source
la source
Les raisons ne sont pas techniques. Un peu d'assemblage est inévitable, mais ils ne sont pas obligés d'utiliser le C occasionnel, ils le veulent . Mon entreprise utilise son propre noyau propriétaire, écrit presque entièrement en C ++, mais nous n'avons pas besoin de prendre en charge une interface C vers le noyau comme la plupart des autres, car notre noyau intégré est compilé de façon monolithique avec nos applications C ++. Lorsque vous avez une interface C, il est souvent plus facile d'écrire le code d'interface en C, même s'il est possible de l'utiliser
extern "C"
pour l'écrire en C ++.Même nous avons une poignée de fichiers C, principalement en raison de code tiers. Le code de bas niveau tiers est presque toujours fourni en C, car il est beaucoup plus facile d'incorporer du code C dans une application C ++ que l'inverse.
la source
Les développeurs de noyau sont souvent le genre de personnes, qui se sentent plus heureux, quand il est immédiatement évident à la source, ce que fait réellement le code.
C ++ a beaucoup plus de fonctionnalités, qui cachent ce que fait le code plus que le code C simple: les surcharges, les méthodes virtuelles, les modèles, les références, les lancers ... C ++ a également beaucoup plus de syntaxe que vous devez maîtriser pour même comprendre le C ++ code en l'utilisant.
Je pense que la puissance de C ++ est un outil très puissant pour créer des bibliothèques et des frameworks, qui font ensuite du développement d'applications un jeu d'enfant. Très souvent, le développeur d'applications C ++ serait totalement perdu dans les entrailles remplies de modèles d'une bibliothèque, même lorsqu'il est très compétent pour créer des applications à l'aide de cette bibliothèque. Et l'écriture d'un droit de bibliothèque C ++ est une tâche de programmation très difficile, et uniquement effectuée afin de fournir un cadre idéal au profit du développeur d'applications. Les bibliothèques C ++ ne sont pas simples en interne, elles sont (ou peuvent être ...) juste puissantes mais simples du point de vue des programmeurs d'applications.
Mais l'API du noyau ne peut pas être une API C ++, elle doit être une API indépendante du langage, donc la plupart des bonnes choses en C ++ ne seraient pas directement utilisables à cette interface. De plus, le noyau n'est pas vraiment divisé en parties "bibliothèque" et "application" développées indépendamment, avec plus d'efforts allant logiquement à une bibliothèque, pour faciliter la création d'une masse d'applications.
De plus, la sécurité et la stabilité sont plus critiques à l'intérieur d'un noyau, et les méthodes virtuelles sont beaucoup plus dynamiques et donc beaucoup plus difficiles à isoler et à vérifier, que les rappels simples ou d'autres mécanismes de type C.
En bref, bien que vous puissiez bien sûr écrire n'importe quel programme C, y compris un noyau en C ++, la majeure partie de la puissance de C ++ n'est pas bien utilisée dans le noyau. Et beaucoup diraient que les outils de programmation devraient vous empêcher de faire des choses que vous ne devriez pas faire. C ++ ne le ferait pas.
la source
Bjarne Stroustrup, dans une interview en juillet 1999 :
la source
C est un langage de très bas niveau, de par sa conception. C'est à deux pas de l'assembleur; connaissant le chipset que vous visez, vous pouvez, avec un peu de connaissances, «compiler» manuellement C en ASM. Ce type de langage "proche du métal" est essentiel pour de hauts niveaux d'optimisation (pour les performances, l'efficacité de la mémoire, etc.). Cependant, parce que c'est si proche du métal, vous n'obtenez pas beaucoup gratuitement avec cette langue; c'est un langage procédural, non orienté objet, et donc travailler avec de telles constructions implique beaucoup de code passe-partout pour créer et consommer des constructions à valeurs multiples en mémoire.
C ++ est "C one better", ajoutant un certain nombre de fonctionnalités faciles à utiliser telles que l'allocation dynamique de mémoire, le marshalling de structure intégré, une grande bibliothèque de code prédéfini, etc., au détriment de certaines pertes d'efficacité (encore beaucoup mieux que les environnements d'exécution gérés). Pour le codeur moyen, les avantages l'emportent largement sur les inconvénients dans les zones de la base de code qui ne nécessitent pas de contrôle anal-rétentif de l'allocation de mémoire, etc.
La combinaison des deux est assez traditionnelle; vous utilisez C pour écrire les zones de base de code les plus critiques en termes de performances et d'économie de mémoire, avec lesquelles vous pouvez ensuite travailler de manière plus abstraite via des appels de méthode à partir du code C ++, qui peuvent être organisés et conçus de manière plus élégante que l'ultra-performant. , un code C optimisé à toute épreuve.
la source
iostream
. "Trop lent" n'est jamais une bonne excuse pour utiliser C sur C ++.Il se pourrait qu'avec C vous passiez la plupart de votre temps à réfléchir au problème à résoudre et à coder la solution. En C ++, vous finissez par penser au C ++ et à sa myriade de fonctionnalités, de fonctions et d'une syntaxe obscure.
Dans de nombreux magasins C ++, votre code est également surveillé par la "police de la mode" qui est fascinée par le dernier ensemble de modèles de conception ou les dernières déclarations inintelligibles du grand dieu Stroustrup. Le joli code devient plus valorisé que le code de travail, trouver une utilisation pour le dernier ensemble de modèles Boost est plus admiré que de trouver une solution de travail pour l'entreprise.
D'après mon expérience, pour toutes les fonctionnalités intelligentes et la pureté OO de C ++, le codage en C simple permet de faire le travail plus rapidement et plus efficacement.
la source
Il est possible que les parties C ne soient pas joliment portables pour le compilateur C ++ utilisé pour les parties C ++. Peut-être que le code C est délicieux avec le compilateur C d'une manière qui rompt avec le compilateur C ++.
Si vous avez un compilateur C ++ de qualité, il n'y a presque aucune raison de mélanger C et C ++ dans un projet. Presque.
La seule raison serait que votre projet partage le code C avec d'autres projets, le code ne se compile pas en C ++ et vous ne voulez pas conserver une fourchette C ++ de ce code.
la source
Je pense que vous l'avez à l'envers - le
extern "C"
bloc garantit que les conventions d'appel C sont utilisées pour toutes les fonctions du bloc. Vous pouvez donc appeler des fonctions C pures à partir de C ++, pas des fonctions C ++ à partir de C. Quoi qu'il en soit, j'imagine que la raison pour laquelle les gens utilisent à la fois C et C ++ est parce que beaucoup de bibliothèques de bas niveau sont écrites en C, et il est plus facile d'utiliser quelque chose qui existe déjà (et est probablement débogué et optimisé) que d'écrire le vôtre. OTOH, C ++ offre de nombreuses fonctionnalités de haut niveau avec lesquelles les gens préfèrent travailler, ils les utilisent donc pour le reste.la source
Il existe différents niveaux de plates-formes intégrées utilisant C comme langage de programmation (bien sûr, c'est votre liberté d'utiliser le langage d'assemblage à tout moment)
Pour 'Level', je parle du niveau de ressources SRAM et ROM internes pour un système.
Ces plates-formes sont parfois limitées en ressources (par exemple, certaines plates-formes 8051 n'ont que 128 octets de SRAM utilisateur).
Il est inutile de prendre en charge l'allocation de mémoire dynamique avec une si petite quantité de RAM. (nouveau / supprimer) ou même malloc en C.
L'une des principales améliorations du C au C ++ est le paradigme orienté objet. C ++ est adapté aux logiciels avec une plus grande empreinte mémoire
mais pas dans le firmware embarqué qui a sa limitation de taille jusqu'à 32 Ko. (par exemple dans une plate-forme MCU 16 bits)
Il n'est pas nécessaire d'avoir un compilateur C ++ qui est généralement plus compliqué que le compilateur C. (au moins les fournisseurs de SDK ne prendront pas la peine de le faire).
En fait, je peux difficilement trouver un compilateur C ++ sur une plate-forme ARM7 32 bits.
Cela ne vaut tout simplement pas la complexité
Dans certains 8051 (8 bits): 1 Mo de ROM, 128 Go de RAM
TI MSP430 (16 bits): ROM 32 Ko, RAM 4 Ko
ST Microelectronics ARM Cortex ™ -M3 CPU Core 32 bits (STM32F103T4): 16 ou 32 Ko de mémoire Flash 6 ou 10 Ko de SRAM
la source
Je vois deux raisons possibles:
Modifié: Il s'avère que le troisième argument n'est pas vrai (voir les commentaires).
la source
extern "C"
).Parce que C est sans doute un meilleur langage que C ++. Et parce qu'une partie du code a été écrit avant que C ++ ne devienne populaire et que les gens n'aient aucune raison de le remplacer.
Et parce que C ++ possède de nombreuses fonctionnalités qui peuvent casser votre code si vous ne faites pas attention lors de son utilisation dans un noyau.
la source
[stuff] that C++ expects
. Pourquoi C ++ utilise-t-il plus de tas que C? Pourquoi C ++ nécessite-t-il plus de DLL que C? Tout simplement PAS VRAI