Czy użyłbyś C dzisiaj do projektu oprogramowania? [Zamknięte]


18

Jeśli tak, gdzie i dlaczego miałbyś go użyć?

Jeśli nie, proszę wyjaśnić, dlaczego C jest dla Ciebie nie do przyjęcia.


10
Oczywiście są aplikacje, dla których C jest właściwym i oczywistym wyborem, ale osobiście, jeśli nigdy więcej nie przejmę się blokiem pamięci, umrę szczęśliwy.
Adam Crossland,

Tak - konie na kursy.
Martijn Verburg

Co to znaczy?
Luca Matteis,

To stare powiedzenie dla tych, którzy śledzą wyścigi konne. Zasadniczo oznacza to, że każdy koń może wygrać w danym dniu, o ile kurs (suchy, błotnisty, długi, krótki, cokolwiek) mu odpowiada. To samo dotyczy języków programowania - zawsze zależy od kontekstu i dziedziny problemów.
Martijn Verburg

2
Nie, ale tylko dlatego, że dzisiaj nie pracuję nad żadnymi projektami, dla których C byłby dobrym wyborem językowym. Zapytaj mnie jutro.
James McNellis,

Odpowiedzi:


38

C to świetny język do programowania systemu

Użyłbym C, jeśli zaimplementowałem niektóre sterowniki harware. I użyłbym C, jeśli zaimplementuję własne jądro systemu operacyjnego lub własną maszynę wirtualną.

Jest to bardzo dobry język do robienia rzeczy na niskim poziomie, jeśli masz do czynienia ze sprzętowymi lub niskopoziomowymi interfejsami API dla Windows API, Linux, Mac OS X, Solaris i tak dalej ... Systemy wbudowane mają zwykle dobrą obsługę C z kompilatorem + zestaw uruchomieniowy.


4
Czy możesz wskazać, gdzie „Mac OS to Linux”? Myślałem, że Mac OS to Darwin: en.wikipedia.org/wiki/Darwin_%28operating_system%29
LennyProgrammers

1
@Stephen Furlani: LOL - tak, to rodzaj niedopowiedzenia. :-) Istnieje wiele martwych Unices, takich jak Xenix, DYNIX i A / UX, a obecne wersje większości z nas nie widzą takich jak HP-UX. Drzewo genealogiczne jest tak skomplikowane i splątane jak drzewo europejskich rodzin królewskich.
Bob Murphy

4
C jest okropnym językiem do programowania systemu. Wiemy, że od ponad 20 lat, odkąd robak Morris, i każdy, kto nadal korzysta z niego w jakimkolwiek projekcie mającym jakiekolwiek wymagania bezpieczeństwa, w szczególności systemy operacyjne lub aplikacje sieciowe, powinien być oskarżony o zaniedbanie.
Mason Wheeler,

2
@Mason Wheeler: Czego powinniśmy używać zamiast tego?
Steve S

1
@Mason Wheeler: Hmm ... Odrzuciłem Pascala w przeszłości, ale może nadszedł czas, aby spojrzeć jeszcze raz (bliżej). Czy masz inne sugestie?
Steve S,

17

Tak oczywiście. Używałbym C do pisania krytycznych pod względem wydajności elementów systemu lub części komunikacyjnych niskiego poziomu. Na przykład użyłbym C do pisania NIF w projekcie Erlang tylko dlatego, że jest to właściwe narzędzie (tm) do tego rodzaju zadań. Albo użyłbym C do pisania podobnych części (XS) w projekcie Perl.


16

Używam C profesjonalnie, prawie codziennie. W rzeczywistości C to język najwyższego poziomu, w którym regularnie programuję.

Gdzie używam C: piszę niskopoziomowy kod biblioteczny, który musi być tak wydajny, jak to możliwe. Mój kod kleju jest napisany w C, wewnętrzne pętle obliczeniowe są zapisywane w asemblerze.

Dlaczego używam C: O wiele łatwiej jest obsługiwać złożone struktury argumentów i warunki błędów niż w asemblerze, a narzut związany z wydajnością tego rodzaju sprawdzania warunków przed rozpoczęciem prawdziwego obliczenia jest często pomijalny. Ponieważ C jest prostym, dobrze określonym językiem, z łatwością pracuję z zespołem kompilatora w pracy, aby poprawić generowanie kodu, ilekroć widzę skompilowany kod z niedopuszczalnymi zagrożeniami wydajności.

