Na stronie Wikipedii dla systemu Windows napisano, że system Windows został napisany w asemblerze dla programu ładującego i przełącznika zadań oraz w C i C ++ dla procedur jądra.
IIRC, możesz wywoływać funkcje C ++ z extern "C"
bloku d. Mogę używać C do funkcji jądra, więc aplikacje w czystym C mogą z nich korzystać (jak printf
i takie), ale jeśli można je po prostu owinąć w extern "C "
blok, to po co kodować w C?
c++
c
language-choice
kernel
Cole Johnson
źródło
źródło
this
zmiennejOdpowiedzi:
To głównie z powodów historycznych. Niektóre części jądra systemu Windows zostały pierwotnie napisane w języku C, ponieważ w 1983 r., Ponad trzy dekady temu, kiedy uruchomiono system Windows 1.0 , C ++ zostało ledwie wydane. Teraz te biblioteki C pozostaną tam „na zawsze”, ponieważ Microsoft uczynił kompatybilność wsteczną punktem sprzedaży, a przepisanie wersji części C kompatybilnych z błędami w C ++ wymaga ogromnego wysiłku, bez żadnej skutecznej korzyści.
źródło
Jak większość ludzi zauważyła, przyczyny są zdecydowanie historyczne, ale jest coś jeszcze, o czym nikt nie wspomina i uważam, że to jest powód, dla którego ludzie nadal piszą kod C dla niskiego poziomu.
C jest małym językiem w tym sensie, że specyfikacja jest (względnie) krótka. C ++ jest ogromny i to mało powiedziane. Może to nie mieć większego znaczenia dla programisty (choć myślę, że tak), ale jest niezwykle ważne, jeśli chcesz przeprowadzić formalną weryfikację . Ponadto istnieją ustalone narzędzia do analizy kodu C, które mogą pomóc w zapobieganiu błędom itp.
Jest to bardzo ważne w oprogramowaniu wbudowanym, w którym koszt zgłoszonego błędu jest niezwykle wysoki w porównaniu z resztą branży (porównaj sieć Web, w której możesz natychmiast zastosować łatę dla wszystkich użytkowników). Nie wspominając o kluczowym oprogramowaniu i sprzęcie medycznym.
Podjęto próby wyparcia C z jego dominującego miejsca w programowaniu niskiego poziomu z językami, które są w tym nawet lepsze, jak BitC, ale jak dotąd nie odniosły sukcesu.
źródło
źródło
Przyczyny nie są techniczne. Trochę montażu jest nieuniknione, ale nie są zmuszeni do korzystania z okazjonalnego C, chcą . Moja firma używa własnego zastrzeżonego jądra, napisanego prawie całkowicie w C ++, ale nie musimy obsługiwać interfejsu C do jądra, jak większość innych, ponieważ nasze osadzone jądro jest monolitycznie kompilowane z naszymi aplikacjami C ++. Kiedy masz interfejs C, często łatwiej jest napisać kod interfejsu w C, nawet jeśli można go użyć
extern "C"
w C ++.Nawet my mamy wiele plików C, głównie z powodu kodu innej firmy. Kod niskiego poziomu innej firmy jest prawie zawsze dostarczany w języku C, ponieważ o wiele łatwiej jest włączyć kod C do aplikacji C ++ niż na odwrót.
źródło
Programiści jądra są często ludźmi, którzy czują się szczęśliwsi, kiedy od razu widać ze źródła, co faktycznie robi kod.
C ++ ma wiele innych funkcji, które ukrywają to, co kod robi więcej niż zwykły kod C: ukrywa to: przeciążenia, metody wirtualne, szablony, referencje, rzuty ... C ++ ma także znacznie więcej składni, którą musisz opanować, aby nawet zrozumieć C ++ kod używający go.
Myślę, że moc C ++ to bardzo potężne narzędzia do tworzenia bibliotek i frameworków, które sprawiają, że tworzenie aplikacji jest bardzo proste. Bardzo często twórca aplikacji C ++ byłby całkowicie zagubiony we wnętrzach biblioteki wypełnionych szablonami, nawet jeśli byłby bardzo kompetentny w tworzeniu aplikacji przy użyciu tej biblioteki. A napisanie odpowiedniej biblioteki C ++ jest bardzo trudnym zadaniem programistycznym i zostało wykonane tylko w celu zapewnienia świetnych ram dla korzyści twórcy aplikacji. Biblioteki C ++ nie są wewnętrznie proste, są (lub mogą być ...) po prostu potężne, ale proste z punktu widzenia programistów aplikacji.
Ale API jądra nie może być API C ++, musi to być API niezależne od języka, więc większość dobrych rzeczy w C ++ nie będzie bezpośrednio wykorzystywana w tym interfejsie. Co więcej, jądro nie jest tak naprawdę podzielone na części „biblioteczne” i „aplikacyjne” opracowane niezależnie, z większym wysiłkiem logicznie przechodząc do jednej biblioteki, aby ułatwić tworzenie masy aplikacji.
Ponadto bezpieczeństwo i stabilność są bardziej krytyczne w jądrze, a metody wirtualne są znacznie bardziej dynamiczne, a zatem trudniejsze do wyodrębnienia i weryfikacji, niż zwykłe wywołania zwrotne lub inne mechanizmy podobne do C.
Krótko mówiąc, chociaż można oczywiście napisać dowolny program C, w tym jądro jako C ++, większość mocy C ++ nie jest dobrze używana w jądrze. I wielu twierdzi, że narzędzia programistyczne powinny powstrzymywać cię od robienia rzeczy, których nie powinieneś robić. C ++ nie.
źródło
Bjarne Stroustrup w wywiadzie z lipca 1999 r . :
źródło
C jest z założenia językiem bardzo niskiego poziomu. To tylko jeden krok od asemblera; znając chipset, na który celujesz, możesz przy odrobinie wiedzy ręcznie „skompilować” C w ASM. Ten rodzaj „zbliżonego do metalu” języka jest kluczem do wysokiego poziomu optymalizacji (wydajności, wydajności pamięci itp.). Ponieważ jednak jest tak blisko metalu, nie dostajesz za darmo tego języka; jest to język proceduralny, nie zorientowany obiektowo, dlatego też praca z takimi konstrukcjami wymaga dużej ilości kodu typu „plateplate” do tworzenia i konsumowania konstrukcji o wielu wartościach w pamięci.
C ++ to „C jeden lepszy”, dodając szereg łatwości użytkowania, takich jak dynamiczny przydział pamięci, wbudowane zestawianie struktur, duża biblioteka predefiniowanego kodu itp., Kosztem pewnych strat wydajności (wciąż znacznie lepszych niż środowiska zarządzanego środowiska wykonawczego). Dla przeciętnego programisty zalety znacznie przewyższają wady w obszarach bazy kodowej, które nie wymagają antywstrzymywalnej kontroli alokacji pamięci itp.
Połączenie tych dwóch jest dość tradycyjne; używasz C do pisania najbardziej krytycznych pod względem wydajności, wydajnych pod względem pamięci obszarów bazy kodu, z którymi możesz następnie pracować w bardziej abstrakcyjny sposób za pomocą wywołań metod z kodu C ++, które mogą być bardziej elegancko zorganizowane i zaprojektowane niż uber-performant , zoptymalizowany uber-oogly kod C.
źródło
iostream
. „Zbyt wolny” nigdy nie jest dobrym pretekstem do używania C zamiast C ++.Może się zdarzyć, że w C spędzasz większość czasu na myśleniu o problemie i sposobie kodowania rozwiązania. W C ++ kończy się myślenie o C ++ i jego niezliczonych cechach, funkcjach i niejasnej składni.
Również w wielu sklepach C ++ twój kod jest monitorowany przez „policję mody”, która jest zafascynowana najnowszym zestawem wzorców projektowych lub najnowszymi niezrozumiałymi wypowiedziami wielkiego boga Stroustrupa. Ładny kod staje się bardziej ceniony niż działający kod, znalezienie sposobu wykorzystania najnowszego zestawu szablonów Boost jest bardziej podziwiane niż znalezienie działającego rozwiązania dla firmy.
Z mojego doświadczenia wynika, że dla wszystkich sprytnych funkcji i czystości OO w C ++, kodowanie w zwykłym C przyspiesza i efektywniej wykonuje zadanie.
źródło
Możliwe jest, że części C nie są ładnie przenośne dla kompilatora C ++ używanego dla części C ++. Być może kod C jest niezręczny w kompilatorze C w sposób, który nie działa z kompilatorem C ++.
Jeśli masz wysokiej jakości kompilator C ++, prawie nie ma powodu mieszać C i C ++ w projekcie. Prawie.
Jednym z powodów byłoby to, że twój projekt współdzieli kod C z innymi projektami, kod nie kompiluje się jako C ++ i nie chcesz utrzymywać rozwidlenia C ++ tego kodu.
źródło
Myślę, że masz to wstecz -
extern "C"
blok zapewnia, że konwencje wywoływania C są używane dla wszystkich funkcji w bloku. Możesz więc wywoływać funkcje czystego C z C ++, a nie C ++ z C. Bez względu na to, wyobrażam sobie, że ludzie używają zarówno C, jak i C ++, ponieważ wiele bibliotek niskiego poziomu jest napisanych przy użyciu C i łatwiej jest użyć czegoś, co już istnieje (i prawdopodobnie jest debugowany i zoptymalizowany) niż pisanie własnego. OTOH, C ++ oferuje wiele fajnych funkcji wysokiego poziomu, z którymi ludzie wolą pracować, więc używają ich do reszty.źródło
Istnieje wiele poziomów wbudowanych platform używających C jako języka programowania (oczywiście możesz swobodnie korzystać z języka asemblera w dowolnym momencie)
W przypadku „poziomu” mówię o poziomie zasobów wewnętrznej pamięci SRAM i pamięci ROM dla systemu.
Platformy te czasami są ograniczone zasobami (np. Niektóre platformy 8051 mają tylko 128 bajtów SRAM użytkownika).
Wspieranie dynamicznej alokacji pamięci przy tak małej ilości pamięci RAM jest bez znaczenia. (nowe / usuń), a nawet Malloc w C.
Jednym z głównych ulepszeń od C do C ++ jest paradygmat obiektowy. C ++ jest odpowiedni w oprogramowaniu o większej pojemności pamięci
ale nie we wbudowanym oprogramowaniu, które ma ograniczenie rozmiaru do 32 KB. (np. w 16-bitowej formie MCU)
Nie ma potrzeby posiadania kompilatora C ++, który jest na ogół bardziej skomplikowany niż kompilator C. (przynajmniej dostawcy SDK nie będą się tym zajmować).
W rzeczywistości nie mogę znaleźć kompilatora C ++ na 32-bitowej platformie ARM7.
To po prostu nie jest warte złożoności
W niektórych 8051 (8 bitów): 1 MB ROM, 128B RAM
TI MSP430 (16 bitów): 32 KB ROM, 4KB RAM
ST Microelectronics ARM 32-bitowy rdzeń procesora Cortex ™ -M3 (STM32F103T4): 16 lub 32 KB pamięci Flash 6 lub 10 KB pamięci SRAM
źródło
Widzę kilka możliwych powodów:
Edytowane: Jak się okazuje, trzeci argument nie jest prawdziwy (patrz komentarze).
źródło
extern "C"
).Ponieważ C jest prawdopodobnie lepszym językiem niż C ++. A ponieważ część kodu została napisana zanim C ++ stał się popularny i ludzie nie mieli powodu, aby go zastąpić.
A ponieważ C ++ ma wiele funkcji, które mogą uszkodzić Twój kod, jeśli nie będziesz ostrożny podczas używania go w jądrze.
źródło
[stuff] that C++ expects
. Dlaczego C ++ używa więcej sterty niż C? Dlaczego C ++ wymaga więcej bibliotek DLL niż C? Po prostu NIE PRAWDA