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.