Nie znam C. A dlaczego mam się tego uczyć? [Zamknięte]

58

Moim pierwszym językiem programowania był PHP ( westchnienie ). Potem zacząłem pracować z JavaScript. Niedawno wykonałem pracę w C #.

Nigdy nie patrzyłem na języki niskiego lub średniego poziomu, takie jak C.

Ogólny konsensus w społeczności programistów na ogół jest taki, że „programista, który nie nauczył się czegoś takiego jak C, szczerze mówiąc, po prostu nie jest w stanie poradzić sobie z koncepcjami programowania, takimi jak wskaźniki, typy danych, przekazywanie wartości przez referencje itp.”

Nie zgadzam się. Twierdzę, że:

  1. Ponieważ języki wysokiego poziomu są łatwo dostępne, więcej „nieprogramiści” nurkuje i robi bałagan
  2. Aby naprawdę cokolwiek zrobić w języku wysokiego poziomu, należy zrozumieć te same podobne pojęcia, o których głosi większość zwolenników „nauki od pierwszego poziomu”.

Niektórzy ludzie muszą znać C; osoby te mają zadania wymagające od nich pisania kodu niskiego do średniego. Jestem pewien, że C jest niesamowity i jestem pewien, że jest kilku złych programistów, którzy znają C.

Dlaczego stronniczość? Jako dobry, uczciwy i głodny programista, gdybym musiał uczyć się języka C (z jakiegoś nieprzewidzianego powodu), uczyłbym się C. Biorąc pod uwagę różnorodność języków, czyż dobrzy programiści nie powinni koncentrować się na nauce tego, co nas rozwija? Czy nie powinniśmy dowiedzieć się, co nas interesuje? Czy nie powinniśmy wykorzystywać naszego skończonego czasu do robienia postępów ? Dlaczego niektórzy programiści się z tym nie zgadzają?

Uważam, że dążenie do doskonałości w tym, co robisz, jest podstawową deterministyczną cechą dobrych i złych programistów.

Czy ktoś ma jakieś przykłady z tego, jak coś napisanego w języku wysokiego poziomu - na przykład Java, Pascal, PHP lub JavaScript - naprawdę skorzystało z wcześniejszej znajomości języka C? Przykłady byłyby bardzo mile widziane.

Stephen
źródło
@Stephen Oh, przepraszam ... źle zrozumiałem. (ale rozumiesz, dlaczego musisz nauczyć się języka c / c ++, prawda?)
ApprenticeHacker
1
@burningprodigy Tak, w przypadku, gdy muszę zrobić coś, co wymaga C / C ++ lub ma sens, oczywiście, że bym się uczył. C. Moja wołowina jest z ludźmi, którzy twierdzą, że musisz nauczyć się C, aby móc skutecznie rozwijać w językach wysokiego poziomu. I to jest absurdalne.
Stephen
@burningprodigy kontynuujmy tę dyskusję na czacie
Stephen
czy możesz podać nam kontekst (url), z którego pochodzi „nie mogę poradzić sobie z takimi pojęciami programistycznymi jak wskaźnik ...”?
k3b
Jeśli byłby jeden język, którego chciałbym się nauczyć, byłby to Common Lisp, a nie C. Jako główny programista C #, jestem raczej pewien, że skorzystałbym z niego więcej. Mamy już wskaźniki w języku C #. Przeważnie wolę nauczyć się więcej sposobów podejścia do problemu, niż trudniej wdrożyć to samo rozwiązanie. (Dla przypomnienia, na wpół kłamię. Zrobiłem trochę C i wiem, że ma to swoje zalety. Chciałem tylko przypisać niesamowicie mocny i wyrazisty język, który wyprzedził C o dekadę.)
Mag

Odpowiedzi:

113

Zaletą znajomości języka C jest to, że masz bardzo dobre pojęcie o działaniu komputera. Nie tylko sposób działania modelu programowania, ale także sposób rozmieszczenia pamięci i tym podobne.

Jedynym poziomem poniżej C jest zestaw mówiony przez konkretny procesor.

(Dodam, że znajomość języka C pozwala również docenić, ile mniej pracy musisz wykonać w języku wyższego poziomu. Mam nadzieję, że docenisz koszty związane z pracą w tym języku wyższego poziomu.)

