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?
źródło
Odpowiedzi:
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 .
źródło
std::vector
lub jakiegośstd::map
fragmentu 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.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 .
źródło
Wszystkie współczesne języki, które widziałem, mogą wchodzić w interakcje z C:
Konieczność interakcji z C wynika z:
Oznacza to, że ponieważ języki te mogą komunikować się z C, mogą:
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ć.
źródło
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
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).
źródło
I am sure none of this is authoritative but we can use it to see trends
Ale 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ń.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.
źródło
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.
źródło
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 ++).
źródło
extern(C)
w D, podczas gdy w C ++ piszeszextern "C"
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.
źródło
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ę)
źródło
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.
źródło
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.
źródło
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.
źródło
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.
źródło
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
memcpy
tu imemmove
tam,malloc
na ciągły blok irealloc
tam, bez obawy o rzucanie konstruktorów, destruktorów i wyjątków.źródło