Czy nauka języka C jest niezbędna dla informatyki? [Zamknięte]

15

Jestem programistą front-end, który ledwo nawet zobaczyć plik .hlub .crozszerzenie. 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?

Mohsen
źródło
4
Oto opinia Joela Spolsky'ego na ten temat: joelonsoftware.com/articles/CollegeAdvice.html Jest dyskusyjna , ale myślę, że ma on swoje zdanie .
Dok. Brown
2
Puryści twierdzą, że informatyka nie dotyczy komputerów, co czyni języki programowania niepotrzebnymi.
Blrfl,
1
Co rozumiesz przez „informatykę”? To, co opisujesz, to głównie część inżynierii oprogramowania w informatyce. Ponadto nie widzę, jak wszystkie zasoby są napisane w C. Przeczytałem sporo książek o algorytmach / strukturach danych i żaden nie używał C. Prawie wszystkie z nich używały jakiegoś języka pseudokodu, łatwo zrozumiałego dla wszystkich (no cóż, oprócz TAOCP, który wykorzystuje montaż ... ale to już inna historia)
Bakuriu
Nierealność? Czy miało to być dziwactwo autokorekty z uniwersytetu, czy może szkoła czarnej magii? Znam jednak Niewidziany Uniwersytet: [
Deer Hunter

Odpowiedzi:

31

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

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.

(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?”.

Charles E. Grant
źródło
Generalnie się z tym zgadzam, choć dla mnie „uczenie się” C oznacza, że ​​jestem zasadniczo wystarczająco biegły w języku, aby pisać w nim nietrywialne programy bez pomocy. Nie jestem pewien, czy ten poziom zrozumienia jest niezbędny dla systemów operacyjnych i programowania sieciowego.
Telastyn
3
@Telastyn: oznacza to, że jesteś wystarczająco biegły, aby zrozumieć i zmodyfikować kod systemu operacyjnego i kod sieci - domeny, w których używane jest C i to wszystko. Nie oznacza to, że musisz wiedzieć, jak pisać gry w C, tworzyć piękne interfejsy użytkownika i tworzyć aplikacje do tworzenia wykresów w C, grafiki lub silniki inteligencji maszynowej w C; ponieważ dla każdej innej domeny CS istnieją inne wybory językowe.
rwong
12

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
Dla przypomnienia, trening AI był tradycyjnie wykonywany z towarzyszem jaja C w latach 70. i 80., LISP, ale odpowiedź jest na głowie.
jwrush,
@jwrush moja odpowiedź brzmiała bardziej podobnie do tego, że możesz też uczyć się sztucznej inteligencji w C, w porównaniu do innych ówczesnych języków (nie LISP - i wziąłem klasę seplenienia w latach 90. dla AI). To prawda, że ​​MIT (dom jajogłowych) w tym czasie uczył wielu swoich klas w LISP - i była to z pewnością inna opcja, ale nie tak praktyczna w innych dziedzinach. W nauczaniu ważne było, aby pracować na tych samych podstawach w każdej klasie, aby nie musieć spędzić pierwszego tygodnia lub dwóch na uczeniu innego języka specjalizującego się w tej klasie.
12

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.

Miklós Homolya
źródło
Arytmetyka wskaźników ma kluczowe znaczenie dla zrozumienia systemów operacyjnych, ponieważ prowadzi do tego, dlaczego. Np. Dlaczego stosy i stosy są różne, dlaczego pamięć wirtualna działa dobrze lub źle, dlaczego niektóre pętle działają szybciej niż inne itp.
Michael Shopsin
6

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ć:

bool kthread_freezable_should_stop(bool *was_frozen)
{
    bool frozen = false;

    might_sleep();

    if (unlikely(freezing(current)))
        frozen = __refrigerator(true);

    if (was_frozen)
        *was_frozen = frozen;

    return kthread_should_stop();
}

Ś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ążenia

for (char_ptr = str; ((unsigned long int) char_ptr & (sizeof (longword) - 1)) != 0;
        ++char_ptr)

if (*char_ptr == '\0')
    return char_ptr - str;

Dla 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.

idoby
źródło
3

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.

greyfade
źródło
2

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.

Matt
źródło
1

Czy można nauczyć się informatyki bez nauki języka C?

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.

PhillyNJ
źródło
7
Czy jesteś pewien, że twój stopień naukowy obejmuje „ wszystkie aspekty” CS?
SK-logic
Powiedziałbym wszystkie niezbędne aspekty. Żaden stopień nie obejmuje wszystkich aspektów programu studiów. Plus „wszystko” jest subiektywne.
PhillyNJ,
1
Jak definiujesz „konieczne”? Wszystko jest wszystkim - co oznacza, że ​​obejmuje wszystkie możliwe aplikacje CS. To nie jest „subiektywne”, jest dość policzalne.
SK-logic
Definiuję „konieczny” w kontekście, że CS obejmuje naukę obliczeń i technologii komputerowej, sprzętu i oprogramowania, a nie żadnego konkretnego języka, który odpowiada na pierwotne pytanie.
PhillyNJ,
Ok, a jak zamierzasz pokryć sprzęt bez języków niskiego poziomu? Jak obejmiesz historię języków programowania (która jest wyjątkowo ważną częścią „wszystkich” CS) bez takiego języka? Jak obejmiesz semantykę języka programowania bez co najmniej jednego języka z arytmetyką wskaźników? Tak czy inaczej, ale język podobny do C musi być obecny w każdym kompleksowym programie CS.
SK-logic
0

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.)

jzx
źródło
-1

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.

Logika SK
źródło