Frank Shearar
źródło
12
Frank: Uderzyłeś się w głowę. Zrozumienie, jak działa komputer, zarządzanie pamięcią i alokacja wraz z pomysłem, że możesz docenić języki wyższego poziomu, jest powodem do nauki C. Mam szczęście, że musieliśmy nauczyć się C, aby wdrożyć projekty klasowe, takie jak implementacja podstawowej warstwy TCP przez UDP .
Chris
12
Zgadzam się z tym, chociaż: C przybliża cię tylko kilka kroków do korzeni traw, a nie do samej ziemi. Ok, istnieje coś takiego jak układ pamięci. Ale co to znaczy fizycznie? Czy rozumiesz, jak działa komputer, jeśli nie rozumiesz elektroniki? Mechanika kwantowa? I tak dalej. Nie jestem pewien, czy istnieje jeden umysł na świecie, który głęboko rozumie cały łańcuch pokarmowy od języka wysokiego poziomu, poprzez C, aż po mechanikę kwantową.
Joonas Pulakka
14
Moje pytanie brzmi: w jaki sposób możesz zyskać wiedząc, jak komputer działa wewnętrznie? Co zyskujesz Docenienie tego, co masz teraz, nie jest bardzo dobrym powodem do nauki języka bardzo niskiego poziomu, takiego jak C. To jak mówienie, że powinienem nauczyć się Fortran, aby docenić to, co mam teraz
TheLQ
18
@TheLQ Jestem oniemiały. Jak możesz zyskać wiedząc, jak komputer działa wewnętrznie? Zyskujesz lepsze zrozumienie tego, co robisz, zyskujesz. Raczej: przede wszystkim uczysz się, co właściwie robisz na maszynie.
Frank Shearar
15
Oznaczę to jako poprawne, ponieważ wydaje się to ulubioną odpowiedzią. To powiedziawszy, tak naprawdę nie obchodzi mnie „jak działa komputer” na podstawowym poziomie, ponieważ tak naprawdę nie pomaga mi to opracować kolejnej fajnej funkcji mojej aplikacji. To jak prowadzenie samochodu: jestem w tym bardzo dobry, ale nie obchodzi mnie, jak działa ciśnienie płynu hamulcowego. Po prostu przestaje, kiedy nacisnę hamulec. Jestem też pewien, że bardziej doceniłbym prowadzenie samochodu, gdybym musiał jeździć konno przez pięć lat. Nie znaczy to, że nie jestem w stanie postulować, o ile lepsze rzeczy mają samochód, a nie buggy.
Stephen
72

Nie sądzę, żeby którekolwiek z tych odpowiedzi były tym, czego szukał PO, więc rzucę swoją własną opinię.

Słuchaj, jestem nieapologicznym snobem C. Podejrzewam, że jeśli nie znasz C, to do pewnego stopnia tak naprawdę nie wiesz, co robisz jako programista. Więc myślę, że jestem rodzajem „stronniczej” osoby, o której tu mówisz.

Jednak w praktyce to, czy naprawdę wiesz, co robisz jako programista, niekoniecznie uniemożliwia ci tworzenie naprawdę niesamowitego, użytecznego oprogramowania przy użyciu narzędzi wysokiego poziomu. Twórca Stack Overflow, Jeff Atwood, najwyraźniej nawet nie zna C, a mimo to powiedziałbym, że Stack Overflow to całkiem dobra aplikacja internetowa.

To, czy zdecydujesz się na naukę języka C (lub C ++ lub asemblera), zależy od tego, jakim typem programisty chcesz być. Jeśli chcesz po prostu tworzyć fajne aplikacje internetowe lub aplikacje biznesowe, to w porządku - nie musisz naprawdę uczyć się C. Ale jeśli chcesz naprawdę wyróżniać się tym, co robisz - jeśli chcesz pracować nad naprawdę fajnymi projektami, które popychają stan sztukę, wtedy naprawdę musisz wziąć się na poważnie jako programista, aby naprawdę zrozumieć, jak działają komputery. Ponieważ C jest zasadniczo lingua franca systemu operacyjnego, a także językiem, który obsługuje prawie wszystko inne (od jądra Linuksa do większości maszyn wirtualnych Java, interpreterów języka Python i Ruby, baz danych SQL, serwerów sieciowych i niemal każdego sterownika urządzenia) , intymne rozumienie języka ma długą drogę.

