Dlaczego C wpływa na kilka popularnych języków programowania? [Zamknięte]


23

10 języków programowania, według indeksu TIOBE, wydaje się być pod silnym wpływem C:

1. Java

Język wywodzi się w dużej mierze ze składni C i C ++, ale ma prostszy model obiektowy i mniej udogodnień niskiego poziomu. - wikipedia.org

2. C.

C jest jednym z najczęściej używanych języków programowania wszech czasów i jest bardzo mało architektur komputerowych, dla których kompilator C nie istnieje. - wikipedia.org

3. C #

Podczas opracowywania systemu .NET Framework biblioteki klas zostały pierwotnie napisane przy użyciu systemu kompilatora kodów zarządzanych o nazwie Simple Managed C (SMC). W styczniu 1999 r. Anders Hejlsberg utworzył zespół w celu stworzenia nowego języka w tym czasie o nazwie Cool, co oznaczało „obiektowy język zorientowany obiektowo”. - wikipedia.org

4. C ++

Został on opracowany przez Bjarne Stroustrup od 1979 roku w Bell Labs jako rozszerzenie języka C. - wikipedia.org

5. Cel-C

Objective-C to refleksyjny, obiektowy język programowania, który dodaje wiadomości w stylu Smalltalk do języka programowania C. - wikipedia.org

6. PHP

Przepisał te skrypty jako pliki binarne Common Gateway Interface (CGI) języka programowania C, rozszerzając je, aby dodać możliwość pracy z formularzami internetowymi i komunikowania się z bazami danych, i nazwał tę implementację „osobistą stroną domową / interpretatorem formularzy” lub PHP / FI. - wikipedia.org

8. Python

Python został opracowany pod koniec lat 80., a jego wdrożenie rozpoczęło w grudniu 1989 r. Guido van Rossum w CWI w Holandii jako następca języka programowania ABC (sam zainspirowany przez SETL) zdolnego do obsługi wyjątków i współpracy z systemem operacyjnym Amoeba. - wikipedia.org

ABC (język programowania) Jego projektanci twierdzą, że programy ABC są zwykle około jednej czwartej wielkości równoważnych programów Pascal lub C i są bardziej czytelne. - wikipedia.org

9. Perl

Perl pożycza funkcje z innych języków programowania, w tym C, skryptów powłoki (sh), AWK i sed. - wikipedia.org

10. JavaScript

JavaScript używa składni, na którą ma wpływ C. - wikipedia.org

Wygląda na to, że większość z nich pożycza składnię od C i / lub jest pod silnym wpływem kilku innych sposobów, przynajmniej na początku. Czemu?


15
Posiadanie składni podobnej do c nie jest tym samym, co oparte na c.
Oded

15
Ponadto TIOBE to indeks śmieci.
DeadMG

3
Czy mogę raczej zapytać, dlaczego języki programowania oparte na C są bardziej popularne?
Manoj R

3
@YannisRizos Świetne ocalenie pytania! To naprawdę świetne pytanie.
wałek klonowy

16
Ponieważ C jest potomkiem ALGOLA, a ALGOL ma na celu blokowanie imperatywnego laboratorium tego, czym jest Abraham dla chrześcijan, Żydów i muzułmanów.
Ingo

Odpowiedzi:


40

Wraz z pojawieniem się UNIX w 1970 roku, jego standardowy język programowania systemów C szybko stał się lingua franca świata programowania. Przez pewien czas C było praktycznie obowiązkowe dla każdego programisty. Jako taki fakt, że C wpłynął na prawie każdy język programowania, który pojawił się po nim w ten czy inny sposób, nie jest zaskakujący z dwóch powodów:

  • Projektując nowy język, warto oprzeć jego składnię, tam gdzie to możliwe, na popularnym, istniejącym języku, który można przyjąć za powszechną wiedzę.
  • Bardziej prawdopodobne jest, że nowy język odniesie sukces, jeśli krzywa uczenia się jest płytka, a składnia podobna do znanego języka jest ogólnie łatwiejsza do nauczenia (chyba że zachowuje się radykalnie inaczej, pomimo pozornych podobieństw). Tak więc języki, które pożyczają składnię z C, na ogół zyskują przyczepność szybciej niż te, które tego nie robią.

