Czy nadal używany jest język programowania C?

96

Jestem programistą C # i większość mojego rozwoju dotyczy stron internetowych wraz z kilkoma aplikacjami Windows. Jeśli chodzi o C, nie używałem go od dawna, ponieważ nie było takiej potrzeby. Zaskoczyło mnie to, gdy jedna z moich przyjaciół powiedziała, że ​​musi nauczyć się języka C do testowania zadań, podczas gdy ja pomagałem jej w nauce języka C #.

Doszedłem do wniosku, że ktoś nauczyłby się C do testowania tylko wtedy, gdy jest rozwijany w C. Z mojej wiedzy cały rozwój związany z COM i projektowaniem sprzętu odbywa się również w C ++. Dlatego nauka języka C nie ma sensu, jeśli chcesz używać C ++. Nie wierzę też w znaczenie historyczne, więc po co marnować czas i pieniądze na naukę języka C?

Czy C jest nadal używany w jakimkolwiek nowym oprogramowaniu lub coś innego?

Monomeeth
źródło
46
Czy kiedykolwiek widziałeś kompilator C ++ dla PIC?
SK-logic
195
Czy jestem jedynym, który jest smutny, że ktoś przyrównałby naukę do marnowania czasu i pieniędzy?
Jetti
37
W mojej wiedzy, cały rozwój związane z COM i projektowania sprzętu są również wykonane w języku C ++ ” - brzmi dla mnie jak w rzeczywistości nie zrobić każdy wzór interfejsu sprzętowego.
Ed S.
32
Ludzie zapominają, że fantazyjne języki wyższego poziomu, które wszyscy kochamy, są często realizowane w C.
David Cowden
13
@ThomasEding Martwy język? Z pewnością masz bardzo ograniczoną znajomość języków programowania, jeśli uważasz C za martwy język.
JesperE

Odpowiedzi:

214

Zaletą C jest to, że jest stosunkowo małym językiem , co ułatwia implementację kompilatora C (podczas gdy kompilator C ++ jest potworem do pisania) i ułatwia naukę języka . Zobacz także indeks TIOBE , według którego C nieznacznie wyprzedza C ++.

W (IMO) malejącym porządku uzasadnienia C nadal jest często używane

  • Elementy osadzone
    O wiele łatwiej jest przenieść kompilator C na małą platformę niż kompilator C ++. Ponadto zwolennicy C twierdzą, że C ++ „robi zbyt wiele za ich plecami”. Jednak IMO to FUD.

  • Programowanie systemów
    Znowu wynika to z twierdzeń, że łatwiej jest „wiedzieć, co robi kompilator”. Jednak wiele programów osadzonych skorzystałoby np. Z szablonów i innych kluczowych funkcji C ++.

  • Oprogramowanie typu open source
    Jest to jednak głównie problem związany z postawą: OSS zawsze wolał C niż C ++ (podczas gdy w dużej części branży jest odwrotnie). Irracjonalna nienawiść Torvaldsa może być najważniejszym powodem tego w Linuksie .

sbi
źródło
16
To więcej historii niż nastawienia. Wiele z tego, co można by uznać za „podstawowe” pakiety open source, zostało pierwotnie opracowane, gdy C ++ nie było tak szeroko dostępne, jak jest teraz, a zasoby były wciąż ograniczone.
Blrfl,
65
Indeks TIOBE to żart. Wyszukiwania w wyszukiwarkach są bez znaczenia.
DeadMG
29
@Sedate: To, że szablony generalnie powodują wzdęcia kodu, jest mitem pochodzącym z czasów starożytnych kompilatorów C ++. Nowoczesne kompilatory składają identyczne instancje szablonów. OTOH, szablony pozwalają na metaprogramowanie szablonów, które wykonują kod w czasie kompilacji, a nie w czasie wykonywania, co powoduje wygenerowanie mniejszego kodu. Ponadto zapewniają znacznie bezpieczniejsze programy (mniej rzutowania), co często jest bardzo ważne w domenie osadzonej. EC ++ został sprowadzony na śmierć przez ekspertów C ++ z powodu (między innymi) samej głupoty rzucania szablonów.
sbi
18
@James: Masz na myśli takie rzeczy jak wydajne abstrakty, ogólne programowanie i bezpieczeństwo typu? Tak, kto by tego chciał.
Xeo,
11
@JesperE Tak się składa, że ​​zmieniłem zadania, odkąd to napisałem, i teraz programuję dla urządzeń osadzonych. Korzystamy z C ++ i niezwykłe jest to, co mogą zrobić dla Ciebie meta-programowanie STL i szablony, gdy masz słabe ograniczenia sprzętowe i trudne w czasie rzeczywistym, a także konieczność niezawodności. (Robimy elektrownie.) Tak, musisz wiedzieć, czy powinieneś użyć a std::vectorlub jakiegoś std::mapfragmentu kodu - ale nie musisz go wdrażać samodzielnie, ale możesz polegać na dobrze przetestowanych, wysoce wydajnych, oraz niezawodne implementacje bibliotek oferujące duże abstrakcje.
sbi
119