Przenośność to kolejna wielka zaleta C. Mój kod kleju jest współużytkowany przez wiele specyficznych dla sprzętu implementacji bibliotek, nad którymi pracuję, co naprawdę upraszcza obsługę nowych platform. Większość platform nie ma maszyny wirtualnej ani tłumacza dla smaku językowego miesiąca. Niektóre platformy nie mają dobrego kompilatora C ++. Na bardzo niewielu platformach brakuje użytecznego kompilatora C (a ponieważ mam dobre relacje robocze z naszym zespołem kompilatorów, zwykle nie mam trudności z uzyskaniem potrzebnego wsparcia).


6
Wygląda na to, że masz naprawdę fajną pracę!
Paul Nathan

To jest moja wymarzona praca.
rsmahanti

5

Tak, użyłbym C w mocno osadzonym systemie o ograniczonych zasobach. I może używać C ++ zamiast ponieważ ułatwia promowanie silnych interfejsów pomiędzy komponentami oprogramowania, ale tylko wtedy, gdy wszystkie inżynierowie pracujący nad projektem zrozumieć, że C ++ jest łatwe do nadużycia prowadzące do rozmiaru kodu uwędzić (funkcje wirtualne i szablony są przykłady rzeczy, aby uniknąć ).

Widziałem także programistę C ++ próbującego utworzyć obiekt 10K na stosie 1K, co nie jest dobrym pomysłem.


2
w rzeczywistości virtualfunkcje są w porządku, ponieważ są zgodne z zasadą „nie płacisz za to, czego nie używasz”, ale w środowisku o ograniczonej pamięci możesz chcieć wyłączyć wyjątki i RTTI.
Matthieu M.,

Wydaje mi się, że zawsze tworzę pojedyncze obiekty w C ++ w celu zapewnienia interfejsów peryferyjnych. Myślę, że ludzie wybierają C ++ zamiast C w systemach wbudowanych, ponieważ uważają, że C ++ jest „lepszy”.
Erik,

5

Pracuję głównie z hiperwizorem Xen, różnorodnymi bibliotekami, które posiada i jądrem Linuksa. Czasami muszę napisać sterownik urządzenia (lub napisać go ponownie, aby maszyny wirtualne nxx mogły współdzielić jedno urządzenie, takie jak HRNG). C to mój podstawowy język i jestem z tego całkiem zadowolony.

Czy spróbowałbym napisać program do obsługi arkuszy kalkulacyjnych? Nie ma mowy. Każde narzędzie ma swoje zastosowania i cieszę się, że mam wiele narzędzi.

Uwielbiam C, ale nie próbuję wbijać śrub młotkiem.

Jeśli C jest rozsądnym wyborem dla nowego projektu, na pewno. Jeśli nie, użyję czegoś innego.


4

Chciałbym dla niektórych projektów. Zdecydowanie tak, gdybym musiał wdrożyć system osadzony, powiedzmy w przypadku kontrolera autonomicznego samolotu. Może nawet spaść niżej na niektórych częściach z montażem.

Jeśli pasuje do projektu, nie mam z tym problemu.

Jeśli chcesz opracować aplikację internetową, hmm, prawdopodobnie nie (lub musiałbym zobaczyć bardzo silne i oparte na faktach uzasadnienie).

Użyłbym go również z innych projektów opracowanych głównie w innych językach, gdy wąskie gardło zostało wyraźnie zidentyfikowane, a optymalizację można wdrożyć za pomocą kodu natywnego. Na przykład rozwiązanie Java, które musi wykonywać intensywne obliczenia w przypadku zaawansowanego renderowania (np. Silnik renderowania lub coś takiego). Możesz domyślnie wdrożyć implementację Java, jeśli nie jest to obsługiwana platforma, ale zapewnij natywnie skompilowaną implementację z C dla niektórych obsługiwanych platform i uzyskaj niezły wzrost wydajności.