Ale istniały inne języki, i nadal tak jest, niektóre nawet przed C - istnieje rodzina LISP (CL, Clojure i Schemat są najpopularniejszymi nowoczesnymi dialektami), rodzina ML (z kilkoma nowoczesnymi dialektami), jest cała armia Dialekty BASIC (VB.NET i VBA są nowoczesnymi implementacjami), jest Pascal i jego krewni (Delphi jest najbardziej znany) i wiele języków „dziwnych”, które wywarły wpływ na wiele innych języków i same wymyśliły kilka rzeczy; przykłady obejmują Go, Python, Lua, Haskell (i jego poprzednik, Miranda), Prolog i Erlang. Chociaż żadnego z tych języków (oprócz Pythona) nie ma w pierwszej dziesiątce, wiele z nich ma stabilną bazę użytkowników i aktywną społeczność; z pewnością nie odejdą.

Należy również zauważyć, że wielkość wpływu C w tych językach różni się bardzo, od prawie 100% kompatybilnych języków C C ++ i Objective-C, aż do Pythona (który celowo rezygnuje z wielu funkcji składniowych C). I to tylko składnia: pod względem semantyki większość języków na tej liście nie ma wiele wspólnego z C. Przytłaczają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 silny wpływ semantyczny ze Schematu, a jego składnia została zaprojektowana tak, aby przypominać Javę (która z kolei opiera swoją składnię bitów na kawałki na C, ale nie na semantykę). 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,#include) oraz fakt, że wiele z tych języków jest „zwirtualizowanych”, tzn. działają one na interpretera, kompilatorze JIT lub maszynie wirtualnej.

Nawiasem mówiąc, Python ma pewien wpływ na C, ale z pewnością nie jest oparty na C. Zarówno składnia, jak i semantyka różnią się dość radykalnie od C, i to z założenia. Python pożycza tylko funkcje z C, w których inne alternatywy są równie „dobre” (jak w „Zen of Python” - wpisz import thisinterpreter python).