C jest często używany we wbudowanym programowaniu sprzętowym, w którym zasoby są ograniczone.

Jądro Linux jest napisane w C, ponieważ według Linusa Torvaldsa C ++ jest okropnym językiem .

Joonas Pulakka
źródło
14
Myślę, że duża część jądra systemu Windows to również C. I wiele starszych systemów.
Koder
14
Aby być kompletnym, Linus próbował C ++ w jądrze. To był bardziej problem niż plus. W każdym razie rozwój jądra jest naprawdę specyficznym tematem, co nie znaczy, że C ++ jest ogólnie zły.
deadalnix
75
Według innych argumentacja Linusa jest okropna.
sbi
36
Argumenty Linusa mogą, ale nie muszą być prawidłowe, ale jądro Linuksa jest nadal napisane zwykłym C :-)
Joonas Pulakka
15
Linus to dupek.
ubiyubix,
94

Wszystkie współczesne języki, które widziałem, mogą wchodzić w interakcje z C:

  • C ++
  • Jawa
  • DO#
  • Pyton
  • Haskell
  • Cel C

Konieczność interakcji z C wynika z:

  • C z prostym ABI
  • C jest w pobliżu przez długi czas

Oznacza to, że ponieważ języki te mogą komunikować się z C, mogą:

  • wykorzystać swoje biblioteki
  • komunikują się ze sobą przez C (na przykład Clang jest napisany w C ++, ale oferuje powiązania Pythona podłączone do interfejsu C).

I założę się, że wszyscy oni polegają na C w swoich środowiskach wykonawczych (chyba że poszli na pełne zgromadzenie? Wątpliwe).

C to Lingua Franca języków programowania i jeden z najprostszych (pod względem ABI) niepowiązanych z konkretną architekturą (podobnie jak montaż), trzeba się z nim zmienić.

Matthieu M.
źródło
45

Moim zdaniem jest to bardzo krótkowzroczne pytanie podobne do „Moi przyjaciele i ja słuchamy Reggae. Czy ktoś naprawdę wciąż słucha Rapu?”.

Każdy język ma swoje zastosowanie. Różne języki zdecydowanie mają swoje nisze. Ale pytając o C! Jestem pewien, że mniej osób używa C # niż C na co dzień (z całkowicie stronniczego punktu widzenia pracy w sklepie, w którym nikt nie używa C #).

Szybkie google patrząc na względną popularność języków.
Jestem pewien, że to wszystko nie jest wiarygodne, ale możemy to wykorzystać, aby zobaczyć trendy:

http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
http://langpop.com/

Nawet patrząc na stosunek SO pytania na tagach:
https://stackoverflow.com/tags

  • C #: 209845
  • 16 innych tagów
  • C: 38790

Więc C jest 18 najpopularniejszym tematem na SO (i jest tam wiele innych języków).

Uwaga: Powyższy indeks TIOBE był stale aktualizowany przez ponad dekadę (a niektóre dane sięgają 3 dekady) ma mierzyć inżynierów pracujących w każdym języku (choć nie mam pojęcia, jak dokładny jest ten dokument). Spośród 10 najlepszych języków oprócz Java / Visual Basic odzwierciedla to, co wiedzą ludzie w moim sklepie (chociaż nasze współczynniki będą się nieco różnić, ponieważ mamy znacznie mniejszy rozmiar próby).

