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.
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.
Odpowiedzi:
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.
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.
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).
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.
virtual
funkcje 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.
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.
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.
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).
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:
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 ++ .
jeśli to musi być jedno i drugie
potem używam C. Może C ++.
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.
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!
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ć.
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 .
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.