Witam wszystkich. Na wstępie chciałem zaznaczyć że jestem tu nowy. Bardzo chciałbym nauczyć się programować w języku C i tu moje pytanie. Skąd czerpać najlepiej wiedzę? Dodam że kompletnie nic nie umiem i chciałbym zacząć od podstaw. Polecacie jakieś książki może fora internetowe? I drugie pytanie czy język C pomaga w nauce innych języków?
Jeśli chodzi o język C, to jest to chyba najlepszy kurs w polskiej sieci.
https://pl.wikibooks.org/wiki/C
Tak, znajomość języka C zdecydowania pomaga w nauce innych języków programowania, a także pomaga w pisaniu lepszego i szybszego kodu.
A dlaczego wybrałeś język C? Jest to język przeznaczony do dosyć wąskiej grupy oprogramowania.
Znakomita książka dla początkujących (tak samo jak edycja dotycząca C++):
http://helion.pl/ksiazki/jezyk-c-szkola-programowania-wydanie-vi-stephen-prata,jcszp6.htm
Mogę polecić, oprócz powyższej:
- Język ANSI C. Programowanie. Wydanie II - Brian W. Kernighan, Dennis M. Ritchie
- Programowanie w C. Sprytne podejście do trudnych zagadnień, których wolałbyś unikać (takich jak język C) - Zed A. Shaw
Internetowe kursy języka C pokazują zazwyczaj prostą semantykę języka, pomijając większość kluczowych zagadnień, takich jak działanie kompilatora, czy skromną bibliotekę tego języka.
Tak, C pomaga w nauce innych języków, bo masa innych języków ma bardzo podobną składnię do niego. Choć nauka innego języka niż C też pomoże w nauce innych języków, ale być może w mniejszym stopniu poprzez np. duże różnice w składni.
Czemu chcesz zaczynać od języka C? Jest bardzo trudny jak na początek. Przynajmniej w dzisiejszych czasach. Wybierz sobie jakiś prostszy język, np. C#. Jak w nim ogarniesz o co chodzi w programowaniu, to wtedy możesz zejść do C.
C warto znać na tej samej zasadzie co ASM.
W C możesz zrobić dowolny soft - wystarczy dużo silnej woli.
W innych językach, nawet jeśli jesteś biegły, niektórych rzeczy nie dasz rady zrobić.
Można np. się ograniczyć do stacku webdev (typu PHP + JavaScript + CSS + HTML), ale wtedy taki osobnik nie powinien się nazywać programistą (może jakimś inżynierem ds. aplikacji webowych).
Wg mnie książka Prata jest przesadzona. 1024 strony o tym języku brzmi jak okrutny żart ("przeczytaj to a potem już wszystko będzie dla Ciebie banałem"). To sporo za dużo jak na książkę o podstawach.
Od siebie polecam niezmiennie K&R (328 stron) - http://helion.pl/ksiazki/jezyk-ansi-c-programowanie-wydanie-ii-brian-w-kernighan-dennis-m-ritchie,jansic.htm
chociaż dzisiaj może być już lekko nieaktualna.
Też polecę jak kolega @vpiotr K&R jak dla mnie nie ma lepszej książki fajnie wprowadzającej w tematykę języka C.
@vpiotr: Cała prawda. C bardzo dobrze znać. Poza tym dla mnie C ma w sobie tę niskopoziomowość, która kiedyś strasznie mi się podobała. Uwielbiałem bawić się zarządzaniem pamięcią i wskaźnikami. Wiele się dzięki temu nauczyłem. Później idąc w języki wysokopoziomowe widać w jakim kierunku to wszystko wyewoluowało. Nie masz problemu ze zrozumieniem takich rzeczy jak typ referencyjny czy typ wartościowy w takim C#. Znając C można sobie ich działanie odpowiednio skojarzyć. Nauczysz się wykrywać wycieki pamięci za pomocą valgrind
, a co za tym idzie dobrze pamięcią zarządzać.
Zobaczysz jak np. dynamiczna alokacja pamięci za pomocą malloc
i free
w C wyewoluowała do postaci new
i delete
w C++ aż po gołe new
w językach wysokiego poziomu. Przekonasz się na własne oczy czym grozi przesyłanie wielkich obiektów przez wartość zamiast przez wskaźnik. Tego w językach wysokopoziomowych nie widać, bo np. klasa jest tam z definicji typem referencyjnym. Mnóstwo jest zalet takiej nauki.
Dla mnie np. było to fascynujące.
Napisz na priv.
Ewentualnie pogadamy na irc I polecę Ci to i owo.
Pzdr.
Podbijam, od jakich książek/ materiałów warto zacząć naukę języka C ? Może wątek już trochę umarł, więc myślę iż warto odświeżyć :)
Ozymandias napisał(a):
Podbijam, od jakich książek/ materiałów warto zacząć naukę języka C ? Może wątek już trochę umarł, więc myślę iż warto odświeżyć :)
Zamiast pobijać, wystarczy przeczytać wyżej napisane odpowiedzi...
Podałem tam link -> https://pl.wikibooks.org/wiki/C
A ja polecę (już po raz n-ty) klasyk tzn https://helion.pl/ksiazki/jezyk-ansi-c-programowanie-wydanie-ii-brian-w-kernighan-dennis-m-ritchie,jansic.htm
Dziękuję :)
Kacpib18 napisał(a):
I drugie pytanie czy język C pomaga w nauce innych języków?
Trochę pomaga, trochę przeszkadza. C niestety uczy myśłenia o wielu bzdurkach, które nie są istotne dla programowania w językach wysokiego poziomu.
Do dzisiaj mam alergię na kod w C++ pisany przez programistów C. (wskaźniki i makra).
(A kiedyś widziałem nawet trochę takiej javy).
Do programowania w języku C niezbędny jest Linux ?
Ozymandias napisał(a):
Do programowania w języku C niezbędny jest Linux ?
Dziękuję :)
Poza tym, że C++ jest trudniejszy od C jakie ma zalety w porównaniu do czystego C? Gdybym chciał napisać program typu AIMP w QT i go sprzedawać to muszę zapłacić za licencje QT5? A w GTK mogę wszystko robić za darmo? Wiem, że jeszcze jest hybryda GTK+ do pisania C z klasami i obiektowo, oraz GTKMM do pisania w C++. A wieloplatformowa biblioteka graficzna wxWidgets 3 też wymaga opłaty licencyjnej?
https://helion.pl/ksiazki/programowanie-wieloplatformowe-z-c-i-wxwidgets-3-bartosz-w-warzocha,e_17vd.htm#format/e
prototype napisał(a):
Poza tym, że C++ jest trudniejszy od C jakie ma zalety w porównaniu do czystego C? Gdybym chciał napisać program typu AIMP w QT i go sprzedawać to muszę zapłacić za licencje QT5? A w GTK mogę wszystko robić za darmo? Wiem, że jeszcze jest hybryda GTK+ do pisania C z klasami i obiektowo, oraz GTKMM do pisania w C++. A wieloplatformowa biblioteka graficzna wxWidgets 3 też wymaga opłaty licencyjnej?
https://helion.pl/ksiazki/programowanie-wieloplatformowe-z-c-i-wxwidgets-3-bartosz-w-warzocha,e_17vd.htm#format/e
XD
C jest mniej rozbudowanym jezykiem (prostszym?) ale cos sensownego trudniej napisac
prototype napisał(a):
Poza tym, że C++ jest trudniejszy od C jakie ma zalety w porównaniu do czystego C? Gdybym chciał napisać program typu AIMP w QT i go sprzedawać to muszę zapłacić za licencje QT5? A w GTK mogę wszystko robić za darmo? Wiem, że jeszcze jest hybryda GTK+ do pisania C z klasami i obiektowo, oraz GTKMM do pisania w C++. A wieloplatformowa biblioteka graficzna wxWidgets 3 też wymaga opłaty licencyjnej?
https://helion.pl/ksiazki/programowanie-wieloplatformowe-z-c-i-wxwidgets-3-bartosz-w-warzocha,e_17vd.htm#format/e
Tak w skrócie to: wyjątki, lambdy, szablony(i co za tym idzie cały STL czyli inteligentne wskaźniki, kontenery, algorytmy, string, wątki, system plików, etc.)
Dlaczego C++ wydaje się trudniejszy od C? Bo 99% kursów w internecie uczy, C++ zaczynając od C.
Jeśli pominąć bardziej zaawansowane właściwości języka C++ to C++ jest łatwiejszy od C dla początkujących, co można zobaczyć dlaczego tak jest tutaj.
Ogólnie C odwołuje się do problemów JAK coś zrobić. Zbudowanie w nim abstrakcji które przedstawiają strawne dla człowieka struktury algorytmów/rozwiązań/modułów/... obiektów, wymaga wysiłku w trakcie którego ginie często pierwotna idea i cel rozwiązania. Z kolei C++ odwołuje się do rozwiązań CO należy zrobić. W przypadkach gdy jest to konieczne (np. wydajność, właściwości platformy...), umożliwia odwołanie się do rozwiązań JAK. Przy dobrym podejściu, w C++ nie ginie ogólny obraz rozwiązania i o wiele bardziej zrozumiale komunikowane są intencje.
O wiele rozsądniejsze jest nauczenie się nowoczesnego C++ i dopiero później poszerzenie kompetencji o C. W przypadku możliwego wyboru, zawsze w projektach staram się preferować C++ nad C. Nawet dla systemów embedded.
Oczywiście w każdym z tych języków da się pisać czytelny i wydajny kod. W C jest to jednak trudniejsze i IMHO wymaga znajomości innych języków (choćby i C++) aby zrozumieć jakie konsekwencje ma nieczytelne tworzenie aplikacji.
Poza tym, warto w każdym roku poznawać nowy język programowania. To niesamowicie podnosi kompetencje nawet w tym w którym lubisz (lub jesteś zmuszony(a)) pracować.
Mokrowski napisał(a):
Ogólnie C odwołuje się do problemów JAK coś zrobić. Zbudowanie w nim abstrakcji które przedstawiają strawne dla człowieka struktury algorytmów/rozwiązań/modułów/... obiektów, wymaga wysiłku w trakcie którego ginie często pierwotna idea i cel rozwiązania. Z kolei C++ odwołuje się do rozwiązań CO należy zrobić. W przypadkach gdy jest to konieczne (np. wydajność, właściwości platformy...), umożliwia odwołanie się do rozwiązań JAK. Przy dobrym podejściu, w C++ nie ginie ogólny obraz rozwiązania i o wiele bardziej zrozumiale komunikowane są intencje.
O wiele rozsądniejsze jest nauczenie się nowoczesnego C++ i dopiero później poszerzenie kompetencji o C. W przypadku możliwego wyboru, zawsze w projektach staram się preferować C++ nad C. Nawet dla systemów embedded.
Oczywiście w każdym z tych języków da się pisać czytelny i wydajny kod. W C jest to jednak trudniejsze i IMHO wymaga znajomości innych języków (choćby i C++) aby zrozumieć jakie konsekwencje ma nieczytelne tworzenie aplikacji.
Poza tym, warto w każdym roku poznawać nowy język programowania. To niesamowicie podnosi kompetencje nawet w tym w którym lubisz (lub jesteś zmuszony(a)) pracować.
Oczywiście, że się z tobą nie zgadzam.
Po piesze jak ktoś mi pisze CO vs JAK to od razu mi się otwiera szufladka "Języki imperatywne vs języki deklaratywne", a C
i C++
to są języki imperatywne, czyli takie, gdzie się opisuje jak coś zrobić.
Po drugie w C
owszem trzeba dbać o więcej szczegółów i jest więcej dziergania, które w C++ dostaje się za darmo (np RAII, polimorfizm), ale to wcale nie oznacza, że w C nie da się pisać bardziej abstrakcyjnie. Oczywiście, że się da i ludzie to robią.
Jedyny problem to nauczyć się dobrego stylu programowania i go przestrzegać. Z nieznanych mi powodów panuje przekonanie, że w C trzeba pisać długie zawiłe funkcje i że tak ma wyglądać właśnie kod w C.
Podstawowa przewaga C++ nad C to, że C++ zapewnia tani niezawodny i prosty w użyciu polimorfizm, zarówno ten dynamiczny (funkcje wirtualne) jak i statyczny (szablony). W C też się da zrobić polimorfizm, ale jest trudne w napisaniu i utrzymywaniu.
Klasyczny przykład polimorfizmu w C to sterownik IO. Żeby można korzystać z takiego sterownika, musi on zapewnić 5 funkcji: open
close
seek
read
write
, które mają ściśle określone prototypy.
MarekR22 napisał(a):
Oczywiście, że się z tobą nie zgadzam.
Po piesze jak ktoś mi pisze CO vs JAK to od razu mi się otwiera szufladka "Języki imperatywne vs języki deklaratywne", aC
iC++
to są języki imperatywne, czyli takie, gdzie się opisuje jak coś zrobić.
Po drugie wC
owszem trzeba dbać o więcej szczegółów i jest więcej dziergania, które w C++ dostaje się za darmo (np RAII, polimorfizm), ale to wcale nie oznacza, że w C nie da się pisać bardziej abstrakcyjnie. Oczywiście, że się da i ludzie to robią.
Jedyny problem to nauczyć się dobrego stylu programowania i go przestrzegać. Z nieznanych mi powodów panuje przekonanie, że w C trzeba pisać długie zawiłe funkcje i że tak ma wyglądać właśnie kod w C.Podstawowa przewaga C++ nad C to, że C++ zapewnia tani niezawodny i prosty w użyciu polimorfizm, zarówno ten dynamiczny (funkcje wirtualne) jak i statyczny (szablony). W C też się da zrobić polimorfizm, ale jest trudne w napisaniu i utrzymywaniu.
Klasyczny przykład polimorfizmu w C to sterownik IO. Żeby można korzystać z takiego sterownika, musi on zapewnić 5 funkcji:open
close
seek
read
write
, które mają ściśle określone prototypy.
Oczywiście zgadzam się że ze mną się nie zgadzasz ba.. nawet będę zobowiązany :) I to nawet bez skupienia się jaka szufladka Ci się otwiera. Zwróć uwagę, napisałem że w każdym języku da się pisać czytelnie a do CO/JAK użyłem "ogólnie". Bez odnoszenia się do paradygmatu proceduralny kontra deklaratywny. C ma mniej narzędzi i trudniejszych w użyciu by cel "CO" w kodzie osiągnąć a narzędzia te w większym stopniu bazują na wiedzy o platformie którą powinna posiadać osoba programująca. Wiedza ta, jak sądzę, powinna być (w wielu przypadkach) złożona na barki kompilatora i bibliotek. Czego w mojej ocenie C (vide np. obsługa stringów, automatyczne promocje do int czy float do double, ubogie i żle zaprojektowane przestrzenie nazewnicze, konieczność masowego stosowania makr w bardziej wymagających przypadkach, dalej nie rozwiązany problem precyzyjnej definicji typów atomowych) nie robi zadowalająco.
Wymaganie "to się naucz dobrze i czytelnie programować", to nie jedyny wymiar. Ważny, zgoda.. ale nie jedyny. W mojej ocenie, za daleko idące uproszczenie. Często decyduje szybsze i czytelniejsze osiągnięcie efektu przy takim samym kodzie runtime i zrozumienie intencji przez inne osoby "świeże w projekcie". A tu nowoczesne C++ oferuje już widoczne benefity tak w systemach głównego nurtu jak i embedded. Także co do "szczelniejszego" obsługiwania typów które w C trzeba uzupełniać idiomami (np. opakowanie enum strukturą by osiągnąć uszczelnienie typu i usunięcie nazwy elementu enum z przestrzeni nazewniczej, podpieranie się rozszerzeniem kompilatora by uzyskać offset do struktury mając wskaźnik na pole, itp.. ), oraz jaśniejsze i łatwiejsze przekazanie intencji ze strony programującego do kompilatora bez sztuczek void * (uproszczenie).
Dziś z perspektywy embedded w C++ polimorfizm dynamiczny, nie jest aż tak istotny (platformy classic) w porównaniu do elastycznego stosowania szablonów. Na a co do szablonów, C nie ma nic co może pomóc w generowaniu kodu (nie... makra nie....). Statyczny polimorfizm, jak najbardziej w C++ przydatny (pomijając problemy jakie generuje przy utrzymaniu stabilnego ABI)
Stąd jeśli mam wybór, wybieram C++ a nie C. Jeśli go nie mam, programuję w C stosując abstrakcje które o wiele łatwiej tak osiągnąć jak się i ich nauczyć, w innych językach.
Osobiście żałuję że najpierw uczyłem się C a nie C++. Stracił bym miej czasu gdyby kolejność była odwrotna :-)