Loki Astari
źródło
1
Ta odpowiedź wprawia mnie w zakłopotanie ... mówisz o C #, a następnie wyświetlasz tagi SO, ale nic z tego nie ma nic wspólnego z użyciem C. Popularność (szczególnie na Langpop, gdzie używają zapytań wyszukiwarek w celu ustalenia popularności) tak naprawdę nie pokazuje współczesnego użycia języka, tylko współczesne wyszukiwania w danym języku. Musisz wziąć pod uwagę przy wyszukiwaniu, że C jest często używane na uniwersytetach dla klas niższego poziomu, aby zwiększyć liczbę zapytań, a także postów SO.
Jetti
3
@Jetti: Właśnie dlatego wyraźnie mówię: I am sure none of this is authoritative but we can use it to see trendsAle nie zgadzam się z twoim drugim stwierdzeniem; C nie jest już głównym językiem wykładanym w uczelniach wyższych (gdyby tak było, nowa seria absolwentów nie byłaby tak bezużyteczna). Ludzie zwykle uczą się obecnie języka Java / C #. Również raport Tiobe dotyczy zadań, a nie zapytań.
Martin York,
Patrząc wstecz, z mojej strony wydaje się, że wybór słów jest zły. Nie miałem na myśli niskiej liczby klas (klas początkowych), miałem na myśli klasy systemowe (architektura komputerowa), w których używane jest C.
Jetti
4
Liczba znaczników SO nie określa ogólnie popularności języka, po prostu pokazuje popularność języka wśród użytkowników SO .
Ed S.
4
@Ed S. Oczywiście. Ale pytanie nie dotyczy popularności. Chodzi o istnienie C. jako języka. Liczba znaczników SO pokazuje nam, że zdecydowanie nie jest to martwy język. Fakt, że C znajduje się w pierwszej 2 w innych witrynach, nie czyni go pierwszym / drugim najczęściej używanym językiem. Ale jego istnienie w pierwszej dziesiątce jest znaczącym wskaźnikiem, że nie jest martwy. Oczywiście nic z tego nie dowodzi tylko silnych wskaźników, że C jest nadal aktywnie używany.
Martin York,
23

Może być konieczne użycie C, gdy brakuje zasobów i nie potrzebujesz funkcji obiektowych.

Wiele obecnie używanych programów jest napisanych w C, nie wspominając już o sterownikach sprzętowych.

Według indeksu Tiobe C jest nadal najczęściej używanym językiem.


Jak sugerował tcrosley, możesz rzucić okiem na to powiązane pytanie .


Należy również sprawdzić dla niektórych powiązanych artykułów na temat różnic między C i C ++, takich jak wiki czy to na przykład.

Jose Faeti
źródło
4
ahem !! to świetny punkt. Nigdy nie myślałem, że „możliwości OOP faktycznie zwiększają obciążenie języka”. Dziękujemy za wyjaśnienie tego ważnego punktu. Teraz rozumiem, gdzie C wyprzedza innych
Pankaj Upadhyay
7
@Pankaj C ++ generalnie nie wymaga dużego nakładu czasu pracy, duża złożoność języka to zasada „nie płacenia za to, czego nie używasz” - jeśli nie używasz wyjątków, wyjątki nie zwolnij lub dodaj rozmiar kodu. Kompilator jest jednak większy i bardziej złożony
Martin Beckett
2
ponownie C w polu osadzonym, zobacz także to pytanie i odpowiedzi: programmers.stackexchange.com/questions/84514/…
tcrosley
6
W rzeczywistości nigdy nie potrzebujesz funkcji OOP, po prostu działa dobrze w niektórych scenariuszach.
Ed S.
2
@Jose Faeti: Mój szef zgodziłby się, ponieważ mój szef jest doświadczonym, racjonalnym facetem. Nie kupuje programowania religii.
Ed S.,
20

Wygląda na to, że próbujesz się przekonać, że C jest bezużyteczne i dlatego można je zignorować. Podzielmy twoje pytanie:

„Uznałem, że ktoś nauczy się języka C do testowania tylko wtedy, gdy nastąpi rozwój w C.”

