Jestem programistą front-end, który ledwo nawet zobaczyć plik .h
lub .c
rozszerzenie. Znam podstawową składnię C, nauczyłem się jej w Unreality, ale nigdy nie byłem zainteresowany tak niskim poziomem programowania, ponieważ był to po prostu zbyt duży zestaw ustawień dla prostych rzeczy.
Jestem bardzo zainteresowany nauką wszystkich aspektów informatyki, ale chcę wierzyć, że tak naprawdę nie muszę znać konkretnego języka, aby zrozumieć większość pojęć z informatyki. Jednak kiedy zaczynam czytać książki i artykuły na temat podstawowych pojęć z zakresu informatyki, takich jak struktury danych i projektowanie algorytmów, wydaje się, że muszę się nauczyć języka C, ponieważ wszystkie przykłady, a nawet lekcje są w języku C (a czasem Java).
Moje pytanie brzmi: czy C jest językiem programowania niezbędnym dla informatyki, czy akurat mieliśmy wszystkie nasze zasoby w CS napisane w C? Czy można nauczyć się informatyki bez nauki języka C?
źródło
Odpowiedzi:
Mam zamiar pójść pod prąd i powiedzieć tak, musisz się nauczyć C. Właściwie zgadzam się z punktami wielu innych odpowiedzi, ale bardzo mocno stwierdzasz, że
(moje podkreślenie)
Cóż, systemy operacyjne i stosy sieciowe są dwoma ogromnymi aspektami informatyki, a wszystkie dominujące systemy operacyjne i stosy sieciowe są napisane głównie w C. Jeśli chcesz je zrozumieć, powinieneś się nauczyć C. Tak, niektóre szkoły potrafią uczyć ich klasy OS w Javie, ale to jak czytanie Homera po angielsku.
Poza tym C nie jest aż tak duży. Jeśli naprawdę chcesz nauczyć się wszystkich aspektów informatyki, powinieneś wzruszyć ramionami i powiedzieć „meh”, „jaki jest jeszcze jeden język?”.
źródło
Przez bardzo długi czas, w czasach, gdy informatyka była nauką, a nie powołaniem, istniało kilka ograniczonych możliwości wyboru języka, który działałby na wszystkich systemach używanych przez wszystkie uniwersytety.
Zdecydowanie uniwersytety używają systemów uniksowych. Dogodnie, zostało to zaprogramowane w C. Można zacząć od nauki C na dowolnej maszynie, a ostatecznie dostać się do kodu źródłowego unix w C. W domu studenci mogą korzystać z kompilatora C, takiego jak Borland Turbo C w systemie Windows lub MPW na Mac - działało wszędzie.
Pascal był inną opcją, ale miał problem polegający na tym, że w pewnym momencie programowania nie wystarczyło języka do robienia tego, co naprawdę trzeba zrobić (programowanie systemu operacyjnego w pascal byłoby bolesne).
Niektóre starsze szkoły uczyły się Fortranu, ale znowu, w wielu przypadkach nie był to wystarczająco mocny język, aby móc uczyć klas CS na wyższym poziomie (teoria AI w fortranie? Wykonalne, ale bolesne).
I tak przez długi czas C był wyborem.
Nie jest to jedyny wybór, a obecnie istnieje wiele szkół, które uczą w innych językach, aby przeglądać niektóre elementy wewnętrzne i uczyć się koncepcji wyższego poziomu bez konieczności radzenia sobie z brzydotą zarządzania pamięcią i tym podobne. Niektórzy uważają, że to dobrze, inni uważają , że to źle .
Więc nie, nauka C nie jest niezbędna do nauki informatyki. Możesz znaleźć wiele innych książek, które uczą informatyki z Javy lub Pythona. Po prostu C przez długi czas był wyborem, a książki akademickie poruszały się powoli.
źródło
Przyznaję, że można dostać dobrze płatną pracę i być produktywnym bez dotykania C, ale gorąco polecam naukę C każdemu, kto poważnie myśli o solidnym zrozumieniu informatyki.
Chociaż informatyka dotyczy pojęć, których można nauczyć się niezależnie od konkretnego języka programowania, istnieją dziedziny, które można lepiej zrozumieć, ucząc się języka C lub ucząc się tego pola za pomocą języka C.
Algorytmy i struktury danych. Standard C prawie nie ma żadnego z nich - posiadanie go już w języku lub w jego standardowej bibliotece może być demotywacyjne dla studentów: „ Dlaczego miałbym zawracać sobie głowę wdrażaniem czegoś łatwo dostępnego?„Patrząc na kawałek kodu C, od razu widać jego koszt algorytmu, ponieważ wszystko w C kompiluje się tylko do kilku instrukcji maszynowych. Języki wysokiego poziomu (np. Perl lub Python) często używają zaawansowanych struktur danych pod maską lekkiej składni. Kod wydaje się lekki, ale nim nie jest. Potrzebujesz już dużej wiedzy, aby poprawnie zrozumieć złożoność algorytmiczną tych fragmentów kodu. Dlatego te języki nie są odpowiednie do uczenia się algorytmów i struktur danych oraz wielu programistów, którzy zawsze żyli w językach wysokiego poziomu, zwykle nie są w stanie poradzić sobie z problemami związanymi z wydajnością, kiedy się na nie napotkają.
System operacyjny. Większość systemów operacyjnych jest napisanych w C. Jak chcesz zrozumieć proces tworzenia bez wywoływania
fork
? Warstwa abstrakcji wirtualnej maszyny Java nie jest tutaj pomocna. A samo mówienie o tym bez tworzenia procesu jest jeszcze gorsze ... Jak napisać oprogramowanie takie jak Eclipse, które może przekierować standardowe wyjście do jednego z jego okien? Musisz zrozumieć koncepcje na poziomie systemu operacyjnego i możesz dotknąć tych bezpośrednio tylko w C.Pośrednictwo Nie możesz zrobić C bez radzenia sobie ze wskaźnikami. Wskaźniki zmuszają cię do myślenia na dwóch poziomach, a to rozciąga twoje umiejętności abstrakcji.
Istnieją również pewne zalety techniczne wiedzy w języku C:
Interoperacyjność między językami. Chcesz zintegrować świetny moduł Ruby z projektem Pythona (zamień tutaj dwa dowolne języki). Są szanse, że jedynym sposobem na to jest przejście przez C, ponieważ oba języki mają obcy interfejs do C.
Pisanie oprogramowania krytycznego dla wydajności. Aby tego dokonać, nie można pominąć przejścia na niższy poziom.
Nie twierdzę, że każdy program powinien być napisany w C. Ale C może ci pomóc w poznaniu, co jest przydatne w każdym języku, w którym programujesz.
źródło
Zamierzam tu również podważyć ziarno i spróbować stworzyć (nieco humorystycznie) estetyczny przypadek dla C. Podczas gdy niektórzy ludzie mogą nazwać to „brzydkim” z różnych powodów, takich jak brak konstrukcji wyższego poziomu, takich jak klasy lub opierając się na wskaźnikach, uważam, że tak nie jest w moim przypadku .
TL; DR : Moim zdaniem C jest proste, dobre C jest czytelne i jest pewna radość z walenia w bity.
C jest proste
Standard C definiuje tylko kilka podstawowych typów i mechanizmów do tworzenia z nich funkcji, wskaźników i tablic. Ponadto istnieje niewielka liczba konstrukcji kompozycji, dzięki którym z prymitywów można tworzyć bardziej złożone typy (takie jak struktury i związki). Zwróć uwagę, jak opisałem większość języka w dwóch zdaniach. Oznacza to, że nie musisz trzymać zbyt wielu reguł składni w formularzu podczas pisania.
Proste jest piękne .
C nie jest tajemny
W przeciwieństwie do wielu języków wyższego poziomu, trudno byłoby znaleźć wiele dziwnych, niezrozumiałych symboli w C. W świecie C główną funkcją zarówno abstrakcji, jak i „kompresji syntaktycznej” jest funkcja - semantycznie bardzo prosta i konstrukcja objaśniająca. Dobry styl C zachęca do niemal poetyckiego, czytelnego piękna. Aby to zilustrować, spróbujmy przeczytać poniższy fragment kodu z jądra systemu Linux. Nawet bez znajomości podstawowych struktur danych i szczegółów implementacyjnych możemy wiele zrozumieć:
Środek funkcji brzmi „w mało prawdopodobnym przypadku, gdy prąd zamarza, zapytaj lodówkę, czy rzeczywiście nastąpiło zamrożenie”. Dr Seuss nie mógł tego lepiej napisać.
Czytelny jest piękny .
C jest przezroczysty
O ile instrukcja C nie zawiera wywołania funkcji, ogólnie można bardzo dobrze zrozumieć jej koszt w czasie wykonywania i skutki uboczne. C daje programistom kontrolę i ostatecznie ufa mu, że zrobi właściwą rzecz. Możemy uzyskać obraz tego, co się dzieje, gdy ten (nieco przeformatowany dla SE) fragment kodu z implementacji
strlen()
w bibliotece GNU C działa, ponieważ każdy operator ma dobrze zdefiniowaną semantykę. W C. nie ma przeciążeniaDla celów „optymalizacji” ta właściwość jest świetna. Prawdopodobnie niektóre języki wyższego poziomu ułatwiają zwięzłe wyrażanie algorytmów wyższego poziomu (np. C ++ z klasami i przeciążeniem), ale do celów C zaprojektowano - działając jako przenośny asembler - C jest idealny. Czasami po pomyślnym wykonaniu kodu niskiego poziomu programista może poczuć się z maszyną w pewnym sensie (lub zero - to szczegół implementacji). Nie oznacza to, że inne języki są złe, niewystarczająco „zenowe” lub coś głupiego, tylko że IMO C może być interesujące w sposób, w jaki wiele innych języków zdecydowało się nie być, z wielu ważnych powodów.
Moim zdaniem, trzy przedstawione powyżej punkty umożliwiają zarządzanie złożonymi - ale wydajnymi - systemami, które w moim umyśle są realizowane przez Linuksa. Uważam, że ten świat przemawia do mojej wrażliwości estetycznej i radziłbym każdemu, kto uważa C za swój kolejny cel, aby rozważył te kwestie. Uważam, że argumenty na temat systemów operacyjnych i innych nie są lepiej wspierane przez jawne ich podanie, ponieważ z pewnością nie trzeba rozumieć jąder, aby odnieść sukces jako programista, ale można by uznać te pola za subiektywne.
źródło
Język programowania używany do omawiania nauki o komputerach jest w dużej mierze nieistotny dla zadania uczenia się środków i nauki o komputerach.
(Prawdopodobnie) przełomowa praca nad informatyką, The Art of Computer Programming , nie używa żadnego istniejącego języka do informowania o tym temacie. Zamiast tego Donald Knuth postanowił zdefiniować fikcyjny komputer i fikcyjny język maszynowy (i powiązany język asemblera), w ramach którego omawia wszystkie tematy.
Inna wysoko ceniona praca na ten temat, Struktura i interpretacja programów komputerowych , przyjęła podobne podejście, opracowując uproszczony dialekt języka programowania LISP, aby działał jako własny kontekst. Ten język jest obecnie znany jako Scheme.
Kolejna bardzo dobra praca w dziedzinie informatyki, elementy systemów komputerowych (która w rzeczywistości jest równa części inżynierii komputerowej i informatyki, i bardzo krótko), przyjmuje bardziej fundamentalne podejście do nauczania logiki cyfrowej, na podstawie której buduje maszynę, narzędzia i język, zanim nauczą elementarnej informatyki.
Więc nie, C nie jest konieczne do zrozumienia informatyki. Liczy się zrozumienie podstawowych pojęć algorytmów i ich zastosowania.
źródło
Karierę programistyczną rozpocząłem od nauki vb3 z podręczników dostarczonych wraz z dyskietkami. Nauczyłem się trochę języka java i byłem w stanie stworzyć pewne godne uwagi programy, ale dopiero po studiach C na uniwersytecie poczułem, że naprawdę rozumiem, co się dzieje „pod maską”. Teraz pracuję tylko z .net i nigdy tak naprawdę nie martwię się o wskaźniki, nieprawidłowe adresy lub przepełnienia - ale rozumiem je, to informuje o decyzjach, które podejmuję na co dzień, a niektóre ze starych rzeczy szkolnych wciąż są dostępne w nowoczesnych językach interpretowanych, flagach , nieco mądre operacje, logika logiczna, wszystkie potężne narzędzia i bardzo wydajne.
Naucz się C. To zapewni ci dobrą pozycję. Przez lata trzymałem kopię podręcznika programistów c i czytałem Kernighana i Ritchie od deski do deski. Nie ma znaczenia, jaki język skończysz pracując ze zrozumieniem C na pewno pomoże.
źródło
Odpowiedź brzmi tak. Mam dyplom z CS i nie musiałem uczyć się C, ale Java. Przynajmniej w mojej szkole nacisk położono na naukę programowania obiektowego, z pewnymi naukami na temat języka asemblera, struktur danych i projektowania baz danych.
źródło
To naprawdę zależy od tego, co chcesz zrobić z tym, czego się uczysz. Zdecydowanie jest prawdą, że wiele algorytmów podano w C lub jego potomkach. Jednak z biegiem lat widziałem więcej przykładów C ++, C # i Java. To, czego CS ma uczyć, to ogólne rozumienie komputerów, a zatem jak wybrać lub stworzyć język odpowiedni do danego zadania.
Jednak wciąż jest wiele osób, których pierwszym i ostatnim językiem jest jakaś odmiana języka C lub Java, i nie wszyscy z nich przejdą szkolenie w celu zrozumienia dowolnego języka zapewnianego przez dyplom CS. Nawet niektórzy absolwenci CS mają problemy z programowaniem. Dlatego może być konieczne odpowiednie zrozumienie tych języków, z którymi można się z nimi komunikować, w zależności od ścieżki kariery. Jeśli planujesz pozostać w środowisku akademickim, będziesz mieć jeszcze więcej barier językowych dla treści, szczególnie w obszarach interdyscyplinarnych (gdzie ludzie używają prologu, seplenienia, haskellu, matematyki itp.)
źródło
Jeśli naprawdę chcesz nauczyć się „wszystkich aspektów informatyki” (ambitny plan!), Musiałbyś poradzić sobie z kilkoma różnymi językami asemblera i co najmniej jednym HDL (i ćwiczyć w nim kodowanie na poziomie netlisty).
I jako krok na wyższym poziomie, aby zbliżyć się do tych naprawdę fundamentalnych rzeczy, będziesz musiał wybrać coś takiego jak C lub Pascal, jest to nieuniknione. Pomijanie kroków na drabinie abstrakcji przynosi efekt przeciwny do zamierzonego.
W każdym razie wątpię, czy warto o to zapytać. W końcu C to tylko mały język. Mógłbyś nauczyć się jego podstaw w krótszym czasie niż tracić, zastanawiając się, czy musisz nauczyć się C, czy nie.
źródło