Czasami podczas programowania w różnych językach (C / C ++, C #) przychodzi mi na myśl ta myśl:
- Czy każdy język jest napisany w języku programowania C?
- Czy język C jest matką / ojcem wszystkich języków?
- Czy wszystkie koncepcje ( OOP itp.) Są zaimplementowane w C?
Czy jestem we właściwym kierunku?
programming-languages
c
FaizanRabbani
źródło
źródło
Odpowiedzi:
Nie.
Dialogi OCaml, Haskell, Lisp, takie jak Scheme, i kilka innych języków jest często używanych w rozwoju języków hobbystycznych.
Wiele języków jest zaimplementowanych w C, ponieważ jest to język wszechobecny, a narzędzia do pisania kompilatorów, takie jak generatory lexer-parser (takie jak yacc i bison), są dobrze zrozumiałe i prawie tak samo wszechobecne.
Ale samo C nie mogło być pierwotnie opracowane w C, gdy zostało stworzone po raz pierwszy. Został pierwotnie opracowany przy użyciu języka B. Wcześniejsze języki (takie jak Fortran) były zwykle ładowane przy użyciu natywnego języka asemblera lub nawet kodu maszynowego na długo przed pojawieniem się C.
Niepowiązane paradygmaty językowe, takie jak OOP, są generalnie niezależne od języka. Na przykład paradygmat funkcjonalny został opracowany (przez Alonzo Church) jako podstawa matematyki na długo przed pojawieniem się jakiegokolwiek języka programowania. Proceduralne i ustrukturyzowane paradygmaty programowania wynikają z matematycznej pracy teoretyków, takich jak John von Neumann. Orientacja obiektowa została opracowana przez kilka różnych i niepowiązanych ze sobą wysiłków, niektóre z rachunku lambda (paradygmat funkcjonalny), a niektóre z dynamicznych systemów programowania, takich jak SmallTalk w Xerox PARC, autorstwa Alana Kay.
C to zaledwie niewielka część historii, kilkadziesiąt lat po powstaniu tych pomysłów.
źródło
Język jest zbiorem abstrakcyjnych reguł matematycznych i ograniczeń ( „jeśli piszę tego , że dzieje się”). Tak naprawdę to nic nie jest zapisane.
Jest on określony, zwykle w mieszaninie sformalizowanego podzbioru angielskiego, notacji matematycznej i być może jakiegoś specjalistycznego języka specyfikacji. Składnia jest często określana w wariancie EBNF lub ABNF .
Na przykład, oto specyfikacja
for
wyrażenia ze specyfikacji języka Ruby ISO:Oto inny przykład niż reguły zgodności typu Scali:
Nie, nie jest. C jest całkiem młody. Istnieje wiele starych języków. Ponieważ podróże w czasie są fizycznie niemożliwe, po prostu niemożliwe jest, aby C miał jakikolwiek wpływ na te stare języki.
Wszystkie istniały jeszcze przed wynalezieniem C. I wiele innych nie ma w nich wpływu C, nawet po jego istnieniu. Rodzina języków PASCAL (ALGOL-58, ALGOL-60, ALGOL-X, ALGOL-W, PASCAL, Modula-2, Oberon, Oberon-2, Active Oberon, Component Pascal) to całkowicie odrębna linia. Cała rodzina Lisp (LISP, Franz Lisp, InterLisp, MacLisp, Scheme, Flavours, LOOPS, CommonLoops, Dylan, CommonLisp, Arc, Clojure, Racket itp.) Również nie są ze sobą powiązane. Języki funkcjonalne (ISWIM, KRL, Miranda, ML, SML, CAML, OCaml, F #, Haskell, Gofer, Clean) i cała rodzina o typie zależnym (Agda, Coq, GURU, Idris) są w przybliżeniu jak najdalej od C. To samo dotyczy rodziny Smalltalk (Smalltalk, Self, Newspeak, Us, Korz), rodziny programowania logiki (PLANNER, Prolog, Mercury), SQL i wielu innych.
Pierwszymi językami z koncepcjami OO były Simula (1960) i Smalltalk (1972), ale systemy obiektowe zostały zbudowane już w 1953 roku (nie nazywając ich tak). Znów, to długo zanim istniało C, więc OO nie może mieć żadnego związku z C.
źródło
x := x + y
składni zamiast bardziej znanego C-podobnegox = x + y
. Ta krytyka ma miejsce pomimo faktu, że C nie został jeszcze wynaleziony ...Większość rdzeni wielu ważnych języków jest napisana w C, ale wszystko się zmienia:
pierwszy kompilator Java opracowany przez Sun Microsystems został napisany w C, ale teraz biblioteki klas są zawsze napisane w Javie (ponieważ są przeznaczone do uruchamiania przy użyciu samej maszyny wirtualnej Java). Niektóre biblioteki używające JNI (Java Native Interface) mogą być częściowo napisane w różnych innych językach, ponieważ są przeznaczone do użytku POZA JVM.
Maszyna Sun / Oracle VM jest napisana w C ++. BEA / Weblogic / Oracle VM jest napisany w C. Ale JVM jest napisany w Javie, Lisp, SmallTalk (IBM) ...
Istnieje wiele powodów, dla których często wybierano C: wydajność, przenośność, doświadczenie.
Prawdopodobnie najważniejsza jest ostatnia: Python został uruchomiony w 1991 r., PHP w 1994/1995, Perl w 1988 r., Ruby w 1995 r. W tych latach Java została właśnie wydana, a C ++ nie była jeszcze dobrze znormalizowana.
Nieco powiązane:
źródło
Nie, niektóre języki mają wcześniejszą datę C. I wiele z nich jest implementowanych niezależnie od C, np. Patrz http://en.wikipedia.org/wiki/Lisp_%28programming_language%29
źródło
javac
pochodzą z Oracle JDK / OpenJDK napisanego przez Martina Odersky'ego (znanego ze Scali) w 100% Javie, kompilatora Eclipse, napisanego w 100% Javie (pochodzącego z kompilatora Jikes IBM ), kompilatora z IBM J9, również pochodzący z Jikes i 100% Java. AFAIK, jedynym kompilatorem Java w dość powszechnym użyciu, który nie jest napisany w Javie, jest GCJZrobiłbym to komentarz, gdybym mógł, ale nie mogę tego zrobić tutaj:
Jednym z powodów, dla których C wydaje się tak wszechobecny, jest to, że jest to jeden z pierwszych opracowanych języków, a ogromna liczba współczesnych języków oparta jest na jego strukturze (Java, Go, PHP, Perl itp.) - co sprawia, że wygląda na to, że więcej miejsc niż jest.
Innym często zapomnianym powodem jest to, że w 1973 r. Unix został przepisany w C, a wiele wywołań systemowych Unixa jest również dostępnych jako programy / funkcje w C, dzięki czemu oba są ze sobą ściśle powiązane. Ponieważ Unix był potężnym elementem rozwoju nowoczesnego programowania jako całości, C został wciągnięty w niełaskę.
Powiedziawszy to wszystko, odpowiedź na twoje pytanie brzmi „nie”. C opiera się na języku ALGOL, a było wielu konkurentów zarówno z ALGOL (FORTRAN, Lisp, COBOL), jak i C (żaden nie przychodzi mi do głowy). Programowanie obiektowe, prawdopodobnie największa zmiana paradygmatu w projektowaniu programistycznym, nie wywodzi się z C - mimo że C ++ jest bardzo popularnym językiem OOP (pojawił się pierwszy w Lisp lub Simula 67, w zależności od tego, kogo pytasz). Zanim pojawiło się OOP, C był tak popularnym językiem, że nie musiał być pierwszy - był tak popularny, że „rozszerzenie” C ++, że tak powiem, stało się również jednym z głównych języków OOP. Pozostaje w nowoczesnym użyciu głównie ze względu na potężne funkcje sterowania pamięcią (możesz bezpośrednio przydzielać i zwalniać pamięć tworzoną przez twoje struktury), pozwalając mu tworzyć programy o ograniczonym budżecie pamięci (pomyśl gry wideo) i jego wysoce zoptymalizowany kompilator (oczywiście w zależności od kompilatora). Trzeba przyznać, że nawet te funkcje tracą na popularności, gdy kompilacja Java JIT i menedżery pamięci w języku stają się bardziej zaawansowane.
źródło
Oczywiście, że nie. Jak można napisać pierwszy kompilator C w C, jeśli C nie istniał wcześniej? To nie jest problem z kurczakiem i jajami.
Istnieje wiele sposobów na napisanie pierwszego kompilatora języka, który nazywa się bootstrapowaniem
Co więcej, większość kompilatorów stara się osiągnąć własny hosting lub samodzielnie skompilować swój język, głównie w celu promowania języka i samego kompilatora
źródło
Oto lista niektórych języków programowania, które nie są napisane w C, wraz z językami, w których są zaimplementowane:
Najlepsze języki do implementacji kompilatora prawdopodobnie będą bardzo daleko od C. Języki funkcjonalne dają takie rzeczy, jak schematy rekurencyjne i kombinatory monadycznych parserów (pod warunkiem, że masz klasy), co czyni je szczególnie odpowiednimi do pracy kompilatora.
Po drugie, aby odpowiedzieć na pytanie, czy C jest „matką / ojcem wszystkich języków programowania” - niezupełnie. C był dobrze zaprojektowanym językiem w chwili jego pojawienia się i bez wątpienia wpłynął na projektantów języków, którzy później robili bardzo różne rzeczy. Ale pod koniec dnia Haskell odchodzi z C zasadniczo w każdy możliwy sposób. C ma 45 lat i nic dziwnego, że tymczasem nauczyliśmy się lepiej.
Wreszcie, aby odpowiedzieć na trzecie pytanie, po prostu nie jest tak, że C implementuje „wszystkie koncepcje”. W szczególności próba wdrożenia niektórych zaawansowanych pojęć z programowania funkcjonalnego (takich jak metamorfizmy lub, nie daj Boże, synchromorfizmy) w C byłaby potwornie trudna. Nie jestem szczególnie zaznajomiony z programowaniem obiektowym, ale wiem, że niektóre języki obiektowe mają typy sum.
źródło
Języki programowania to specyfikacje (nie oprogramowanie!), Zwykle napisane w jakimś angielskim dokumencie (z pewną formalizacją, np. EBNF dla większości składni; czasami ich semantyka jest również częściowo sformalizowana).
Na przykład C11 jest zdefiniowane przez n1570 (które powinieneś przeczytać). Niektóre dialekty schematu są zdefiniowane przez R5RS (które powinieneś również przeczytać, jest bardzo dobrze napisane).
Języki programowania mogą być implementowane przez niektóre oprogramowanie. Czasami to oprogramowanie jest kompilatorem napisanym w samym języku programowania. Przeczytaj o kompilatorach ładowania początkowego .
Kompilator można napisać w samym skompilowanym języku programowania. Jeśli ten język XX jest zupełnie nowy, musisz przejść przez tymczasowy krok, który obejmuje napisanie minimalnego interpretera lub kompilatora podzbioru tego języka w innym języku implementacji (być może C), a później możesz wyrzucić ten tymczasowy kompilator lub interpreter (który nie musi być „dobry”, wystarczy, aby skompilować drugi kompilator). Po skompilowaniu kompilatora XX napisanego w XX możesz wyrzucić kompilator tymczasowy.
Często (ale nie zawsze) system wykonawczy jest częściowo napisany w C (w szczególności moduł odśmiecający ).
Zauważ, że kości są kompilatorem schematów i środowiskiem wykonawczym całkowicie napisanym w sobie (i można znaleźć wiele innych przykładów implementacji w pełni bootstrapowanych).
BTW wygodnie jest używać C jako języka docelowego kompilatorów .
Obecnie wiele implementacji języków programowania to darmowe oprogramowanie lub oprogramowanie typu open source . Zapraszam do studiowania (i być może przyczynienia się) do ich kodu źródłowego!
źródło