Po co język C?

0

Z C nie miałem wiele styczności, o kilku lat programuję w C++, jednak co jakiś czas spotyka się ludzi, ktorzy uczą się C, a nie C++. Czym jest to podyktowane? C++ posiada wszystkie ficzery, które daje nam C a w dodatku wiele innych, lepszych. Dlaczego ludzie uczą się C, skoro jest jego nowa, lepsza wersja?
Może jestem jakimś ignorantem i tego nie rozumiem, ale oświećcie mnie.

3

Istnieje trzy podstawowe przyczyny które znam z autopsji:

  1. Mam chorą ambicje (aczkolwiek w tym się nie przyznaję) i jestem super szybkim koderem w C, za nic nie uznam wyższości C++;
  2. Z trudem nauczono mnie C, za C++ nawet brać się nie będę, więc uczyć studentów będę wyłacznie C;
  3. Uczę się u gościa z punktu wyżej.
0

Dla mnie to troche jak mając C++11 nie używać

int T[size] {};

Tylko z uporem pisac pętle zerującą tablice. Bo... właśnie.

0

Może planują naukę Objective-C, bo więcej na tym zarobią?

Objective-C też jest nadzbiorem C (nawet bardziej kompatybilnym niż C++) i też daje dużo dodatkowych możliwości :]

Ja jestem Javowcem, ale hobbystycznie koduję sobie część programów w C (lub czasami z niewielkimi dodatkami z C++). Uczyć się jakoś mocno C++ nie zamierzam (choć trochę go umiem, ale niewiele), bo i po co? Jak chcę zakodzić coś obiektowo to kodzę w Javie lub Scali.

0
int arr[1000] = {0};

albo memset.
Sama tak zrobiłam i nie z powodów, które wymienił @_13th_Dragon. Próbowałam coś ładnie (obiektowo) napisać w C++ , do tego bawiłam się Qt, ale marnie mi to wychodziło. Postanowiłam uczyć się podstaw bez OOP a C wydawał mi się prostszy, przyjemny i odpowiedni dla małych konsolowych aplikacji pod Linuxa. Ostatecznie wymyśliłam, że przeskoczę na coś wysokiego tj. Java/Skala i OOP. Zresztą język to tylko narzędzie, są w miarę podobne a przeglądając oferty pracy widziałam wymagania typu C/C++ C++/JAVA :) I taka ciekawostka: http://adambard.com/blog/top-github-languages-for-2013-so-far/

8

Szafowanie językami uberwysokiego poziomu z ogromnymi wymaganiami sprzętowymi kończy się w momencie, kiedy trzeba napisać sterownik do pralki i jednocześnie zmieścić się w 2kB RAMu na mikrokontrolerze :F

0
pingwindyktator napisał(a):

Dla mnie to troche jak mając C++11 nie używać

int T[size] {};

Tylko z uporem pisac pętle zerującą tablice. Bo... właśnie.

Ten sam kod w C:

 
int T[size] = { 0 };

Idąc Twoim tokiem rozumowania, dlaczego piszesz w języku, w którym musisz myśleć o zarządzaniu pamięcią? Dlaczego wybierasz język, który z każdym kolejnym standardem wprowadza coraz to dziwniejsze (trudniejsze) konstrukcje, by rozwiązać problemy takie, jak np. perfect forwarding?
Tym co wyróżnia C jest prostota. Ten język przede wszystkim uczy, co to znaczy programować.
Sięgnij po książkę "The C Programming Language" autorstwa K&R.

...
Anyway, żeby nie było, że Cię zrażam do C++...sam programuję w tym języku (przynajmniej próbuję) i uważam go za jeden z najokropniejszych języków z jakimi dane mi było mieć styczność. Jednocześnie nie wyobrażam sobie żebym przestał w nim pisać, bo uwielbiam tego potwora ;)

2

Pewnie dlatego, ze zarządzanie pamięcią i perfect forwarding to nowe możliwości. Nie musze z tego korzystac, nie musze sie tego uczyć, ale jeśli zechce, to nie będe musiał najpierw uczyc sie innego języka programowania, bo w moim już to wszystko jest.

4

To co pan powyżej Demonical Monk (ale szybko piszecie) oraz:

  1. C jest bardziej przenośny (są konwertery C++->C z tego co wiem, ale z wydajnością u nich dość strasznie)

  2. W sumie to samo co wyżej - wydajność. Z tym bywa różnie, ale to w C a nie w C++ masz nad wszystkim (prawie) całkowitą kontrolę.

C++ posiada wszystkie ficzery, które daje nam C a w dodatku wiele innych

  1. Pytanie czy to zawsze zaleta? Ficzery C++ (rozumiem, obiektowość i szablony) są przydatne, ale wprowadzają też olbrzymią dawkę złożoności (polecam poszukać o C++ pitfalls - w C++ można się tak naciąć, że tworzone są o tym całe strony ;]).
    Cytując:

C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off.
Bjarne Stroustrup