Nie, istnieje wiele powodów, by uczyć się C. Nawet jeśli nie wiedziałeś, że nadal unikałbym używania takich instrukcji, zwłaszcza w połączeniu z logiką kołową. Oczywiście trzeba znać język, w którym napisany jest kod, aby móc go poprawnie przetestować / naprawić, ale zakłada to, że język jest nadal używany jako dany i jest prawdziwy dla każdego języka, a nie tylko C.

„Według mojej wiedzy cały rozwój związany z projektowaniem COM i sprzętem odbywa się również w C ++.”

To jest niepoprawne.

„Dlatego nauka języka C nie ma sensu, jeśli chcesz używać C ++. Nie wierzę też w znaczenie historyczne, więc po co marnować czas i pieniądze na naukę języka C?”

To najbardziej wątpliwa logika ze wszystkich. Po pierwsze, znaczenie historyczne jest czymś, w co powinieneś wierzyć, ponieważ gdybyś wiedział, że C jest podzbiorem C ++, a dzięki temu znajomość C może pomóc ci być lepszym programistą C ++. Oczywiście C miał również wpływ na większość języków, które pojawiły się po nim, więc korzyści na tym się nie kończą. Ponadto, ponieważ C jest tak ważne, nie można go uznać za mający jedynie znaczenie historyczne. Jest nadal szeroko stosowany, a zatem nie może być przeniesiony na takie stanowisko wtórne. Możesz argumentować, że nie jest to język, którego powinien używać każdy programista i dogłębna znajomość, i byłoby to słuszne, ale proszę, nie buduj swojego argumentu na twierdzeniu, że nie wierzysz w coś bez uprzedniego zbadania jego prawdziwych zalet.

GonzoKnight
źródło
7
C jest podzbiorem C ++. Czy to miałeś na myśli? . C nie jest podzbiorem C ++; w rzeczywistości są one zupełnie inne. Tak, C ++ jest rozszerzeniem C, lub czasem nazywanym C z klasami i OOP , ale stwierdzenie, że C jest podzbiorem, nie usprawiedliwia
Pankaj Upadhyay
7
C ++ jest głównie nadzbiorem starej wersji C, a C poszedł w nieco innym kierunku od tego czasu. Niektóre aspekty języków poszły w dużej mierze równolegle, ale inne nie (a C ++ ma wiele innych rzeczy poza tym).
Donal Fellows
Zgadzam się w głosowaniu za wyjaśnieniem tego faktu, że nie wszystkie ważne programy w C są poprawnymi programami w C ++, tzn. C ++ nie jest nadzbiorem C. Jednak jest to nadzór tego, jak C był w momencie podejmowania decyzji o jego podjęciu. nadzbiór, jak wspomniał Donal Fellows. Po prostu nie ma sensu mówić, że tak jest, kiedy to już nie jest prawdą.
Joshua Hedges
16

Oprócz systemów wbudowanych większość nowszych języków ma jakiś sposób na komunikację z C. Podczas pisania biblioteki, z której chcesz korzystać w łatwy sposób we wszystkich tych językach, C jest oczywistym wyborem. C ++, chociaż może także współpracować z niektórymi językami (takimi jak Python (tylko CPython)), C ++ nie może współpracować z większą liczbą języków ze względu na niektóre jego funkcje (zwłaszcza przekręcanie nazw, ale szablony nie pomagają w tym problemie). C ABI jest jednym z najłatwiejszych w obsłudze (wiem, że możesz pisać C ++ i używać zewnętrznego interfejsu „C” dla interfejsu. Nie obchodzi mnie to).

Ma również tę zaletę, że C i C ++ są naprawdę najlepszymi językami do programowania systemów, a czasy kompilacji C są znacznie szybsze. Czasy kompilacji w C ++ są zauważalnie najgorszym ze wszystkich używanych przeze mnie języków.

Teraz, gdy istnieją inne języki, które chcą stać się popularnym językiem systemowym (wiem o D w szczególności), zdecydowana większość oprogramowania jest napisana w C / C ++. Języki takie jak D wymagają, aby ktoś utworzył opakowanie wokół biblioteki C zamiast po prostu używać go bezpośrednio (tak jak w C ++).