Nie wspominając o tym, że znajomość C (lub C ++) stwarza ogromną szansę na udział w dużych projektach open source, które wpływają na miliony (lub setki milionów) ludzi. Chcesz popracować nad ulepszeniem interpretera języka Python lub przeglądarki internetowej Chromium? Cóż, musisz znać C dla pierwszego i C ++ dla drugiego.

Dlatego porównywanie C do martwych języków naturalnych, takich jak łacina lub przestarzałe technologie, takie jak koń i powóz, jest całkowicie błędne. Duża część naszej infrastruktury oprogramowania XXI wieku jest oparta na kodzie C, dlatego C jest dziś tak samo ważny jak zawsze.

To, czy powinieneś nauczyć się języka C, zależy od tego, czego chcesz od kariery programisty.

Charles Salvia
źródło
5
Nie brzmisz tak snobistycznie. Okej, może trochę. :)
Stephen
7
Doskonała odpowiedź. Programowałem z powodzeniem przez dziesięć lat, nie ucząc się C i C ++, i mógłbym przejść resztę kariery bez nauki. Ale odkąd nauczyłem się tego w zeszłym roku, napisałem lepsze oprogramowanie, nie tylko w C ++, ale także w innych językach.
John M Gant,
3
Oto kilka rzeczy, które inny twórca SO ma do powiedzenia na temat znajomości C: joelonsoftware.com/articles/ThePerilsofJavaSchools.html joelonsoftware.com/articles/CollegeAdvice.html joelonsoftware.com/articles/fog0000000319.html
Isaac Kleinman
3
Dlaczego porównywanie C z łaciną byłoby „całkowicie błędne”? Myślę, że to doskonała analogia. Łacina jest wszędzie wokół nas. 58% słownictwa angielskiego jest pod wpływem łaciny (bezpośrednio lub przez inne języki romańskie). Łacina ma również klucz do zrozumienia naszej kultury. Prawo, demokracja, religia, infrastruktura, urbanistyka i szereg innych dziedzin można prześledzić od czasów Cesarstwa Rzymskiego. Możesz zignorować C w taki sam sposób, jak możesz zignorować łacinę, ale nigdy nie możesz ich uniknąć. „Łacina i greka nie są martwymi językami. Po prostu przestały być śmiertelne”. (JW McKail)
Anders Sjöqvist
2
@ AndersSjöqvist, byłoby źle, ponieważ nikt już nie mówi po łacinie, mimo że wywarł on głęboki wpływ na rozwój współczesnych języków. Podczas gdy C jest aktywnie używany i używany wszędzie - w prawie każdym systemie operacyjnym, maszynie wirtualnej, bazie danych lub tłumaczu. Łacina jest bardziej jak, powiedzmy ... Simula - w większości martwy język, który wywarł głęboki wpływ na żywe języki, ale nie jest używany poza środowiskiem akademickim.
Charles Salvia,
12

Praktyczną zasadą jest to, że musisz zrozumieć co najmniej jeden poziom abstrakcji poniżej tego, w którym zwykle pracujesz. Weź pod uwagę, że Twój interpreter PHP lub JavaScript może być faktycznie zaimplementowany w C lub C ++. W końcu trafisz na błąd interpretera lub nawet błąd czasu wykonania C. Jeśli nie rozumiesz C, ograniczysz się do wysłania raportu o błędzie do opiekuna, mając nadzieję, że będą w stanie go odtworzyć i się tym zająć, a następnie przekręć kciuki. Jeśli znasz C, możesz dokładnie powiedzieć, gdzie jest problem i na czym on polega.

Oznacza to również, że jeśli pracujesz w C / C ++, powinieneś przynajmniej móc czytać asembler na swojej platformie.

Jeśli chodzi o naukę C, gdy jej potrzebujesz: moja obserwacja jest taka, że ​​większość programistów może uczyć się Perl / Python / JavaScript na żądanie, ale wydaje się, że asembler / C / Lisp wymaga dużo więcej czasu, więc warto nauczyć się przynajmniej kilku podstaw, zanim zajdzie taka potrzeba powstaje.