Z innych rzeczy które mi przychodzą do głowy:

  • masz narzędzia (np. do analizy kodu, albo chociażby IDE) z których chcesz skorzystać, i są napisane pod C a nie pod C++.
  • piszesz soft dla NASA (i chcesz mieć formalnie udowodnioną każdą linijkę kodu, bo jeden drobny błąd może spowodować ośmiocyfrowe straty) ;]
  • z banałów - utrzymujesz soft w C, modyfikujesz czyjś kod w C, u Ciebie w pracy piszą w C.
  • możesz po prostu lubić elegancję C (to ja), i/lub nie chcesz do krótkich (<100 linijek) programów wyciągać niepotrzebnie kombajny
  • podobnie do powyższego - prostota, C jest znacznie prostszy (i moim zdaniem lepszy, ale to kontrowersyjna opinia) do nauki.

Dlaczego ludzie uczą się C, skoro jest jego nowa, lepsza wersja?

Biorąc pod uwagę powyższe, C++ to nie nowsza wersja C, tylko inny język, z innym targetem i założeniami.

edit:

Idąc Twoim tokiem rozumowania, dlaczego piszesz w języku, w którym musisz myśleć o zarządzaniu pamięcią? Dlaczego wybierasz język, który z każdym kolejnym standardem wprowadza coraz to dziwniejsze (trudniejsze) konstrukcje, by rozwiązać problemy takie, jak np. perfect forwarding?

Pewnie dlatego, ze zarządzanie pamięcią i perfect forwarding to nowe możliwości. Nie musze z tego korzystac, nie musze sie tego uczyć, ale jeśli zechce, to nie będe musiał najpierw uczyc sie innego języka programowania, bo w moim już to wszystko jest.

Może Cię krzywdząco ocenię (przepraszam jeśli tak), ale wydaje mi się że przechodzisz (prawie każdy kiedyś to miał) przez fazę mój język jest najlepszy, po co ktoś miałby używać innego ;). Każdy (z tych choć trochę popularnych to znaczy) język się do czegoś innego nadaje, każdy ma specyficzne dla siebie wady i zalety.

0

Dlaczego ludzie uczą się C, skoro jest jego nowa, lepsza wersja?

Jeden ważny powód:

  1. Bo C++ ma sporo ficzerów, które wydają się spoko ale w praktyce powodują problemy
0

Może Cię krzywdząco ocenię (przepraszam jeśli tak), ale wydaje mi się że przechodzisz (prawie każdy kiedyś to miał) przez fazę mój język jest najlepszy, po co ktoś miałby używać innego ;). Każdy (z tych choć trochę popularnych to znaczy) język się do czegoś innego nadaje, każdy ma specyficzne dla siebie wady i zalety.

Zupełnie nie o to chodzi. Do tego tematu zainspirowały mnie dwa inne, w ktorych problem został rozwiązany w języku C++, natomiast autor tematu chciał w C i teraz problem, bo w C nie ma kilku rzeczy, ktore są w C++. Uważam C++ za lepszy od C, jednak nie porównuje go np do javy bo bez jej znajomości bałbym sie powiedziec, ktory język jest lepszy.

3

Nie istnieje (na calym swiecie) pojecie lepsze narzedzie. Narzedzia sa wybierane do rozwiazywanego problemu.

2

wydajność. Z tym bywa różnie, ale to w C a nie w C++ masz nad wszystkim (prawie) całkowitą kontrolę.

Nie rozumiem argumentów tego typu. C++ jest prawie w pełni kompatybilny z C; pisanie, że coś da się zrobić w C, a nie da w C++ jest dla mnie mocno podejrzane (ok, nie nazwę zmiennej class, nie podam typu parametru funkcji po jego deklaracji i nie ma VLA, ale zakładam, że nie o tym mówimy), zejście do bebechów i bezpośrednie kontrolowanie zachowania kodu co do instrukcji jest jak najbardziej możliwe - aż do poziomu deklaracji asm - a czasem wysokopoziomowość C++ pozwala nie tylko uczynić kod czytelniejszym, ale też znacznie szybszym (znany przykład, qsort vs. std::sort: https://stackoverflow.com/questions/4708105/performance-of-qsort-vs-stdsort ).

0

Dlaczego ludzie uczą się C, skoro jest jego nowa, lepsza wersja?
C++ nie jest nową, lepszą wersją C, choć oczywiście można debatować czy jest lepszy czy nie ;-)

Nauka C siłą rzeczy musi kłaść większy nacisk na algorytmy, bo mniej masz gotowców w standardowej bibliotece.
Dlatego C ma pewne walory edukacyjne, przynajmniej na początku.

Uważam że znać trzeba oba (czyli uczyć się C++ ale w C też się odnaleźć), przede wszystkim dlatego, że pracodawcy często nie rozróżniają tych języków, zatrudniając programistów nieistniejącego języka „C/C++”, albo zatrudniają cię jako programistę C++ a projekt dostajesz w C.
Co też to ostatnie mi się kiedyś przydarzyło.

1

Języki/narzędzia wyższego poziomu są często budowane z wykorzystaniem niskopoziomowych języków typu C. Ktoś to musi rozwijać :p

1