jsternberg
źródło
D może wywoływać kod C bezpośrednio, podobnie jak C ++. Wszystko czego potrzebujesz, jeśli prototyp funkcji (znowu, podobnie jak C ++). Po prostu piszesz extern(C)w D, podczas gdy w C ++ piszeszextern "C"
Peter Alexander
@ Peter Alexander Jestem świadomy extern (C) w D. To właśnie miałem na myśli, kiedy powiedziałem plik otoki. Nie można bezpośrednio dołączyć nagłówka C (co można zrobić w C ++, zakładając, że nagłówek C używa zewnętrznego „C” i ma bloki #ifdef __cplusplus, co większość robi). Są jeszcze inne niezgodności pomiędzy używaniem extern (C) (szczególnie jak obsługiwane są łańcuchy. O ile mi wiadomo, nie mają one zerowego terminatora w D. Więc musisz specjalnie zmienić tablicę, przekazując ją do C).
jsternberg
11

sprawdź langpop.com , zwłaszcza wykresy z Freshmeat i Google Code. To pokazuje, że C wciąż jest daleko do przodu.

C jest nadal popularny w systemach, w których trzeba być blisko metalu (tj. System osadzony) i aplikacjach wymagających dużej wydajności.

tehnyit
źródło
4
NIE OTWIERAJ tego adresu URL! Witryna już nie istnieje, a adres URL przekierowuje do niektórych irytujących spamerskich stron.
Nikolay Suvandzhiev
11

Używam go prawie codziennie rozwijając dla iPada / iPhone'a. Wiele bibliotek jest napisanych w C i nie ma odpowiednika Objective-C. Tak, nadal jest używany i jest jednym z najnowszych urządzeń na rynku.

Dzięki C możesz zaprogramować wiele systemów wbudowanych, jest mały i poręczny i prawdopodobnie będzie dostępny przez wiele lat (czyli nie marnujesz czasu ani pieniędzy na naukę)

Valentin Radu
źródło
2
„Objective-C jest jeszcze młody” pochodzi z połowy lat osiemdziesiątych, mniej więcej tak stary jak C ++. Jednak większość osób, które go używają, nie natrafiła na to aż do 2007 roku.
To prawda, że ​​chciałem powiedzieć, że istnieje wiele bibliotek C, które nie mają odpowiednika w Objective-C na iOS. Rzeczywiście sam język wcale nie jest młody (sprawdzane na Wiki). Dzięki za zwrócenie na to uwagi.
Valentin Radu
7

Zasadniczo w przypadku systemu osadzonego C jest nadal szeroko stosowany.

To pytanie podaje inny przykład.

Indeks Tiobe , który próbuje sklasyfikować język, popularność / użytkowania , konsekwentnie stawia C w ciągu pierwszych miejscach.

Xavier T.
źródło
2. miejsce (po Javie).
Martin York,
7
Ciekawe, że zarówno C ++, jak i Java wydają się wykazywać tendencję spadkową w ciągu ostatnich 10 lat, podczas gdy C pozostaje mniej więcej statyczny.
Paul R
7

Ruchliwość.

Zrób listę każdego systemu, który Twoim zdaniem będzie uruchamiał kod C, a następnie podobną listę dla każdego innego języka, który lubisz.

Jeśli wymyśliłeś taką samą odpowiedź jak ja, wtedy wniosek jest twierdzący.

Tidbeck
źródło
5

Myślę, że C jest najpotężniejszym językiem Z następujących powodów!

1) AT najpierw C, jest to język systemowy (co oznacza, że ​​można go używać do programowania niskopoziomowego z minimalnym czasem uruchamiania lub bez niego).

2) Szybkość wynikowej aplikacji. Kod źródłowy C można zoptymalizować znacznie bardziej niż języki wyższego poziomu, ponieważ zestaw języków jest stosunkowo mały i bardzo wydajny. Jest prawie tak blisko, jak to możliwe, aby przejść do programowania w języku asemblera, bez programowania w języku asemblera. i możesz nawet używać montażu i C razem!

3) C ma swoją aplikację w programowaniu oprogramowania układowego (sprzęt). Wynika to z jego zdolności do używania / pracy z montażem i bezpośredniej komunikacji ze sterownikami, procesorami i innymi urządzeniami.