Charles E. Grant
źródło
9
Ok, „C / C ++” Mogę mieszkać (prawnicy językowi niech będą przeklęci). A „Perl / Python / JavaScript” jest całkowicie rozsądne. Ale na miłość boską, dlaczego „asembler / C / Lisp”? To tak, jakby powiedzieć „jabłko / pomarańcza / Barrack Obama”. Te trzy języki nie mają ze sobą nic wspólnego.
Jason Baker
@Jason, jedyną wspólnością, którą sugerowałem, jest to, że większość ludzi uważa, że ​​trio języków jest trudniejsze do zdobycia w locie, więc może warto poświęcić trochę czasu OP, aby spędzić z nimi trochę czasu, zanim pojawi się natychmiastowa potrzeba ich użycia. Arytmetyka wskaźnikowa i programowanie funkcjonalne nie mają ze sobą wiele wspólnego, z wyjątkiem tego, że ludzie wydają się patrzeć na nich dłużej, zanim zaczną mieć sens.
Charles E. Grant,
Nie mogłem się więcej zgodzić. Idąc w drugą stronę, na wyższy poziom abstrakcji, „biurowy facet / galówka”, który potrafi przynajmniej trochę programować, zwykle jest lepszy niż ten, który nie potrafi.
Emmet
7

Nie zgadzam się, że trzeba się uczyć C pierwszy , ale wierzę trzeba nauczyć C końcu . Wszystkie abstrakcje są nieszczelne, a zrozumienie C ułatwia zrozumienie tego, co naprawdę się dzieje, gdy używasz fantazyjnej abstrakcji na wysokim poziomie. To powiedziawszy, myślę też, że wszyscy poważni programiści powinni w końcu nauczyć się przynajmniej czytać asemblera, z tego samego powodu.

Poznanie koncepcji niskiego poziomu daje zaskakującą umiejętność rozumowania rzeczy na wysokim poziomie. Na przykład w C ++ i D domyślne argumenty funkcji wirtualnych są określane przez typ statyczny (czas kompilacji) obiektu, a nie typ dynamiczny (środowisko wykonawcze). Nie ma to sensu, chyba że zrozumiesz, jak działają tabele i konwencje wywoływania oraz dlaczego niezwykle trudno byłoby wdrożyć funkcje wirtualne w odwrotny sposób.

dsimcha
źródło
2
Naucz się czytać może język asemblera. Problem polega na tym, że mam ponad 10 różnych rodzin procesorów, których używam, a poznanie wszystkich bardzo różnych wariantów jest receptą na zamieszanie i chaos. Spróbuj porównać AMD SHARC z Atmel AVR32 i TI MSP430.
u
@Ian: Racja. Idealnie powinieneś nauczyć się języka asemblera dowolnego łuku, dla którego najbardziej się rozwijasz. Dla większości ludzi będzie to x86 lub ARM.
dsimcha
3
„wszyscy poważni programiści powinni w końcu nauczyć się przynajmniej czytać asemblera”. To dzięki takim komentarzom zacząłem od tego pytania. Myślę, że pan jest po prostu stronniczy. Chociaż podoba mi się to, co powiedziałeś o nieszczelnych abstrakcjach. To ma sens. Z drugiej strony, te rzeczy nie robią dużej różnicy w „prawdziwym świecie” na mojej arenie. Nadal używam abstrakcji wysokiego poziomu, nieszczelnej czy nie.
Stephen
1
@Stephen, powinieneś spróbować napisać język asemblera. 8-bitowe procesory nie są trudne, a próba zaimplementowania tej samej małej rzeczy zarówno w 6502 (jak C64), jak i Z80 (jak maszyny biznesowe CP / M) jest w rzeczywistości bardzo pouczająca doświadczenie z powodu bardzo podstawowych różnic projektowych (strona indeksu a rejestry).
+1 pomimo rażąco fałszywego All abstractions are leakystwierdzenia.
Thomas Eding,
7

Bias ma charakter status quo. W dawnych czasach (lata 80. i wcześniejsze) C / C ++ był prawie wymagany dla aplikacji wydajnościowych. To się zmieniło, ale starsi programiści zazwyczaj pochodzą z tego starego skoolskiego środowiska i widzą rzeczy w tym kontekście.

Do faktycznego programowania używane inne języki - C # jest popularny, podobnie jak Java, podczas gdy PHP i Python są popularne w projektach wewnętrznych i zawsze przydatne jest mieć pod ręką kogoś z przynajmniej podstawową wiedzą w tej dziedzinie, w przypadku wyboru otwartego źródłowy projekt PHP dla, powiedzmy, twojego systemu śledzenia błędów. Jednak specyfikacje stanowisk nadal wydają się pochodzić ze standardowego szablonu, który został napisany 25 lat temu.

