Wraz z pojawieniem się systemu UNIX w latach siedemdziesiątych XX wieku jego standardowy język programowania systemów C szybko stał się lingua franca w świecie programowania. Przez długi czas C był praktycznie obowiązkowy dla każdego programisty. W związku z tym fakt, że C wpłynął na prawie każdy język programowania, który pojawił się po nim w taki czy inny sposób, nie jest zaskakujący z dwóch powodów:
- Projektując nowy język, warto oprzeć swoją składnię, tam gdzie to możliwe, na popularnym istniejącym języku, który można założyć powszechnie znanym.
- Nowy język ma większe szanse powodzenia, jeśli krzywa uczenia się jest płytka, a składnia przypomina już znany język jest ogólnie łatwiejszy do nauczenia (chyba że zachowuje się radykalnie inaczej pomimo widocznych podobieństw). Zatem języki, które zapożyczają składnię z C, generalnie zyskują na znaczeniu szybciej niż te, które jej nie mają.
Ale inne języki istniały i nadal tak jest, niektóre nawet starsze niż C – są rodzina LISP (CL, Clojure i Scheme to najpopularniejsze współczesne dialekty), rodzina ML (z kilkoma współczesnymi dialektami), istnieje cała armia dialektów BASIC (VB.NET i VBA to nowoczesne implementacje), jest Pascal i jego krewniacy (najbardziej znany jest język Delphi) oraz wiele „dziwacznych” języków, które wywarły wpływ na wiele innych języków i same wynalazły kilka rzeczy; przykłady obejmują Go, Python, Lua, Haskell (i jego poprzednik, Miranda), Prolog i Erlang. Chociaż żaden z tych języków (z wyjątkiem Pythona) nie znajduje się w pierwszej dziesiątce, wiele z nich ma stabilną bazę użytkowników i aktywną społeczność; z pewnością nie znikną.
Ponadto należy zauważyć, że wpływ języka C w tych językach jest bardzo różny, począwszy od języków C ++ i Objective-C, które są prawie w 100% kompatybilne z językiem C, do Python (który celowo rezygnuje z wielu funkcji składni języka C). I to tylko składnia: jeśli chodzi o semantykę, większość języków na tej liście nie ma wiele wspólnego z C. Przeważająca większość ma wbudowane zarządzanie pamięcią w język, a co za tym idzie, semantykę kopiowania, przekazywanie argumentów, itp. są bardzo różne. Na przykład JavaScript ma silne wpływy semantyczne ze Scheme, podczas gdy jego składnia została zaprojektowana tak, aby przypominać Javę (która z kolei opiera swoją składnię typu bit-and-piece na C, ale nie na semantyce). Inne różnice (z wyjątkiem C ++ i Objective-C, które są w większości kompatybilne wstecz z C) obejmują obsługę błędów, reguły zakresu, biblioteki standardowe, dołączanie kodu zewnętrznego (#include
), i fakt, że wiele z tych języków jest „zwirtualizowanych”, to znaczy działają one na interpreterze, kompilatorze JIT lub maszynie wirtualnej.
Nawiasem mówiąc, Python ma pewien wpływ na język C, ale z pewnością nie jest „oparty na” C. Zarówno składnia, jak i semantyka różnią się dość radykalnie od języka C i jest to zamierzone. Python pożycza funkcje tylko z C, gdzie inne alternatywy są równie „dobre” (zgodnie z „Zen of Python” – wpisz import this
w interpreterze Pythona).
Jeśli chodzi o przyszłość programowania; prognozy są różne. Wpływ C nie znika, ale ostatnie zmiany w sprzęcie (maszyny wielordzeniowe stają się powszechne, wydajne GPU, procesor przestaje być typowym wąskim gardłem wydajności, szybkie niezawodne połączenia sieciowe itp.) Wymagają radykalnie różnych podejść do programowania w ogóle.Każdy, kto kiedykolwiek napisał wielowątkową aplikację rozproszoną w języku imperatywnym, może stwierdzić, że jest to niezwykle trudne, podczas gdy języki takie jak Haskell mają funkcje, które usuwają większość typowych problemów i oferują bardziej abstrakcyjne i bardziej uporządkowane podejście do rozproszonego, współbieżnego i przetwarzanie równoległe (czystość jest ważną koncepcją w tym kontekście). Nowsze języki programowania (np. C # lub D) już zawierają wiele funkcji obsługujących taki idiom. W każdym razie ani silny wpływ C wywarł na programowanie, ani istnienie języki inne niż C znikają.
Komentarze
Jeśli tworzysz nowy język programowania, posiadanie składni podobnej do popularnych istniejących języków ułatwia naukę nowym użytkownikom. Zwłaszcza jeśli wiele pojęć jest podobnych w różnych językach.
Uważam również, że składnia w stylu C jest stosunkowo łatwa do odczytania. Dla porównania z Pascalem, użycie symboli „{” i „}” dla bloków kodu jest bardziej czytelne niż „początek” i „koniec”, które są optycznie bardzo podobne do identyfikatorów. Python jest jeszcze bardziej czytelny, ale włączenie białych znaków do składni otwiera nowy zestaw problemów z edycją. Inny przykład: Lisp i JavaScript mają kilka pomysłów, ale kiedy to samo jest napisane w składni w stylu C, jest mniej niejasne.
Jestem pewien, że wiele osób nie zgodziłoby się z drugim akapitem, ponieważ każdy ma swój ulubiony język, ale myślę, że popularność składni w stylu C jest częściowo historycznym zbiegiem okoliczności, ale częściowo pokazuje również, że autorzy C podjęli kilka dobrych decyzji.
Języki programowania ewoluują w czasie, podobnie jak języki naturalne, przy czym niektóre starsze języki wpływają na tę ewolucję silniej niż inne , podczas gdy inne znikają w zapomnieniu, a ich wpływ trudniej jest prześledzić na poziomie powierzchni, to znaczy na składni.
Wpływ C pochodzi z wielu źródeł – jest niski, powszechny, miał poparcie zarówno w kręgach Unix, jak i Microsoft. Jest to także przetrwanie najlepiej przystosowanego problemu – łatwo zauważyć, że zwięzła składnia podobna do języka C była bardziej atrakcyjna niż rozwlekła składnia Pascala i innych konkurentów języka C w latach 70. i 80. XX wieku. W związku z tym został on szeroko przyjęty przez języki, które pojawiły się po nim.
Przy obecnym wzroście znaczenia programowania wielowątkowego i szczególnie dobrze do niego przystosowanych języków funkcjonalnych, powiedziałbym, że ich wpływ wzrośnie w przyszłość. Przykład: Python, który nawet umieścił tę listę w poście z pytaniem.
Ładny widok historii języka na osi czasu do rozważenia
Komentarze