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:
- Ponieważ języki wysokiego poziomu są łatwo dostępne, więcej „nieprogramiści” nurkuje i robi bałagan
- 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.
źródło
Odpowiedzi:
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.)
źródło
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.
źródło
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.
źródło
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.
źródło
All abstractions are leaky
stwierdzenia.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 są 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.
źródło
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.
źródło
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.
źródło
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.
źródło
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.
źródło
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.
źródło
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ą.
źródło
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.
źródło
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.
źródło
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.
źródło
C ma wiele zalet:
źródło