JohnL
źródło
6
„specyfikacje stanowisk wciąż wydają się pochodzić ze standardowego szablonu, który został napisany 25 lat temu”. Nie możesz być bardziej poprawny.
Stephen
Gratulacje, John!
Mark C
6

Mimo że nie lubię publikować obowiązkowego wpisu na blogu Joela, zgadzam się z nim tutaj . C to lingua franca programowania. Nie mogę wymyślić żadnego języka wysokiego poziomu, który jakoś nie mógłby się z nim komunikować. Z tego powodu C jest nadal popularnym wyborem do programowania systemów. Po prostu nie można interfejsować z niektórymi rzeczami na poziomie systemu operacyjnego bez C.

Poza tym, co planujesz zrobić, gdy Twój język wysokiego poziomu nie jest wystarczająco szybki? Umiejętność pisania w C jest szczególnie ważna, gdy używasz języka wysokiego poziomu, dynamicznie wpisywanego, takiego jak Ruby, Python lub PHP. Ale nawet programiści Java i C # muszą od czasu do czasu zejść do C.

Jason Baker
źródło
lol. Porada Joelsa w kolumnie z linkiem: „Lepiej zignoruj ​​to, co tu mówię, i zamiast tego zbuduj coś w rodzaju oprogramowania online, które pozwoli innym uczniom znaleźć ludzi, z którymi można umówić się na randkę”.
Stephen
3
@ Stephen: Jeśli chcesz, aby ludzie naprawdę cię zauważyli, zdobądź je albo opłacone.
Fred Nurk
@Fred Świetna rada, lol.
Stephen
6

Co za wielki ślimak! (Jak podobno mówią: Czy to prywatna walka, czy ktoś może się przyłączyć?)

Byłem profesorem i odkryłem (po kilku próbach i błędach), że o wiele łatwiej było poprowadzić uczniów przez skomplikowane koncepcje programowania, jeśli rozumieli na poziomie podstawowym, co robi komputer. Nie we wszystkich szczegółach, ale podstawową zasadą, jak pamięć, instrukcje, itp. To, co lubię w C, to bliskość maszyny.

Nie oznacza to, że inni nauczyciele przybyli w to samo miejsce. Zaczęli od języka wysokiego poziomu (BASIC :-) i stamtąd ruszyli naprzód, bez widocznych efektów ubocznych.

Podsumowując, Stephen, możesz mieć rację. Nie sądzę, ale wcześniej się myliłem.

Mike Dunlavey
źródło
4

To chyba postęp.

Dwadzieścia lat temu tradycyjna mądrość polegała na tym, że trzeba było uczyć się asemblera, aby zrozumieć, co zyskujesz z języków wyższego poziomu, takich jak C (dlatego musiałem wziąć udział w zajęciach asemblera na studiach przy użyciu VAX Macro; zgadnij, jak przydatne jest to, że okazało się po ukończeniu studiów).

Przesąd jest taki, że ponieważ C jest nieco trudny do nauczenia i że nie zapewnia prawie żadnych abstrakcji (wskaźniki i strumienie bajtów to w zasadzie), uczenie się go w jakiś sposób uczyni cię lepszym programistą lub da ci lepszy wgląd w to, jak rzeczy działają na sprzęcie poziom.

To niekoniecznie jest prawdą. Standard C nie zbliża cię do metalu bardziej niż jakikolwiek inny 3GL (Pascal, Fortran itp.). Niektóre implementacje języka C mogą zapewniać zaczepy, które zapewniają większy dostęp do niektórych obszarów, ale ogólnie nagie wskaźniki są tak blisko, jak to tylko możliwe, co wcale nie jest blisko. Nie można na przykład bezpośrednio uzyskać dostępu do rejestrów lub słów statusu.

Ostatecznie wszystko sprowadza się do kodów poleceń i trybów adresowania, więc jeśli naprawdę interesujesz się tym, jak rzeczy działają na niższym poziomie, lepiej przyswojone nauczenie się asemblera nad C.

Samo uczenie się C nie musi (koniecznie) uczynić cię lepszym programistą. Z pewnością jednak doceni rzeczywiste typy łańcuchów i znormalizowane biblioteki kontenerów.

John Bode
źródło
Myślę, że „uznanie” jest jednym ze sposobów na wyrażenie tego. Na mojej lekcji programowania w szkole średniej były to głównie pytania: „Muszę korzystać z tej funkcji. Jak przekonwertować LOLOMGCHAR * na WTFBBQCHAR *?”
Katana314,
myślę, że C był łatwy do nauczenia. przynajmniej dla mnie było to, że po prostu przeczytałem Kernighana i Ritchiego.
robert bristow-johnson
2