4) C jest elementem składowym wielu innych obecnie znanych języków. Spójrz na historię C, a przekonasz się, że istnieje ona już od jakiegoś czasu (w miarę, jak zmieniają się języki programowania). Spójrz na Python, na przykład w pełni zorientowany obiektowo język programowania wysokiego poziomu. Jest napisany w C (być może również w C ++). To mówi ci, jeśli kiedykolwiek chcesz wiedzieć, co dzieje się pod maską w innych językach; zrozumienie C i jak to działa, jest niezbędne.

Język aplikacji jest używany do programowania na wysokim poziomie, np. Pisania edytora tekstu lub gry. Przykładami języków aplikacji są Java, C #. Powodem jest to, że zawierają one funkcje usuwania śmieci, automatyczne pisanie, sprawdzanie poprawności w czasie wykonywania itp. - tam, gdzie koncentruje się na wydajności.

Język programowania jest używany do programowania niskiego poziomu. np. mikrokontroler, sterownik i jądro systemu operacyjnego. Przykłady obejmują asemblację, C. Wymagają niewielkiego czasu działania lub nie wymagają uruchomienia kodu bezpośrednio na sprzęcie, a programista ma bezpośrednią kontrolę nad sprzętem.

Ogólnie spada jako język aplikacji, ale nadal jest silny jako język systemowy.

niko
źródło
1

Och tak, jest używane. Pracuję w dziedzinie przetwarzania pakietów sieciowych. Byłem w dwóch różnych firmach, w których przetwarzamy pakiety sieciowe. Tak więc działamy na poziomie Ethernet lub IP, a nie na poziomie powyżej TCP.

Co ciekawe, w obu firmach C wybrano zamiast C ++. W jednej z firm jeden z dwóch produktów został zbudowany na jądrze Linuksa, podczas gdy drugi produkt został zbudowany w przestrzeni użytkownika Linuksa. Produkt jądra oczywiście używał C, ponieważ jądro Linuksa jest programowane w C, ale zdecydowali się używać C również dla produktu przestrzeni użytkownika. Oba produkty zostały opracowane od około 2000 roku (produkt jądra nieco przed 2000 rokiem, a produkt przestrzeni użytkownika nieco po 2000 roku).

W firmie, do której poszedłem później, produkt został zbudowany na C, a nie na C ++. W rzeczywistości jest to kontynuacja projektu z połowy lat 90., chociaż ze względu na ostatnie wymagania dotyczące poprawy wydajności zdecydowano, że zasadniczo wszystko zostanie przepisane. Mieliśmy opcję wybrania C ++ z powodu tego przepisania, ale nie zrobiliśmy tego.

W dziedzinie przetwarzania pakietów sieciowych wiele się liczy. Chcę więc wdrożyć własną tabelę skrótów o wyższej wydajności niż istniejące tabele skrótów. Ja, a nie autor tabeli skrótów, wybieram, która funkcja skrótu ma być używana. Może chcę wydajności i wybiorę MurMurHash3 . Być może chcę bezpieczeństwa i idę po SipHash . Alokatory pamięci są oczywiście niestandardowe. W rzeczywistości wszystkie ważne struktury danych, których używamy, zostały zaimplementowane na zamówienie w celu uzyskania najwyższej możliwej wydajności.

Chociaż nic nie stoi na przeszkodzie, aby użyć C ++, jest to zwykle zły pomysł. Pojedynczy zgłoszony wyjątek na pakiet spowoduje spadek szybkości przetwarzania pakietów do niedopuszczalnego poziomu! Dlatego nie możemy używać wyjątków C ++. O wiele za wolno. Już używamy rodzaju zorientowanego obiektowo kodu C, implementując struktury danych jako struktury, a następnie implementując funkcje działające na tych strukturach. C ++ zezwalałby na posiadanie funkcji wirtualnych, ale ponownie wywołania funkcji wirtualnych zabiłyby wydajność, gdyby były używane wszędzie. Dlatego lepiej jest być jawnym i mieć wskaźnik funkcji, jeśli potrzebne są wirtualne wywołania funkcji.

C ++ zrobi wiele rzeczy za twoimi plecami: alokacja pamięci itp. Z drugiej strony, w C zwykle tak się nie dzieje. Możesz napisać funkcję, która alokuje pamięć, ale zwykle z interfejsu funkcji wynika, że ​​alokacja ma miejsce.

