Czy warto się uczyć języka C?

Obecnie na świecie istnieje kilkaset języków programowania (listę można znaleźć np. na Wikipedii). O ile zgadzam się ze stwierdzeniem, że jednocześnie można się posługiwać jednym, może dwoma (nieużywanych języków po prostu się zapomina), to na pewno warto poznać przynajmniej w podstawowym stopniu kilka z nich. Mi osobiście zdarzyło się pisać programy w około piętnastu różnych językach, z czego w połowie przy okazji różnych działań zawodowych, a w pozostałych wyłącznie w celach edukacyjnych bądź dla zabawy. Dzisiaj spróbuję uzasadnić dlaczego dobrym pomysłem jest opanowanie (najlepiej na wczesnym etapie) właśnie języka C.

C to nie C++

Na początek szybkie wyjaśnienie dla osób nie wtajemniczonych. C i C++ to dwa różne języki programowania. Oczywiście zbieżność nazw nie jest przypadkowa i na C++ można patrzeć jako na rozszerzenie języka C. Problem w tym, że o ile osoby, które zaczęły naukę od C, a potem poznały C++ potrafią się posługiwać obydwoma językami, to znam ludzi, którzy nauczyli się pobieżnie C++, a potem mieli trudności z napisaniem programu w „czystym” C.

Trochę historii

Język C powstał w latach siedemdziesiątych dwudziestego wieku w Laboratoriach Bella (podobnie zresztą jak i cała masa innych dobrodziejstw techniki, w tym tranzystory). Jego twórcą był Dennis Ritchie, a pierwszym dużym sukcesem języka stało się zaimplementowanie jądra systemu operacyjnego Unix (wcześniej jądra systemów operacyjnych pisano w asemblerze). Język szybko zaczął zdobywać popularność tak, że w 1989 roku Amerykański Narodowy Instytut Standaryzacji (ANSI) opublikował oficjalny standard tego język zwany C89. Najnowsza aktualizacja tego standardu (C18) ukazała się dwa lata temu.

Dennis Ritchie - twórca języka C. Źródło: Wikipedia

Język C – trudny i niepraktyczny?

O ile w latach siedemdziesiątych C mógł uchodzić za język wysokiego poziomu, to obecnie gdy ktoś po niego sięga to mówi się, że programuje zdecydowanie niskopoziomowo (co praktycznie wszyscy rozumieją jako „trudno i uciążliwie”). Faktycznie w języku C brakuje nam wielu dobrodziejstw znanych z takich języków jak C#, Java czy JavaScript. Wymaga on ręcznego zarządzania pamięcią, ręcznej obsługi tekstów czy tablic. Do tego nie wspiera takich paradygmatów jak programowanie obiektowe czy funkcyjne (choć nie znaczy to, że nie da się zgodnie z nimi programować posługując się tylko C).

Język C raczej nie będzie naszym wyborem jeżeli chcemy programować aplikacje webowe czy graficzne interfejsy użytkownika. Generalnie język ten jest postrzegany jako stosowany do dwóch celów: programowania małych mikrokontrolerów oraz systemów operacyjnych i programów działających bardzo blisko systemu operacyjnego (np. sterowników urządzeń).

Nasuwa się zatem pytanie, czy języka C w ogóle warto się uczyć. I jeżeli tak to w jakich przypadkach? Spróbujmy sobie na nie odpowiedzieć.

Must have dla programistów embedded

Jeżeli chcesz się zabrać za programowanie systemów wbudowanych (embedded), niezależnie od tego czy będą to hobbystyczne projekty na Arduino czy komercyjne projekty na mikrokontrolerach ze rdzeniem ARM, to za bardzo nie masz wyjścia. Musisz poznać język C. O ile dostępne są kompilatory C++ dla ARMów to w przypadku programowania małych mikrokontrolerów wiele funkcjonalności tego języka (a przede wszystkim jego biblioteka standardowa) mogą się okazać niedopuszczalnym marnowanie dostępnej pamięci. Pomijając już fakt, że większość dostępnej dokumentacji i przykładowych projektów jest napisana w C, więc bez znajomości tego języka trudno będzie ją zrozumieć.

Zrozum swój komputer

Ucząc się programować w języku C masz okazję dobrze zrozumieć jak tak naprawdę funkcjonują komputery i programy komputerowe. Dowiesz się jak samodzielnie zarządzać pamięcią, jak implementować dynamiczne struktury danych czy jak realizowane są operacje na tekstach. Ułatwisz też sobie zrozumienie jak funkcjonuje system operacyjny i jak z niego korzystać. Dobre zrozumienie tych tematów bardzo się przydaje, szczególnie gdy zachodzi potrzeba połączenia w jednym projekcie kilku różnych języków programowania.

A czemu nie C++?

