Rozważam naukę C.
Nie ma konkretnego powodu, aby nie uczyć się C, ale sugerowałbym C ++. Oferuje wiele z tego, co robi C (ponieważ C ++ jest super zestawem C), z dużą ilością „dodatków”. Nauka języka C przed C ++ jest niepotrzebna - są to właściwie oddzielne języki.
Innymi słowy, gdyby C był zestawem narzędzi do obróbki drewna, prawdopodobnie byłby to:
- młot
- paznokcie
- Piła ręczna
- wiertło ręczne
- szlifierka blokowa
- dłuto (może)
Za pomocą tych narzędzi możesz zbudować wszystko - ale wszystko, co miłe, wymaga dużo czasu i umiejętności.
C ++ to kolekcja elektronarzędzi w lokalnym sklepie z narzędziami.
Jeśli zaczniesz korzystać z podstawowych funkcji językowych, C ++ ma stosunkowo niewielką dodatkową krzywą uczenia się.
Ale dlaczego ludzie używają C (lub C ++), jeśli można go używać „niebezpiecznie”?
Ponieważ niektórzy ludzie nie chcą mebli od IKEA. =)
Poważnie, chociaż w wielu językach, które są „wyższe” niż C lub C ++, mogą występować elementy, które czynią je (potencjalnie) „łatwiejszymi” w niektórych aspektach, nie zawsze jest to dobra rzecz. Jeśli nie podoba ci się sposób, w jaki coś się robi lub funkcja nie jest zapewniona, prawdopodobnie niewiele możesz z tym zrobić. Z drugiej strony C i C ++ zapewniają wystarczająco dużo funkcji języka „niskiego poziomu” (w tym wskaźników), aby można było uzyskać dostęp do wielu rzeczy bezpośrednio (szczególnie sprzętowo lub pod względem systemu operacyjnego) lub zbudować je samodzielnie, co może nie być możliwe w innych języki jak zaimplementowane.
Mówiąc dokładniej, C ma następujący zestaw funkcji, które sprawiają, że jest pożądany dla wielu programistów:
- Szybkość - Ze względu na względną prostotę i optymalizacje kompilatora na przestrzeni lat jest natywnie bardzo szybki. Ponadto wiele osób wymyśliło wiele skrótów do konkretnych celów podczas korzystania z języka, co sprawia, że jest on potencjalnie jeszcze szybszy.
- Rozmiar - Z podobnych powodów, jak wymienione dla szybkości, programy C mogą być bardzo małe (zarówno pod względem rozmiaru wykonywalnego, jak i wykorzystania pamięci), co jest pożądane w środowiskach o ograniczonej pamięci (tj. Osadzonych lub mobilnych).
Kompatybilność - C istnieje już od dawna i każdy ma do tego narzędzia i biblioteki. Sam język również nie jest wybredny - oczekuje, że procesor wykona instrukcje, a pamięć zapisze rzeczy i tyle.
Ponadto istnieje coś takiego jak Application Binary Interface (ABI) . Krótko mówiąc, jest to sposób komunikowania się programów na poziomie kodu maszynowego, który może mieć zalety w stosunku do interfejsu programowania aplikacji (API) . Podczas gdy inne języki, takie jak C ++, mogą mieć ABI, zazwyczaj są one mniej jednolite (uzgodnione) niż C, więc C stanowi dobry język podstawowy, gdy z jakiegoś powodu chcesz użyć ABI do komunikacji z innym programem.
Dlaczego programiści nie używają tylko Java, Python lub innego skompilowanego języka, takiego jak Visual Basic?
Wydajność (i czasami schematy zarządzania pamięcią, których nie można wdrożyć bez względnie bezpośredniego dostępu do pamięci).
Bezpośredni dostęp do pamięci za pomocą wskaźników wprowadza wiele schludnych (zwykle szybkich) sztuczek, kiedy możesz umieścić swoje brudne łapy na małych i zerach w twoich komórkach pamięci bezpośrednio i nie musisz czekać, aż ten wredny nauczyciel wręcza zabawki po prostu w czasie zabawy, a następnie ponownie je zgarnij.
Krótko mówiąc, dodawanie rzeczy potencjalnie powoduje opóźnienie lub w inny sposób wprowadza niepożądaną złożoność.
Jeśli chodzi o języki skryptowe i podobne, musisz ciężko pracować, aby języki wymagające programów pomocniczych działały tak skutecznie, jak natywnie C (lub dowolny skompilowany język). Dodanie tłumacza w locie z natury wprowadza możliwość zmniejszenia prędkości wykonywania i zwiększenia zużycia pamięci, ponieważ dodajesz inny program do miksu. Wydajność programów zależy w równym stopniu od wydajności tego dodatkowego programu, jak również od tego, jak dobrze (źle =)) napisałeś oryginalny kod programu. Nie wspominając o tym, że twój program jest często całkowicie zależny od drugiego programu, aby nawet go uruchomić. Ten drugi program z jakiegoś powodu nie istnieje w danym systemie? Kod nie idź.
W rzeczywistości wprowadzenie czegoś „dodatkowego” potencjalnie spowalnia lub komplikuje kod. W językach „bez przerażających wskaźników” zawsze czekasz na inne fragmenty kodu, które wyczyszczą się za tobą lub w inny sposób wymyślisz „bezpieczne” sposoby wykonywania różnych czynności - ponieważ Twój program nadal wykonuje te same operacje dostępu do pamięci, jakie można wykonać za pomocą wskaźniki Po prostu nie jesteś tym, który się tym zajmuje (więc nie możesz tego pieprzyć, geniusz = P).
Przez niebezpieczne rozumiem wskaźniki i inne podobne rzeczy. [...] Jak pytanie o przepełnienie stosu Dlaczego funkcja gets jest tak niebezpieczna, że nie należy jej używać?
Zgodnie z przyjętą odpowiedzią:
„Pozostał oficjalną częścią języka aż do standardu ISO C z 1999 r., Ale został oficjalnie usunięty przez standard z 2011 r. Większość implementacji języka C nadal go obsługuje, ale przynajmniej gcc wydaje ostrzeżenie dla każdego kodu, który go używa”.
Myśl, że ponieważ coś można zrobić w języku, musi być zrobione, jest głupie. Języki mają wady, które można naprawić. Ze względu na kompatybilność ze starszym kodem ta konstrukcja może być nadal używana. Ale nic (prawdopodobnie) nie zmusza programisty do użycia get (), a tak naprawdę to polecenie zostało zasadniczo zastąpione bezpieczniejszymi alternatywami.
Co więcej, problem z get () nie jest sam w sobie problemem ze wskaźnikiem . Jest to problem z poleceniem, które niekoniecznie wie, jak bezpiecznie korzystać z pamięci. W sensie abstrakcyjnym są to wszystkie problemy ze wskaźnikami - czytanie i pisanie rzeczy, których nie powinieneś. To nie jest problem ze wskaźnikami; jest to problem z implementacją wskaźnika.
Aby wyjaśnić, wskaźniki nie są niebezpieczne, dopóki przypadkowo nie uzyskasz dostępu do miejsca w pamięci, do którego nie miałeś zamiaru. I nawet wtedy nie gwarantuje to, że komputer się stopi lub wybuchnie. W większości przypadków twój program po prostu przestanie działać (poprawnie).
To powiedziawszy, ponieważ ponieważ wskaźniki zapewniają dostęp do lokalizacji w pamięci oraz ponieważ dane i kod wykonywalny istnieją razem w pamięci, istnieje realne niebezpieczeństwo przypadkowego uszkodzenia, aby można było właściwie zarządzać pamięcią.
Do tego momentu, ponieważ prawdziwie bezpośrednie operacje dostępu do pamięci często przynoszą ogólnie mniej korzyści, niż mogły to być lata temu, nawet języki nieskradzione, takie jak C ++, wprowadziły takie elementy, jak inteligentne wskaźniki, które pomagają wypełnić lukę między wydajnością pamięci a bezpieczeństwem.
Podsumowując, nie ma powodu, aby obawiać się wskaźnika, o ile jest on bezpiecznie używany. Wystarczy skorzystać z podpowiedzi z wersji Steve'a „The Crocodile Hunter” Irwina z South Park - nie chowaj kciuka w otworach krokodyli .