Wydaje mi sie, ze jezyk C jest standardem w pewnym obszarze zastosowan. Mam tutaj na mysli glownie zastosowania w elektronice w tym rzeczy typu programowanie sterownikow do pralek czy czego tam jeszcze, ale i nie tylko.

Mozesz zapytac na forach powiazanych z elektronika w czym programuja swoje zabawki - jezeli dostaniesz odpowiedzi, ze w C to pewnie dlatego ludzie ucza sie C, bo to w C przyjdzie im sie bawic jak trafia do zespolu elektronikow.

Co wiecej: jezyk C jest troche bardziej popularny na Linuxach. Jezeli wiec jakas firma produkuje urzadzenia (wszystko jedno czy to jakies routery, telewizory czy nie wiadomo co jeszcze) opartych na linuxie to osoby pracujace nad takimi urzadzeniami z pewnoscia zetkna sie z jezykiem C.

Kolejnym powodem sa uczelnie: studenci ucza sie C zamiast C++ bo moga miec akurat wykladany jezyk C, lub oba z tym, ze C w pierwszej kolejnosci.

To co napisalem to oczywiscie moje domysly i niekoniecznie musi to miec przelozenie na rzeczywistosc. Napisalem to, poniewaz uwazam, ze warto byloby popytac rowniez elektronikow - mialbys zapewne szerszy punkt widzenia na te sprawe.

1
Wibowit napisał(a):

Może planują naukę Objective-C, bo więcej na tym zarobią?

Objective-C też jest nadzbiorem C (nawet bardziej kompatybilnym niż C++) i też daje dużo dodatkowych możliwości :]

Troche watpie w to, ze ktos kto chce sie uczyc Objective-C zaczyna nauke od C. Mialem (nie)przyjemnosc pisac w tym calym Objective-C i prawde mowiac to nie zauwazylem tam jakiegos szczegolnego podobienstwa do C. Niby jest to jakis tam nadzbior jezyka C, ale w praktyce to sie tego az tak bardzo nie czuje. Przynajmniej ja nie czulem - dla mnie to byl calkowicie inny jezyk.

2

Dla mnie C++ jest dosłownie "językiem ogólnego przeznaczenia". Fajnie jest mieć możliwość użycia pewnych mechanizmów a już to czy z tego korzystamy czy nie to sprawa indywidualna.
W C++ możemy pisać niskopoziomowo, proceduralnie, obiektowo, funkcyjnie. Nie można już też narzekać na bibliotekę standardową czy brak porządnej biblioteki do GUI.
Jeżeli uważamy jakiś element C++ za niebezpieczny i mogący powodować sporo problemów to na etapie projektu tworzymy "dedykowany podzbiór" C++ pod ten nasz konkretny projekt - wyrzucamy wskaźniki, wyjątki, wielokrotne dziedziczenie - wszystko w naszych rękach.

Ucząc się od podstaw C++ uczymy się także języka C bo często na studiach czy nawet w książkach mechanizmy z C które mają lepsze odpowiedniki w bibliotece standardowej STL są mimo to używane w C++.
Ciężko mi znaleźć argument za tym aby zostawić C++ i uczyć się C. Tak jak mówię możemy napisać program w C++ który praktycznie niczym nie będzie różnił się od C poza rozszerzeniem pliku źródłowego.

1

Ciężko mi znaleźć argument za tym aby zostawić C++ i uczyć się C. Tak jak mówię możemy napisać program w C++ który praktycznie niczym nie będzie różnił się od C poza rozszerzeniem pliku źródłowego.

Idąc tym tokiem rozumowania, można powiedzieć, że każdy klepiący w C jest jednocześnie koderem C++. Po prostu używa specyficznego "dedykowanego podzbioru" :)

Co więcej, ktoś kto klepie w czystym C jest jednocześnie koderem C, C++, Objective-C, a może i wielu innych. Win!1!oneoneeleven

0

Wibowit nie zrozumiałeś mnie... W momencie gdy dostaniesz ode mnie plik źródłowy z rozszerzeniem .cpp może się zdarzyć że powiesz o mnie "dobry programista C" bo pisze sterownik i użyje tylko mechanizmów z biblioteki języka C, ja dostając od Ciebie plik z rozszerzeniem .c nie będę mógł powiedzieć o Tobie "programista C++" więc idziesz złym tokiem rozumowania. To są 2 osobne języki - C i C++. A to że C++ jest tak mocno kompatybilny z C że jest swego rodzaju "nadzbiorem" tego języka to już nie mój pomysł.

1

http://cppquiz.org/ - w bardzo przystępny sposób potrafi wytłumaczyć dlaczego nie C++.

Osobiście głównie piszę w Rubym, ale czasem zdarza się potrzeba napisania czegoś w C, C++ czy czymś innym (na studia). Ja mam tak, jeśli ma być przenośnie i wydajnie to C, jeśli jednak potrzebuję wyższy poziom to biorę następcę C, czyli D. Może w tym 2 nie za wiele jest bibliotek, ale w zastosowaniach, które potrzebuję najczęściej mi to zupełnie nie zawadza.