Po języki takie jak C czy C++ sięgamy często wtedy gdy musimy napisać bardzo wydajny kod. O ile nie programujemy małych mikrokontrolerów to zwykle dużo łatwiej będzie taki kod napisać w C++, a jego wydajność wcale nie będzie gorsza niż kodu w C. Mimo to uważam, że zabieranie się za C++ bez wcześniejszej nauki C nie jest dobrym pomysłem. Dlaczego tak jest?

C++ został zaprojektowany jako pewnego rodzaju rozszerzenie języka C. Wyobraźmy sobie zatem dwa scenariusze: w pierwszym uczysz się języka C, a potem przechodzisz do nauki C++. Nie marnujesz w ten sposób czasu bo i tak prawie wszystko czego się uczysz dotyczy zarówno C jak i C++. Jako bonus znasz za to granicę między tymi językami. Wiesz co można zrobić w C, a co jest dostępne w C++.

W drugim scenariuszu uczysz się od razu C++. Poświęcasz dużo czasu na naukę rzeczy, które są de facto elementami C, ale nie wiesz gdzie leży granica. W konsekwencji, jeżeli przyjdzie Ci kiedyś napisać program w C to może Cię czekać sporo frustracji związanych z tym, że wielu mechanizmów, które znasz nie możesz stosować.

Jest jeszcze jedna kwestia. C++ to naprawdę skomplikowany język. Powiedziałbym nawet, że najtrudniejszy w jakim zdażyło mi się programować (a programuję od ponad 20 lat i trochę się tego po drodze zebrało). Szansa, że początkujący programista dobrze zrozumie wszystkie mechanizmy jego działania są raczej nikłe. Nawet doświadczeni programiści potrafią być mocno zdezorientowani tym dlaczego niektóre fragmenty kodu w C++ działają tak a nie inaczej. 

Tymczasem poznanie praktycznie każdego mechanizmu języka C (z kilkoma wyjątkami) jest możliwe już w ciągu kilkudziesięciu godzin nauki. Owszem samo programowanie jest bardziej czasochłonne gdyż brakuje wielu „ułatwiaczy”, które zapewnia C++, ale za to masz szansę doskonale zrozumieć co będą robić Twoje programy. Na etapie wczesnej nauki programowania jest to bardzo cenne.

Czy C to wymierający język?

Znam wielu programistów, którzy nigdy nie napisali programu w języku C, albo znają go bardzo pobieżnie. Jeżeli przejrzymy oferty pracy w Polsce (pomijając oferty dla programistów embedded) to tylko niewielka ich ilość dotyczy stricte języka C (choć ofert dla programistów C/C++ jest już sporo). Jeżeli jednak spojrzymy na rankingi popularności języków programowania np. TIOBE czy IEEE Spectrum to C znajduje się tam w ścisłej czołówce (odpowiednio drugie miejsce w TIOBE i trzecie w IEEE). Świadczy to o tym, że język C nadal jest jednym z najpopularniejszych na świecie.

Ranking popularności języków programowania wg IEEE Spectrum
Ranking popularności języków programowania wg TIOBE

Podsumowanie

Podsumujmy tę całą analizę. Czy warto uczyć się C? Jeżeli chcesz programować systemy wbudowane i mikrokontrolery (np. studiujesz takie kierunki jak elektronika czy automatyka) to musisz obowiązkowo poznać ten język. Jeżeli planujesz się poświęcić programowaniu aplikacji webowych to pewnie poradzisz sobie bez jego znajomości (dotyczy to też wielu projektów aplikacji desktopowych), ale jego nauka na pewno poprawi Twoje umiejętności programistyczne. 

Maciej Kraszewski

Maciej Kraszewski

Inżynier, menedżer R&D i nauczyciel akademicki. Uwielbiam zajmować się tworzeniem nowych technologii, zdobywaniem nowej wiedzy i dzieleniem się swoim doświadczeniem z innymi. Specjalizuję się w zagadnieniach przetwarzania obrazu i widzenia maszynowego.
Szukasz dobrych materiałów o projektowaniu elektroniki?

Załóż darmowe konto na naszej platformie i odbierz pakiet materiałów edukacyjnych.

Zakładając konto zgadzasz się na przesyłanie Ci treści marketingowych przez IT20 sp. z o.o. zgodnie z dostępną na stronie Polityką Prywatności. Możesz wycofać zgodę w każdej chwili.