Co do przyszłości programowania; prognozy są różne. Wpływ C nie ustępuje, ale ostatnie zmiany w sprzęcie (powszechne stają się maszyny wielordzeniowe, wydajne procesory graficzne, procesor przestaje być typowym wąskim gardłem wydajności, szybkie niezawodne połączenia sieciowe itp.) Wymagają radykalnie różnych podejść do programowania ogólnie. Każdy, kto kiedykolwiek napisał wielowątkową aplikację rozproszoną w imperatywnym języku, może powiedzieć, ż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 przetwarzania rozproszonego, współbieżnego i równoległego. (czystość jest ważną koncepcją w tym kontekście). Nowsze języki programowania (np. C # lub D) zawierają już wiele funkcji obsługujących taki idiom. W każdym przypadku,


Dobra odpowiedź, ale „Procesor przestaje być typowym wąskim gardłem wydajności”? Z mojego doświadczenia wynika, że ​​występują problemy z wydajnością - procesor, we / wy, nazywacie to. Jeśli nie, profilery nie byłyby potrzebne, nawet jeśli nie są bardzo skuteczne.
Mike Dunlavey

6
@MikeDunlavey: Zazwyczaj napotkane wąskie gardła są spowodowane przez operacje we / wy, sieci, wydajność pamięci podręcznej procesora, przepustowość magistrali i (nieefektywną) komunikację między procesami. W tamtych czasach procesor był niemal nieuchronnie wąskim gardłem; to po prostu nie jest już prawdą.
tdammers

1

To bardzo przypomina pytanie, dlaczego angielski jest dominującym językiem w USA. Dlaczego nie hiszpański lub francuski? Kontrolowali więcej terytorium USA niż kolonie angielskie. Dlaczego nie holenderski? Pierwsza stolica USA znajdowała się w byłej kolonii holenderskiej. Nie jestem pewien, czy może być na to „odpowiedź”.

Jednak oś czasu „Historia języków komputerowych” ( http://www.levenez.com/lang/ ) zawiera wszystkie możliwe odpowiedzi.


6
Ponieważ Wielka Brytania w latach 1600–1880 była z grubsza główną potęgą przemysłową i finansową świata, a następnie Stany Zjednoczone od 1880 r. (<- dyskusyjne). Stał się językiem międzynarodowego biznesu i jest używany płynnie przez ponad 2 miliardy ludzi na całym świecie. I nikt nie chce mówić po hiszpańsku ani po holendersku :)
maple_shaft

6
@maple_shaft - „nikt nie chce mówić po hiszpańsku” ?! ... czy w ogóle wiesz, w ilu krajach jest używany? en.wikipedia.org/wiki/Spanish_language
Rook

12
@ S.Lott: Masz na myśli tę część, w której Imperium Brytyjskie było największym imperium, jakie kiedykolwiek istniało i zajmowało 25% powierzchni całego świata? Tego rodzaju „niesilny”?
DeadMG

3
@DeadMG: Nie mówię o świecie. Mówię o USA w latach 1700, gdzie Francuzi obrzucili Brytyjczyków niewielkim obszarem wzdłuż wybrzeża. Mówię tylko o tym, że Brytyjczycy tracą zaangażowanie wojskowe tylko w tym teatrze. Francuzi wyraźnie kontrolowali większość tego, co stało się USA. Jeszcze. Stany Zjednoczone skończyły mówić po angielsku. Nie francuski Ta sama analiza dotyczy C. Jest to złożona historia z wieloma wpływającymi czynnikami. Nie ma trywialnej, szybkiej odpowiedzi.
S.Lott,

4
@ S.Lott Francuzi nie wygrali każdego pojedynku. Patrząc na Amerykę Północną, zdobyli większość; ale przegrana 4 z 5 głównych bitew w NA w latach 1559/60 spowodowała miażdżącą porażkę w teatrze. Zdobycie Fortu Ticonderoga i Niagary, Równin Abrahama oraz bitwa pod Restigouche były zwycięstwami Wielkiej Brytanii. Odcięcie podaży / wzmocnienia sprawiło, że zwycięstwo Francji w Sainte-Foy stało się nieistotne.
Dan Neely

0

Jeśli utworzysz nowy język programowania, zastosowanie składni podobnej do popularnych istniejących języków ułatwi uczenie się nowym użytkownikom. Zwłaszcza jeśli wiele pojęć jest podobnych w różnych językach.

Myślę też, że składnia w stylu C jest stosunkowo łatwa do odczytania. Aby porównać 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 w składni otwiera nowy zestaw problemów z edycją. Kolejny przykład: Lisp i JavaScript dzielą się kilkoma pomysłami, 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 zrobili kilka dobrych decyzje.


-1

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 zanikają, a ich wpływ jest trudniejszy do prześledzenia na poziomie powierzchni, czyli składni.

Wpływ C pochodzi z wielu źródeł - jest niski, szeroko rozpowszechniony, ma wsparcie zarówno w środowiskach Unix, jak i Microsoft. To także przetrwanie najsilniejszego problemu - łatwo zauważyć, że zwięzła składnia podobna do C miała większą atrakcyjność niż pełna składnia wywodząca się z Algolu Pascala i innych konkurentów C w latach 70. i 80. Dlatego został szeroko przyjęty przez języki, które pojawiły się po nim.

Przy obecnym wzroście znaczenia programowania wielowątkowego i językach funkcjonalnych, które są do niego szczególnie odpowiednie, powiedziałbym, że w przyszłości ich wpływ wzrośnie. Przykład: Python, który nawet stworzył tę listę w pytaniu.

Ładny widok osi czasu historii języka do przemyślenia


Źle to zrozumiałeś. Zarówno PASCAL, jak i C są potomkami ALGOLA.
Ingo

To prawda, ale sam Algol jest potomkiem Fortrana i wybrał niektóre konstrukty, o których tu mówiłem (program, koniec, podprogram w porównaniu do nawiasów c). Mimo to miałem na myśli składnię podobną do Algolu. Edytowany.
scrwtp

zwięzła składnia podobna do C była bardziej atrakcyjna niż pełna, wywodząca się z Algolu składnia Pascala i innych konkurentów C w latach 70-tych i 80-tych +1. początku programiści to także ludzie koniec początku ci, którzy wierzyli , że wygodnie jest mapować znaki interpunkcyjne na słowa takie jak początek-koniec przegrali bitwę z nawiasami klamrowymi koniec historii
gnat

Nie widzę dowodów na to, że składnia języka C jest mniej niejasna, z wyjątkiem tego, że większość programistów zna język C lub jakiś język związany z językiem C, a więc wygląda bardziej znajomo. AFAICT, C wygrał z Pascalem ze względu na jego strukturę oraz fakt, że implementacje nie musiały tworzyć własnych linków, a nie składni.
David Thornley,

@ David-Z tego co pamiętam, jednym z powodów, dla których C wygrał z innymi językami, była względna łatwość dostępu do pamięci w C (tj. Wskaźniki). Wiem, że jest ich teraz mnóstwo, ale kiedy 1 KB pamięci RAM było dużo pamięci, była to bardzo potężna funkcja języka. Wiem, że inne języki udostępniały funkcje podobne do wskaźników, ale żaden z nich nie jest tak łatwy jak C.
Dunk

-3

Większość wymienionych języków nie ma praktycznie nic wspólnego z C poza nieistotnymi podobieństwami składniowymi. Jedynymi dwoma rzeczywistymi pochodnymi C są Objective-C i C ++.


Jeśli nie rozważamy składni, jedynymi różnicami między dowolnymi językami są dostępność ogólnych konstrukcji językowych (pętle, warunki, zmienne, abstrakcje takich klas i zamknięć itp.) I że wszystkie one są równe zachowaniu maszyny kod. Wszystkie języki niskiego poziomu są do siebie podobne, a wszystkie języki wysokiego poziomu są bardzo podobne w tym momencie.
wałek klonowy

2
Nie powinieneś myśleć o języku jako o jego funkcjonalności, ale o tym, jak komunikuje zachowanie aplikacji. Twój kod źródłowy jest najniższym poziomem dokumentacji i jeden pisze kod źródłowy dla ludzi, a NIE dla maszyn . Gdybyśmy napisali kod ściśle dla maszyn, wszyscy kodowalibyśmy w asemblerze.
wałek klonowy

1
@maple_shaft: Całkiem słusznie! W wywiadzie poproszono mnie o wyjaśnienie różnicy między językiem maszynowym (asemblerem) a językiem programowania. Moja odpowiedź brzmiała: „Język maszynowy jest dla maszyn, język programowania jest dla programistów”.
Treb

1
@maple_shaft: Składnia nie ma znaczenia, jeśli chodzi o komunikację z ludźmi . Gdybym zastąpił angielskie słowo inną pisownią, angielski nadal byłby tym samym językiem. Forma składniowa jest nieistotna, komunikatywna jest semantyka języka.
DeadMG,

3
@DeadMG: Ale pytanie dotyczy składni. Możesz uznać podobieństwa składniowe za nieistotne, ale osoba zadająca pytanie chce wiedzieć, dlaczego istnieją te nieistotne podobieństwa .
Nicol Bolas,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.