Język to narzędzie. Jeśli musisz pisać tylko strony internetowe i tym podobne, jestem pewien, że możesz uciec bez konieczności uczenia się języka C, w ten sam sposób, że jeśli kiedykolwiek stworzysz plastikowe modele, potrzebujesz tylko ostrego noża i kleju, a Klucz nie jest zwykle wymagany.

Piszę kod dla systemów osadzonych z bardzo ograniczonymi zasobami pamięci (największe, jakie ostatnio zrobiłem, to 16 KB, a to było OGROMNE) Na tym rynku C lub asembler są jedynymi opcjami i żaden z puszystych języków wyższego poziomu po prostu nie działa.

uɐɪ
źródło
1
To świetnie ... Ale nie wszyscy tak robią. Wydaje się, że implikacje są takie, że ludzie, którzy nie piszą dla systemów wbudowanych, po prostu grają i nie robią poważnego rozwoju - przynajmniej biorąc analogię modelu w kontekście punktu dotyczącego systemów wbudowanych. Wyraźnie tak nie jest i możliwe jest pisanie aplikacji produkcyjnych na dużą skalę bez dotykania C.
JohnL
Oczywiście można pisać aplikacje produkcyjne na dużą skalę bez zbliżania się do C. Napisałem kod przez 10 lat, zanim zacząłem używać C. Użyłem PL / M, Pascal, ADA oraz asemblera. Były one tak dobre jak C do nauki podstawowych mechanizmów maszyny, a często lepsze do tworzenia wolnego od błędów kodu.
u
Świetnie - choć powyższa odpowiedź nie
sprawiała
Czy masz jakieś doświadczenie z silnikami Java ukierunkowanymi na użycie wbudowane?
2

Z mojego doświadczenia wynika, że ​​przez pewien czas C / C ++ był dobrym buforem, który oddzielał dobrych programistów od koderów VB6. Po pięciu latach pracy w C / C ++ dostałem pracę w VB6. Byłem zaskoczony jakością (lub jej brakiem) koderów. Nie interesowali się odwagą języka, designem ani wydajnością. Niestety, kiedy firma przeniosła się do .Net, kodery C / C ++ i .Net korzystały z tych samych narzędzi. Kodery VB były jeszcze gorszymi koderami VB.Net. Sytuacja pogorszyła się, gdy wszystkie prace rozwojowe przeszły do ​​ASP.NET. Nagle każdy, kto mógł przeciągnąć i upuścić kontrolkę, był programistą.

Jednak na rynku pracy nie było wiele do odróżnienia od hardkorowych programistów (ex C / C ++) i turystów.

Jako takie, posiadanie C lub C ++ w twoim CV może pomóc ci odróżnić cię od riff-raff.

Dave
źródło
2

Proktywnie zadane: Czy pytasz o potwierdzenie, że nie musisz uczyć się języka C? Jeśli nauczysz się czystego C (niekoniecznie C ++), zrozumiesz dokładnie model wykonania komputera. Zwłaszcza o pamięci i przydziale. Te rzeczy mają również znaczenie dla osób programujących w językach wyższego poziomu.

Dla programisty PHP jest to po prostu mniej przejrzyste, w jaki sposób kod jest wykonywany na danym komputerze. Może to nie mieć znaczenia dla programisty PHP, ponieważ transfer sieciowy jest szyjką butelki w aplikacji itp.

Zwykły PHP / Python / C # ma wiele warstw abstrakcji między językiem a procesorem. warstwy te są tak grube, że nie pozwalają ci przez nie patrzeć. Kiedy nauczysz się języka C, między tobą a procesorem i systemem operacyjnym jest cienki arkusz. To nie czyni programowania łatwiejszym (i może nawet nie być lepszym). Ale tak naprawdę możesz nauczyć się, jak działa procesor. Gdy poznasz „pośrednie” C, możesz zacząć łączyć tę wiedzę w górę z językiem wyższego poziomu. Jest to bezpośrednia korzyść, którą zyskasz.

Moim zdaniem programista powinien zawsze poświęcić trochę czasu na naukę różnych koncepcji programowania. Na pewno warto przyjrzeć się C, ale także spojrzeć na języki programowania na wyższym poziomie, takie jak Clojure, Haskell, Prolog.