Chcesz powód, aby użyć go do aplikacji internetowej? Memcached jest napisany w C i jest podstawową częścią wielu aplikacji internetowych. Mój kolega napisał także fragment kodu odnoszącego się do serwisu społecznościowego w C - gdy jest on skomplikowany algorytmicznie, z zestawami danych graniczącymi z wielkością ekonomicznie dostępnej pamięci RAM i obsługującymi zapytania, które są uruchamiane średnio 23 razy na renderowanie strony. , zaoszczędziliśmy 4 miesiące serwerów na wynagrodzeniach programistów dzięki 4-dniowej aplikacji C.
qdot

@qdot: To ważny powód. Jest też powód, dla którego istnieją dobre frameworki dla C i C ++ web dev. Po prostu nie byłbym moim pierwszym wyborem, gdyby był potrzebny do stworzenia ogólnej aplikacji internetowej lub strony internetowej. W przypadku frameworku takiego jak memcached ma to oczywiście sens. Podobnie posiadanie serwera w C może mieć sens. Stąd prawdopodobnie nie. Memcached (i twoja konkretna implementacja C części aplikacji internetowej wymagającej intensywnych obliczeń) są całkowicie poprawnymi zastosowaniami C dla web dev. Ale do tego potrzebny jest dobry programista C. Po prostu nie ktoś, kto odbierze to po drodze lub nie spodziewa się problemów.
haylem,

A jeśli inne osoby mają inne ważne powody, takie jak te, opublikuj je tutaj! Jest to przydatne dla czytelników.
haylem,

Jeśli używasz C, nauczysz się oczekiwać doskonałej wydajności, dobrych doświadczeń edukacyjnych i mnóstwa niewyjaśnionych problemów na początku. Właśnie próbowałem zachęcić ludzi do korzystania z C, ponieważ szybko staje się to kluczowe, kiedy odchodzisz od bycia „jednym z milionów” programistów PHP / Ruby / Python i zaczynasz drapać się w głowie przed dużymi problemami obliczeniowymi.
qdot

@qdot: rzeczywiście. Szkoda, że ​​wiele osób tak naprawdę już nie zna C.
haylem,

4

Każdy język ma przyzwoitą niszę. Często wdrażam rzeczy w językach wyższego poziomu, a następnie stopniowo sprowadzam je do C-landu, jeśli potrzebuję, aby były bardziej wydajne lub po prostu bardziej przenośne. Istnieją kompilatory C dla prawie wszystkiego, co istnieje, a jeśli piszesz do interfejsu API, który jest powszechnie dostępny (taki jak POSIX), może być bardzo przydatny.

To, co często mówię ludziom, którzy są dziś zainteresowani nauką programowania, to mieć pewność, że w niektórych z nich momencie uczą się języka C i czują się z nim dobrze. Możesz znaleźć się w okolicznościach, w których będziesz tego potrzebować. Niejednokrotnie musiałem skompilować mały, statycznie połączony program „szybkiego restartu” i użyć scp, aby umieścić go na dysku RAM na serwerze, na którym całkowicie zniknął podsystem dyskowy. (Tanie, tanie serwery, brak redundancji online, a tylko możliwość załadowania małego programu? C to droga.)

Nauka uczenia się pracy w języku C bez strzelania w stopę może znacznie przyczynić się do umiejętności skutecznego pisania w innych językach i środowisku. Przynajmniej takie było moje doświadczenie.

Chociaż z pewnością nie używam go do wszystkiego, a nawet do większości rzeczy, ma swoje miejsce i jest prawie uniwersalny: więc tak, korzystałem z niego w przeszłości i będę go używać w przyszłości (chociaż nie wiedzieć, kiedy w tej chwili).


4

Tak, robię to cały czas.

Jeśli nie wywołujesz żadnych bibliotek, kod wygenerowany z C nie wymaga obsługi systemu operacyjnego. Zapewnia również dokładną kontrolę nad generowanym językiem maszyny. Jest więc świetny do pisania sterowników lub innego kodu, który znajduje się w przestrzeniach jądra i innych ograniczonych sytuacjach, takich jak wiele rodzajów systemów osadzonych. Jest to także podstawowy język dla projektów open source, z którymi pracuję, takich jak X Windows, GTK + i Clutter.