Jako przykład rodzaju mikrooptymalizacji, które można wykonać podczas programowania w C, spójrz na makro kontener_of w jądrze Linuksa. Jasne, możesz użyć kontener_of w kodzie C ++, ale kto to robi? To znaczy, jest to całkowicie akceptowalne w większości programów w C, ale typowi programiści C ++ natychmiast zaproponują coś innego, na przykład połączoną listę, która alokuje węzły łącza jako osobne bloki. Nie chcemy tego, ponieważ każdy przydzielony blok pamięci ma negatywny wpływ na wydajność.

Być może jedyną rzeczą, która przyniosłaby nam korzyść w C ++, jest to, że C ++ pozwala na metaprogramowanie szablonu, co oznacza, że ​​czasami można uniknąć wirtualnych wywołań funkcji, wciąż mając parametr funkcji, i pozwolić kompilatorowi wstawić funkcje. Metaprogramowanie szablonów jest jednak skomplikowane i udało nam się spełnić wszystkie wymagania w C, więc korzyści płynące z tej funkcji w C ++ nie są tak ważne.

W jednej z firm rzeczywiście mieliśmy niestandardowy język kompilacji, w którym zaimplementowano część funkcji. Zgadnij, który był językiem docelowym kompilatora? Montaż? Nie, musieliśmy obsługiwać zarówno architekturę 32-bitową, jak i 64-bitową. C ++? Na pewno żartujesz. Oczywiście było to C z obliczonym goto GCC . Tak więc niestandardowy język został skompilowany do C (lub w rzeczywistości wariant C gcc, który obsługiwał obliczone goto), a kompilator C wyprodukował zestaw.

juhist
źródło
0

Nadal używam C na co dzień, a jednym z głównych powodów jest interakcja z innymi językami i pakiet SDK przeznaczony do użycia we wtyczkach zbudowanych przez różnego rodzaju kompilatory w różnych językach.

Nie mogę napisać interfejsu API C ++, który wykorzystuje klasy z konstruktorami i destruktorami i tabelami vt, przeładowaniem funkcji, zgłasza wyjątki itp., Których można używać z Lua, C #, Python, C itd., Nie mówiąc już o wtyczce C ++ napisanej przy użyciu różnych kompilatorów i ustawienia własne.

Nie mogę napisać C # SDK, który można wywołać z Python, np. Ani Python SDK, który można wywołać z C #.

C jest tutaj jedynym językiem, który pozwala mi utworzyć interfejs API, który można wywoływać z dowolnego z tych języków. To powiedziawszy, często używam C ++ do implementacji tych interfejsów C (chociaż czasami po prostu implementuję je w C).

Poza tym czasami uważam C za najłatwiejszy język do pracy w takich rzeczach, jak struktury danych niskiego poziomu i alokatory pamięci. Całe dodatkowe bezpieczeństwo typu, które zyskujesz w C ++, nie pomaga, jeśli piszesz alokator pamięci zaprojektowany do łączenia wyrównanych bitów i bajtów. W przeciwieństwie do bogatego systemu C ++ i obsługi wyjątków, nie jest łatwo zrolować własne struktury danych - wystarczy spojrzeć na to, ile wysiłku wymaga napisanie struktury danych tak trywialnej std::vector, jakbyś chciał uczynić ją bezpieczną dla wyjątków i uniknąć wywoływania lekarze i lekarze na elementach, których nie wstawiłeś do kontenera (mówię jako ten, który zaimplementował całą bibliotekę standardową C ++). Kiedy bardzo trudno jest dobrze zaimplementować tablicę, którą można sobie wyobrazić, wyobraź sobie pracę wymaganą do wdrożenia BVH o jakości produkcyjnej.

Wolę C ++ niż C, gdy chcę korzystać z istniejących struktur danych lub implementować struktury wyższego poziomu za pomocą istniejących, ale jeśli zamierzam implementować strukturę danych niskiego poziomu w rdzeniu silnika, który nie ma zastosowania istniejące struktury danych, C zdecydowanie sprawia, że ​​o wiele łatwiej jest zrobić z jego uproszczonym, uproszczonym systemem typów, który pozwala ci tylko memcpytu i memmovetam, mallocna ciągły blok i realloctam, bez obawy o rzucanie konstruktorów, destruktorów i wyjątków.

user204677
źródło