Nie musisz stać się mistrzem w nich, po prostu nauczą cię, że „poziomy” języków programowania nie są binarne, ale istnieje wiele poziomów. Poznaj je od góry do dołu (asembler). To sprawi, że będziesz lepszym programistą.

wirrbel
źródło
2

Musisz znać wystarczająco dużo C, aby odczytać kod napisany w C, z powodu ogromnej ilości bardzo ważnego kodu napisanego w języku. To wszystko, co powstrzymasz się od dokładnego przejrzenia szczegółowego podręcznika na ten temat (użyłem „programowania w C” Kochana) bez faktycznego pisania kodu w języku. Jeśli kiedykolwiek znajdziesz się w sytuacji wymagającej intensywnego używania języka, będziesz miał dobrą bazę do dalszego rozwoju. Prawdopodobnie chcesz studiować coś w rodzaju książki Duntemanns, jeśli maszyna jest dla ciebie zniekształconą czarną skrzynką. Polecam także „Kod” Petzolda.

Poza tym - podstawowa znajomość języka C i podstawowa znajomość podstawowej maszyny - najlepiej byłoby spędzić czas nauki na prawdziwych rzeczach, takich jak SICP, TCP / IP Illustrated lub książki na temat konkretnej matematyki, algorytmów lub struktury danych . Prawdziwe rzeczy.

Poświęcenie dużo czasu na naukę C podczas pisania kodu w PHP po prostu nie jest warte kosztu alternatywnego. Jest więcej pomocnych rzeczy do nauczenia się. C to naprawdę kolejny język, którego można się dobrze uczyć tylko poprzez naukę i używanie, ale można go nauczyć, kiedy trzeba.

Pocić twarde rzeczy.

naftalimich
źródło
1

C jest językiem używanym do pisania w innych językach. To pozwala zbliżyć się do procesora i innego sprzętu, jak chcesz.

Jeśli nie znasz C, nie wiesz, w jaki sposób inne języki osiągają wyniki, które osiągają.

Abstrakcja jest oczywiście ważną koncepcją i nie wszyscy muszą wiedzieć, w jaki sposób ich ramy wyboru pozwalają osiągnąć obiecane wyniki. Nie musisz tracić 20 lat na pisanie w C, a nawet na myślenie o tym, co stanie się z twoimi vtables, kiedy używasz wielokrotnego dziedziczenia, aby pisać dobry kod.

Teraz możesz prowadzić samochód, nie rozumiejąc, jak działa silnik 4-suwowy, a nawet nie będąc w stanie używać dźwigni zmiany biegów (manualna skrzynia biegów).

Jeśli jednak zrozumiesz, co dzieje się pod maską, od czasu do czasu będziesz w stanie osiągnąć wyjątkowe wyniki, które ktoś bez tej wiedzy będzie miał trudności z odtworzeniem.

Bill Michell
źródło
1

C (i prawdopodobnie C ++) to morze, w którym pływasz. System operacyjny, który uruchomi Twój kod, jest prawdopodobnie zakodowany w C (i C ++). Tak więc twój natywny API do uzyskiwania dostępu do usług systemu operacyjnego będzie w C.

Jeśli możesz to zrobić, nie wiedząc, co tam jest poniżej, nie musisz znać C. Jednak większość programistów musi kiedyś zejść na niższe poziomy.

Opiera się również na specjalizacji obszarów rozwoju. Na przykład programista WWW, który pisze HTML, JavaScript i niektóre skrypty po stronie serwera, może nigdy nie musi wiedzieć nic o C, ale program rozproszony lub twórca gier to zrobi.

Nigdy nie boli spędzać kilka tygodni na nauce czegoś tak podstawowego dla swojego zawodu.

Mert Akcakaya
źródło
1

C ma wiele zalet:

  1. C to język niskiego poziomu. Możesz użyć c, aby rozwinąć jądro i sterownik.
  2. C jest najszybszym językiem. Na przykład: memcached, redis, nginx, apache, mysql itp.
  3. C jest językiem wieloplatformowym. Program opracowany przez c może działać na każdej platformie. Inne języki wieloplatformowe nie mogą tego zrobić. Java, Python, PHP itp. Nie mogą działać na platformie iOS.
  4. C ++ nie może działać w wielu systemach osadzonych.
Edward Shen
źródło