4 komentarze do “Czy warto się uczyć języka C?

  • 24 stycznia 2021 o 17:41
    Permalink

    Hm, moim zdaniem nauka języków niskopoziomowych na wczesnym etapie nauki programowania nie jest najlepszym wyborem (chyba, że idziemy w mikrokontrolery itp.). Języki niskopoziomowe mają trudną w zrozumieniu składnię i mogą łatwo odrzucić (mówię o wczesnym etapie nauki) chcącego się nauczyć programowania.

    Ja zaczynałem od C++ i nie uważam tego za najlepszy wybór. Na początku człowiek nie za bardzo wie co i po co jest, w dodatku często zaczyna się skupiać na rozumieniu pojedynczych funkcjonalności języka. Nie daje to poglądu, ani nie wyrabia za bardzo ogólnego zrozumienia sensu programowania.

    Dużo łatwiej jest zrozumieć o co chodzi zaczynając od języków z niskim poziomem wejścia jak javascript lub python, a potem, jak ktoś chce oczywiście, przejść na języki niższego poziomu. Wtedy jedyne czego nam potrzeba to nauczyć się składni, a z dzisiejszymi edytorami/ide + docsy to dziecinnie proste.

    Niech przykładem będzie choćby nauka jakiegoś wzorca lub algorytmów. Ten sam kod będzie trzy razy krótszy w pythonie niż w c++, nie mówiąc o c. Dużo łatwiej go zrozumieć gdy jest krótszy. A jak pojmiemy sens to możemy to przełożyć na język niższego poziomu, bo zrozumieliśmy o co chodzi. To tylko analogia do całej nauki programowania.

    Pozdrawiam, guzman!

    Odpowiedz
    • 25 stycznia 2021 o 20:22
      Permalink

      Cześć. Dzięki za głos w dyskusji. Kiedy rozmawiam z różnymi ludźmi na ten temat to też padają często argumenty, które podałeś. Ja też nie uważam C++ za dobry wybór dla początkujących – w ogóle sądzę, że jest to najtrudniejszy do opanowania język z jakim się zetknąłem.

      Ale C to nie C++. Moim zdaniem ważnym kryterium jest tutaj to czy jesteś w stanie zrozumieć jak działają poszczególne mechanizmy języka. W samym C jest ich stosunkowo mało, choć oczywiście powoduje to, że trzeba się więcej „napisać” żeby osiągnąć zamierzony efekt. Spójrz na listę elementów, które trzeba zrozumieć, żeby naprawdę dobrze poznać ten język: zmienne (są tylko cztery typy), dwa rodzaje instrukcji warunkowych, dwa typy pętli, funkcje, makrodefinicje i wskaźniki. W przypadku C++ dochodzą dziesiątki mechanizmów: klasy, przekazywanie argumentów przez wartości i referencje, cykl życia obiektów, przeciążanie funkcji i operatorów, przestrzenie nazw… można by długo wymieniać. Języki takie jak C#, Java, Python, JavaScript są porównywalnie złożone.

      Dlatego preferuję rozpoczęcie nauki od C. Dzięki prostocie tego języka można naprawdę szybko zrozumieć wszystko co się dzieje pod maską. Oczywiście to tylko moja propozycja. Można nawet przez lata pracować zawodowo jako software developer i nie rozumieć wszystkich mechanizmów działania programów komputerowych (piszę to bez ironii).

      Swoją drogą to sam uczyłem się programowania jako nastolatek w latach 90 w Pascalu (pod kątem „niskopoziomowości” jest bardzo podobny do C).

      Odpowiedz
  • Pingback: Czy warto się uczyć asemblera? - InterTech Academy

  • 29 sierpnia 2022 o 01:21
    Permalink

    Cześć. Naukę programowania zacząłem od javascript. Mimo, że umiałem zrobić wiele rzeczy, to nie do końca rozumiałem jak działa program – mówiąc precyzyjniej wiedziałem jak program zadziała, ale nie zawsze rozumiałem dlaczego. Wówczas znalazłem kurs języka C InterTech Academy i wiele rzeczy stało się jasnych i zrozumiałych. Już kolega, z zawodu administrator sieci, radził mi uczyć się asemblera i C – bo tylko wtedy zrozumie programowanie. Teraz widzę, że miał rację. Nie przerobiłem jeszcze wszystkich kursów języka C z InterTech Academy. Ale ten kurs umieszczony na udemy jest absolutnie SUPER!!!. Jasno, klarownie, etapami, zwięźle trafia w sedno i popiera przykładami. Do tej pory myślałem, że tylko anglojęzyczne kursy są takiej jakości a polskie to samo badziewie, ale widać w kraju też mamy ludzi którzy bardzo wiele potrafią zrobić i robią to na bardzo wysokim poziomie…. Polecam. Mariusz.

    Odpowiedz

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Szukasz dobrych materiałów o projektowaniu elektroniki?

Załóż darmowe konto na naszej platformie i odbierz pakiet materiałów edukacyjnych.

Zakładając konto zgadzasz się na przesyłanie Ci treści marketingowych przez IT20 sp. z o.o. zgodnie z dostępną na stronie Polityką Prywatności. Możesz wycofać zgodę w każdej chwili.

Zapisz się na listę mailową i odbierz swoje bonusy!

Więcej treści na temat elektroniki i robotyki, darmowe e-booki i dostęp do minikursów on-line. Otrzymasz to wszystko zapisując się na naszą listę mailową.