Podczas gdy możesz robić wszystko w C, co możesz zrobić w C ++, często mechanizmy C ++ ułatwiają i przyspieszają pisanie kodu. Uwielbiam OOP i sposób, w jaki klasy C ++ zawierają funkcjonalność, i uwielbiam RAII. Ostrożne stosowanie automatycznego wywoływania destruktora, gdy obiekt wykracza poza zakres, eliminuje większość wycieków pamięci i zasobów, które są zmorą programowania C. STL jest w zasadzie gigantyczną biblioteką wysoce zoptymalizowanych algorytmów i struktur danych; jeśli chcesz użyć ich z C, musisz napisać je sam lub kupić gdzieś.

Niestety, z powodów, których nie rozumiem, system wykonawczy w Linuksie wymaga specjalnej biblioteki współdzielonych obiektów (odpowiednik DLL w Windowsie, dylib na Macu), aby uruchomić dowolny C ++, i nie można go znaleźć po uruchomieniu programu C. Nie mogę więc wykonać jednej z moich ulubionych sztuczek na komputerach Mac i Windows, a mianowicie napisać obiekt współdzielony oparty na C ++ za pomocą interfejsu API opartego na języku C i wywołać go z programu C.

Oto mój proces decyzyjny:

  1. Czy pracuję w ograniczonej sytuacji, takiej jak sterownik urządzenia? Użyj C.
  2. Czy piszę bibliotekę Linuksa, z której będzie musiał korzystać ktoś inny? Użyj C.
  3. Czy pracuję w kodzie, który jest już napisany w C? Użyj C.
  4. Czy piszę bibliotekę Mac lub Windows, czy bibliotekę Linuksa, z której będę korzystać? Napisz elementy wewnętrzne w C ++, ale udostępniaj tylko interfejs C, aby uniknąć delikatnego problemu z interfejsem binarnym.
  5. Użyj C ++.

Jedną fajną rzeczą jest to, że ponieważ C ++ może kompilować C, jeśli naprawdę potrzebujesz drobiazgowej kontroli nad kodem generowanym dla konkretnej sytuacji, możesz po prostu napisać C do tego, a C ++ do reszty, i skompilować wszystko za pomocą kompilatora C ++ .


Nie możesz „skompilować wszystkiego za pomocą kompilatora C” z powodu problemu Malloc z C ++ - musisz przesyłać w C ++, ale nie w C. Oczywiście wszystko jest w porządku, jeśli włączysz kod C, który jest całkowicie legalny, ale irytujący .
alternatywnie

1
@mathepic: Tak, C ++ jest zdecydowanie bardziej rygorystyczny niż C w wielu kwestiach, w tym w przypisywaniu pustych wskaźników do pisanych wskaźników. Naprawiam jednak błędy w kilku starszych projektach, częściowo kompilując pliki C za pomocą C ++. Uważam, że rzutowanie wyników na malloc jest niewielką ceną za to, że kompilator C ++ odkrywa subtelne błędy ze względu na kod, który jest całkowicie legalny w C.
Bob Murphy

3

Tak, ale zależy od projektu. C jest bardzo dobry dla niektórych projektów niskiego poziomu lub części największego rozwiązania.

Na przykład. Dla logiki biznesowej ok, ale nie dla interfejsu użytkownika.


2

jeśli to musi być jedno i drugie

  • szybki i
  • przenośny

potem używam C. Może C ++.


Szybki i przenośny, może to być także Java lub C #.
Jonas

11
@Jonas: nie. Przenośne to nie tylko „Windows lub Linux” ;-)
Steven A. Lowe,

1
@Jonas: Szybki i przenośny, nie byłby to ani Java, ani C #. C ++ jest przenośny między platformami i urządzeniami osadzonymi, takimi jak mikrokontroler, a C jest nawet przenośny (jako funkcje obce) na inne języki. Oba są szybsze niż języki niefunkcjonalne, a więc oparte na stosie, ale wciąż zbierające śmieci. Nie potrzebujesz zarówno: stosu, jak i pojemnika na śmieci.
comonad

2
@Jonas: przeczytaj; zwróć uwagę na zastrzeżenia, i znowu, „przenośny” nie oznacza tylko Windows / Linux. Pytanie dotyczy tego, kiedy użyjesz C; odpowiedź brzmi: kiedy musi biegać szybko wszędzie . Uwielbiam Java i C #, ale są młotami, a starsze / wbudowane systemy nie mają środowiska uruchomieniowego. Wiele z nich nie ma nawet miejsca na runtime!
Steven A. Lowe,

