Auf der Wikipedia-Seite für Windows heißt es, dass Windows für den Bootloader und den Task-Switcher in Assembly und für Kernel-Routinen in C und C ++ geschrieben ist.
IIRC können Sie C ++ - Funktionen aus einem extern "C"
'd-Block aufrufen . Ich kann C für die Kernelfunktionen verwenden, damit reine C-Apps sie (wie printf
und so) verwenden können. Wenn sie jedoch nur in einen extern "C "
Block eingeschlossen werden können, warum dann Code in C?
c++
c
language-choice
kernel
Cole Johnson
quelle
quelle
this
VariablenAntworten:
Es ist vor allem aus historischen Gründen. Einige Teile des Windows-Kernels wurden ursprünglich in C geschrieben, da C ++ vor über drei Jahrzehnten, als Windows 1.0 veröffentlicht wurde , kaum veröffentlicht wurde. Jetzt werden diese C-Bibliotheken "für immer" dort bleiben, weil Microsoft die Abwärtskompatibilität zu einem Verkaufsargument gemacht hat und das Umschreiben einer bug-kompatiblen Version der C-Teile in C ++ eine Menge Aufwand erfordert, ohne dass ein effektiver Nutzen entsteht.
quelle
Wie die meisten Leute betont haben, sind Gründe bei weitem historisch, aber es gibt noch etwas, das niemand erwähnt, und ich glaube, es ist der Grund, warum die Leute immer noch C-Code für Low-Level schreiben.
C ist eine kleine Sprache in dem Sinne, dass die Spezifikation (relativ) kurz ist. C ++ ist riesig und das ist eine Untertreibung. Dies mag für den Programmierer nicht so wichtig sein (obwohl ich denke, dass dies der Fall ist), aber es ist äußerst wichtig, wenn Sie eine formale Überprüfung durchführen möchten . Darüber hinaus gibt es etablierte Tools für die C-Code-Analyse, die helfen können, Fehler zu vermeiden.
Und dies ist sehr wichtig bei eingebetteter Software, bei der die Kosten eines bereitgestellten Fehlers im Vergleich zum Rest der Branche extrem hoch sind (vergleiche das Web, bei dem Sie einen Patch sofort auf alle Benutzer anwenden können). Ganz zu schweigen von unternehmenskritischer Software und medizinischen Dingen.
Es gab Versuche, C von seiner dominierenden Position in der Low-Level-Programmierung durch Sprachen zu verdrängen, die diesbezüglich noch besser sind, wie BitC, aber bisher waren sie nicht erfolgreich.
quelle
quelle
Die Gründe sind nicht technisch. Ein wenig Montage ist unvermeidlich, aber sie sind nicht gezwungen , die gelegentliche C zu verwenden, sie wollen zu. Mein Unternehmen verwendet einen eigenen proprietären Kernel, der fast ausschließlich in C ++ geschrieben ist, aber wir müssen keine C-Schnittstelle zum Kernel wie die meisten anderen unterstützen, da unser eingebetteter Kernel mit unseren C ++ - Anwendungen monolithisch kompiliert wird. Wenn Sie eine C-Schnittstelle haben, ist es oft einfacher, den Schnittstellencode in C zu schreiben, obwohl dies möglich ist zu verwenden
extern "C"
es in C ++ zu schreiben.Sogar wir haben ein bisschen C-Dateien, hauptsächlich aufgrund von Code von Drittanbietern. Low-Level-Code von Drittanbietern wird fast immer in C bereitgestellt, da es viel einfacher ist, C-Code in eine C ++ - App zu integrieren, als umgekehrt.
quelle
Kernel-Entwickler sind oft die Art von Leuten, die sich glücklicher fühlen, wenn aus der Quelle sofort ersichtlich ist, was der Code tatsächlich tut.
C ++ hat viel mehr Funktionen, die verbergen, was der Code bewirkt, als dass er durch einfachen C-Code verdeckt wird: Überladungen, virtuelle Methoden, Vorlagen, Verweise, Throws ... C ++ hat auch wesentlich mehr Syntax, die Sie beherrschen müssen, um das C ++ überhaupt zu verstehen Code mit ihm.
Ich denke, Power of C ++ ist ein sehr mächtiges Werkzeug, um Bibliotheken und Frameworks zu erstellen, die dann die Anwendungsentwicklung zum Kinderspiel machen. Sehr oft ist der C ++ - Anwendungsentwickler in den mit Vorlagen gefüllten Innereien einer Bibliothek völlig verloren, selbst wenn er sehr kompetent darin ist, Anwendungen mit dieser Bibliothek zu erstellen. Das Schreiben einer C ++ - Bibliothek ist eine sehr herausfordernde Programmieraufgabe, die nur durchgeführt wird, um ein hervorragendes Framework zum Nutzen der Anwendungsentwickler bereitzustellen. C ++ - Bibliotheken sind intern nicht einfach, sie sind (oder können es sein ...) aus Sicht der Anwendungsprogrammierer nur leistungsstark und dennoch einfach.
Die Kernel-API kann jedoch keine C ++ - API sein, sondern muss eine sprachunabhängige API sein, sodass die meisten nützlichen Dinge in C ++ an dieser Schnittstelle nicht direkt verwendet werden können. Darüber hinaus ist der Kernel nicht wirklich in "Bibliotheks" - und "Anwendungs" -Teile unterteilt, die unabhängig voneinander entwickelt wurden, wobei logischerweise mehr Aufwand für eine Bibliothek erforderlich ist, um die Erstellung einer Vielzahl von Anwendungen zu vereinfachen.
Außerdem sind Sicherheit und Stabilität in einem Kernel wichtiger, und virtuelle Methoden sind viel dynamischer und daher viel schwieriger zu isolieren und zu überprüfen als einfache Rückrufe oder andere C-ähnliche Mechanismen.
Kurz gesagt, obwohl Sie natürlich jedes C-Programm einschließlich eines Kernels als C ++ schreiben können, wird der größte Teil der Leistungsfähigkeit von C ++ im Kernel nicht gut genutzt. Und viele würden argumentieren, dass Programmiertools Sie daran hindern sollten, Dinge zu tun, die Sie nicht tun sollten. C ++ würde das nicht.
quelle
Bjarne Stroustrup in einem Interview im Juli 1999 :
quelle
C ist eine sehr einfache Sprache. Es ist einen Schritt vom Assembler entfernt. Wenn Sie den Chipsatz kennen, auf den Sie abzielen, können Sie C mit ein wenig Wissen manuell in ASM "kompilieren". Diese Art von "Metall-nahe" Sprache ist der Schlüssel für ein hohes Maß an Optimierung (für Leistung, Speichereffizienz usw.). Da es jedoch so nah am Metal ist, bekommt man mit dieser Sprache nicht viel umsonst. Es ist eine prozedurale, nicht objektorientierte Sprache, und daher erfordert die Arbeit mit solchen Konstrukten eine Menge Code, um mehrwertige Konstrukte im Speicher zu erstellen und zu konsumieren.
C ++ ist "C one better" und fügt eine Reihe benutzerfreundlicher Funktionen wie dynamische Speicherzuweisung, integriertes Struktur-Marshalling, eine große Bibliothek mit vordefiniertem Code usw. auf Kosten einiger hinzu Effizienzverluste (noch viel besser) als verwaltete Laufzeitumgebungen). Für den durchschnittlichen Codierer überwiegen die Vorteile bei weitem die Nachteile in Bereichen der Codebasis, in denen keine anal-remanente Steuerung der Speicherzuweisung usw. erforderlich ist.
Die Kombination der beiden ist eine ziemlich traditionelle; Mit C schreiben Sie die leistungskritischsten, speichereffizientesten Bereiche der Codebasis, mit denen Sie über Methodenaufrufe aus C ++ - Code, der eleganter organisiert und entworfen werden kann als der überaus leistungsfähige Code, abstrakter arbeiten können Sehr optimierter C-Code.
quelle
iostream
. "Zu langsam" ist niemals eine gute Ausrede, um C über C ++ zu verwenden.Es kann sein, dass Sie mit C den größten Teil Ihrer Zeit verbringen, um über das vorliegende Problem nachzudenken und die Lösung zu codieren. In C ++ müssen Sie sich am Ende mit C ++ und seinen unzähligen Features, Funktionen und der obskuren Syntax auseinandersetzen.
Auch in vielen C ++ - Shops wird Ihr Code von der "Modepolizei" überwacht, die von den neuesten Designmustern oder den neuesten unverständlichen Aussagen des großen Gottes Stroustrup fasziniert ist. Hübscher Code hat einen höheren Stellenwert als Arbeitscode. Die Verwendung des neuesten Satzes von Boost-Vorlagen wird mehr bewundert als die Suche nach einer funktionierenden Lösung für das Unternehmen.
Ich habe die Erfahrung gemacht, dass bei all den cleveren Funktionen und der OO-Reinheit von C ++ das Codieren in einfachem C die Aufgabe schneller und effektiver erledigt.
quelle
Es ist möglich, dass die C-Teile nicht gut auf den C ++ - Compiler portierbar sind, der für die C ++ - Teile verwendet wird. Möglicherweise ist der C-Code mit dem C-Compiler in einer Weise befreundet, die mit dem C ++ - Compiler nicht kompatibel ist.
Wenn Sie einen hochwertigen C ++ - Compiler haben, gibt es fast keinen Grund, C und C ++ in einem Projekt zu mischen. Fast.
Der eine Grund wäre, dass Ihr Projekt C-Code mit anderen Projekten teilt, der Code nicht als C ++ kompiliert wird und Sie keine C ++ - Verzweigung dieses Codes verwalten möchten.
quelle
Ich denke, Sie haben es rückwärts - der
extern "C"
Block stellt sicher, dass die C-Aufrufkonventionen für alle Funktionen innerhalb des Blocks verwendet werden. Sie können also reine C-Funktionen aus C ++ aufrufen, nicht C ++ - Funktionen aus C. Ungeachtet dessen stelle ich mir vor, dass der Grund, warum sowohl C als auch C ++ verwendet werden, darin besteht, dass viele Bibliotheken auf niedriger Ebene mit C geschrieben werden und es einfacher ist, etwas zu verwenden, das existiert bereits (und ist vermutlich debuggt und optimiert) als das Schreiben Ihrer eigenen. OTOH, C ++ bietet viele nette Funktionen auf hohem Niveau, mit denen die Leute lieber arbeiten würden, sodass sie diese für den Rest verwenden.quelle
Es gibt verschiedene Ebenen eingebetteter Plattformen, auf denen C als Programmiersprache verwendet wird (natürlich können Sie die Assemblersprache jederzeit verwenden).
Für 'Level' spreche ich von der internen SRAM- und ROM-Ressourcenebene für ein System.
Diese Plattformen sind manchmal ressourcenbeschränkt (z. B. haben einige 8051-Plattformen nur 128 Byte User-SRAM).
Es ist sinnlos, eine dynamische Speicherzuweisung mit einer so geringen Menge an RAM zu unterstützen. (neu / löschen) oder auch Malloc in C.
Eine der wichtigsten Verbesserungen von C auf C ++ ist das objektorientierte Paradigma. C ++ eignet sich für Software mit größerem Speicherbedarf
Dies gilt jedoch nicht für eingebettete Firmware mit einer Größenbeschränkung von bis zu 32 KB. (zB in einer 16-Bit-MCU-Plattform)
Es ist kein C ++ - Compiler erforderlich, der im Allgemeinen komplizierter ist als der C-Compiler. (Zumindest SDK-Anbieter werden sich nicht darum kümmern).
In der Tat kann ich kaum einen C ++ - Compiler über eine 32-Bit-ARM7-Plattform finden.
Die Komplexität ist es einfach nicht wert
In einigen 8051 (8 Bit): 1MB ROM, 128B RAM
TI MSP430 (16 Bit): 32 KB ROM, 4 KB RAM
ST Microelectronics ARM 32-Bit-Cortex ™ -M3-CPU-Kern (STM32F103T4): 16 oder 32 KByte Flash-Speicher 6 oder 10 KByte SRAM
quelle
Ich sehe ein paar mögliche Gründe:
Bearbeitet: Wie sich herausstellt, ist das dritte Argument nicht wahr (siehe Kommentare).
quelle
extern "C"
).Weil C wohl eine bessere Sprache ist als C ++. Und weil ein Teil des Codes geschrieben wurde, bevor C ++ populär wurde und die Leute keinen Grund hatten, ihn zu ersetzen.
Und weil C ++ viele Funktionen hat, die Ihren Code beschädigen können, wenn Sie bei der Verwendung in einem Kernel nicht vorsichtig sind.
quelle
[stuff] that C++ expects
. Warum verwendet C ++ mehr Heap als C? Warum benötigt C ++ mehr DLLs als C? Einfach nicht wahr