2
@Jonas: Doceniam twoją pasję, ale „nowe platformy” nie są tematem. Dam ci bardziej konkretny przykład, aby sprawdzić, czy to pomaga: mikroprocesory, które zapewniają wsparcie przeciwpożarowe dla czołgów na polu bitwy, mają kompilatory C. Nie mają, ani nigdy nie będą mieli JVM.
Steven A. Lowe

2

Tak, w rzeczywistości mam ostatnio!

Lubię programować w C. Najczęściej programuję w Pythonie, ale są chwile, kiedy potrzebuję szybkiego kodu i naprawdę cieszę się elegancją wynikającą z prostoty języka.

Projekt, nad którym teraz pracuję, to baza danych, która, jak można sobie wyobrazić, ma kluczowe znaczenie dla wydajności. W tej chwili używam C i jakiegoś Pythona, ale ostatecznie będzie to głównie, jeśli nie całkowicie C.


2

Tak!

C jest językiem niskiego poziomu i są sytuacje, w których C jest prawie jedyną opcją, taką jak używam C do programowania mikrokontrolerów lub łączę trochę kodu, aby współpracować z urządzeniami z klasycznych portów, takich jak Parallel, Serial, a nawet Modem!


2

Tak. Większość kariery spędziłem na programowaniu w C ++, ale teraz piszę większość kodu w Ruby i jeśli potrzebuję wydajności lub dostępu do rzeczy niskiego poziomu, piszę rozszerzenie C. To jest przyszły Człowiek!


Niektóre odpowiedzi dotyczyły przenośności i szybkości jako zalet kodu C, ale powiązanie jest kolejną ważną cechą. Relatywnie łatwy jest link do „obcego” kodu napisanego w C ze względu na prostą „klasyczną” dyscyplinę stosu. Wiele kompilatorów C pozwoli „wbudowanemu asemblerowi” na wygodę zejścia na bardzo niskim poziomie w architekturze (oczywiście poświęcając przenośność w akcie).
hardmath

1

Użyłbym C, gdybym pisał system operacyjny. Ponieważ nie stanie się to w ciągu najbliższych dwudziestu lat, chyba że trafię w lotto i nie będę miał nic innego do roboty, jak tylko stworzyć własną świetną dystrybucję Linuksa, prawdopodobnie po prostu będę trzymać się C #, Java, Python itp. Itp. używałem C przez bardzo długi czas, ale zawsze lubiłem go używać; Myślę jednak, że w dzisiejszych czasach moja głowa jest tak pochłonięta OO, jeśli muszę do tego wrócić, zajęłoby mi trochę czasu, aby znów się potoczyć.


0

C ++ jest przenośny na różnych platformach i urządzeniach wbudowanych, takich jak mikrokontrolery. (C ++ można skompilować do C, a więc mikrokontrolerów).

C jest nawet przenośny (jako funkcje obce) na inne języki. Dlatego iff programuję biblioteki niskiego poziomu, a następnie chcę większej kompatybilności niż C ++.

Haskell jest przenośny na różne platformy (ARM już wkrótce), ale NIE ma wbudowanych urządzeń takich jak mikrokontrolery. Jego prędkość jest porównywalna z C i C ++; ale ponieważ jest funkcjonalny, używa śmietnika zamiast stosu środowiska wykonawczego, dlatego może być szybszy i wolniejszy niż C w różnych momentach (odśmiecanie) iw różnych sytuacjach (kontynuacje zamiast wywołań podprogramowych).


Wybieram najbardziej abstrakcyjny język, ponieważ szybkość programu nie różni się, ale czas programowania i wskaźnik błędów. C i C ++ różnią się znacznie, ale nie z punktu widzenia Haskell.

Nie preferuję innych języków, chociaż znam jedną lub dwie ręce pełne. … Z wyjątkiem kilku przypadków, cóż, bash .


0

Systemy wbudowane często mają nie więcej niż kilka kilobajtów pamięci RAM i być może kilkadziesiąt kilobajtów pamięci flash, a taktowanie procesora wynosi kilka MHz. C jest jedyną opcją, która ma sens w tak czystym środowisku metalowym.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.