Czy każdy język jest napisany w C?

180

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?

FaizanRabbani
źródło
58
@XLAnt: wiele (a może nawet większość) kompilatorów C jest napisanych w C.
Jörg W Mittag
32
@Neil: C ++ nie kompiluje się do niczego. C ++ jest językiem. Języki się nie kompilują, kompilatory tak.
Jörg W Mittag,
12
@XLAnt: Nie wydaje mi się. Ale pierwszy kompilator Oberona, na przykład, został napisany w Oberon, a następnie ręcznie przetłumaczony (jak sądzę, jest to forma kompilacji) na Fortran. Kompilator ten został następnie skompilowany za pomocą kompilatora Fortran, powstały kompilator Oberon został użyty do kompilacji kompilatora Oberon i od tego momentu poprzednia wersja kompilatora została użyta do kompilacji następnej.
Jörg W Mittag,
18
@Neil To nie jest tak pedantyczne. Jest dokładny: język to specyfikacja. Może być zaimplementowany jako kompilator, jako interpreter, hybryda itp. Możesz napisać kompilator dla języka, ale kompilator nie jest językiem. Wydaje mi się, że problem jest mylący, ponieważ istnieją języki, dla których nie ma nigdzie napisanej specyfikacji poza implementacją referencyjną. Ale nawet w tych przypadkach argumentowałbym, że język (tj. Ideał, jaki autor miał w swoim umyśle) różni się od implementacji / kompilatora / tłumacza itp.
Andres F.,
21
Downvoters: jest to dość rozsądne pytanie z jasną odpowiedzią. To, że odpowiedź brzmi „nie”, nie jest powodem, by głosować negatywnie. Zamiast tego rozważ udzielenie odpowiedzi i wyjaśnienie.
Andres F.,

Odpowiedzi:

207

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.

greyfade
źródło
40
Chociaż prawdą jest, że pierwszych kompilatorów C nie można oczywiście napisać w języku C, z pewnością jest to teraz możliwe.
reirab
17
@reirab Posible AND true. GCC jest napisane w C i zwykle kompilowane za pomocą GCC .
Darkhogg,
9
Oczywiście GCC jest teraz przepisywane w C ++, ale to nie jest tak ważne jak fakt, że pierwszy kompilator C nie mógł być napisany w C.
greyfade
10
@greyfade gcc od jakiegoś czasu nie był C. To nie jest „teraz przepisywane”, to jest „pisane w C ++ od ponad dwóch lat” (choć jest nawet starsze niż to, to wtedy nastąpiła fuzja, która przeniosła go do C ++).
13
@greyfade nie jest „C, ale z funkcjami C ++” sortowaniem definicji C ++?
KutuluMike,
91

Czy każdy język jest napisany w języku C?

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 forwyrażenia ze specyfikacji języka Ruby ISO:

§11.5.2.3.4 forWyrażenie

Składnia

  • dla-wyrażenia for dla-zmiennej [tutaj nie ma terminatora linii] in wyrażenie do-klauzula end
  • dla zmiennej → po lewej stronie | wiele po lewej stronie

Semantyka

Formę wyrażenia ocenia się w następujący sposób:

  1. Oceń wyrażenie . Jeśli ocena wyrażenia zostanie zakończona wyrażeniem przerywającym , wyrażeniem następnym lub powtórzeniem , zachowanie jest nieokreślone. W przeciwnym razie niech Obędzie wartością wynikową.
  2. Niech Ebędzie podstawowej metody, wywołania na formę pierwotnego wyrażenia [żadnej linii terminatora tutaj] .each do | Blok parametr-listy | blokowej ciała end , gdzie wartość pierwotnego wyrażenia jest OThe bloku lista-parametrów jest FOR zmienna , ciało-blok jest wyrażeniem złożonym z klauzuli do .

    Oceń E; Jednakże, jeśli w bloku, którego blok ciała jest związek, sprawozdanie z do-klauzuli z do ekspresji jest wywoływana podczas tej oceny, etapy w §11.3.3 wyjątkiem etapu c), oraz 4) Etap e), są wziąć pod uwagę ocenę tego zaproszenia.

  3. Wartość wyrażenia to wynikowa wartość wywołania.

Oto inny przykład niż reguły zgodności typu Scali:

Typ polimorficzny [a 1 >: L 1 <: U 1 ,…, a n >: L n <: U n ] T jest zgodny z typem polimorficznym [a1>: L ′ 1 <: U ′ 1 ,…, a n >: L ′ n <: U ′ n ] T ′, jeżeli przy założeniu L ′ 1 <: a 1 <: U ′ 1 ,…, L ′ n <: a n <: U'n ma T <: T ′ I L i <: L ′ i i U ′ i<: U i dla i ∈ {1,…, n} .


Czy język C jest matką / ojcem wszystkich języków?

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.

  • Plankalkül (1943)
  • Speedcoding (1953)
  • Fortran (1954)
  • IPL (1956)
  • Lisp (1958)
  • Algol (1958)
  • COBOL (1959)
  • JOVIAL (1960)
  • APL (1962)
  • SIMULA (1962)
  • SNOBOL (1962)
  • CPL (1963)
  • BASIC (1964)
  • PL / I (1964)
  • RPG (1964)
  • BCPL (1966)
  • ISWIM (1966)
  • MUMPS (1967)
  • Forth (1968)
  • LOGO (1968)
  • REFAL (1968)
  • B (1969)
  • BLISS (1970)
  • Pascal (1971)
  • KRL (1971)
  • Smalltalk (1972)

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.

Każda koncepcja (OOP itp.) Jest zaimplementowana w języku C?

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.

Jörg W Mittag
źródło
2
@leftaroundabout: To świetny blog, jeden z moich ulubionych od lat.
Jörg W Mittag,
1
@FrancisDavey: Dzięki. Zacząłem kompilować listę z pamięci, a potem dodałem daty, których nie pamiętałem, przeglądając je na Wikipedii. Potem znalazłem oś czasu języków na Wikipedii i wybrałem z tego kilka innych języków. Ponieważ artykuł o BCPL cytuje 1966 r., Ale oś czasu 1967 r., Nie zauważyłem, że już dodałem BCPL. Usunę duplikat.
Jörg W Mittag,
1
Na twojej liście nie jest napisane „htroF” wstecz?
chux
2
„Podróże w czasie są fizycznie niemożliwe” - to bardzo kontrowersyjne twierdzenie. Oczywiście nie umniejsza wartości tej odpowiedzi.
Konrad Rudolph
50

Większość rdzeni wielu ważnych języków jest napisana w C, ale wszystko się zmienia:

  • referencyjna implementacja Pythona ( CPython ) jest napisana w C (ale istnieją inne implementacje napisane w innych językach, np. Jython / Java, PyPy / Python, IronPython / C # ...)
  • PHP Zend Engine jest napisany w C
  • 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) ...

  • Perl jest implementowany jako główny tłumacz, napisany w C, wraz z dużą kolekcją modułów, napisany w Perl i C (ale Pugs , kompilator i interpreter dla języka programowania Perl 6, jest napisany w Haskell)
  • oficjalny interpreter języka Ruby, często określany jako Matz's Ruby Interpreter lub MRI, jest napisany w C i korzysta z własnej maszyny wirtualnej specyficznej dla Ruby (ale istnieje JRuby, implementacja Java działająca na maszynie wirtualnej Java; Rubinius, C ++ bytecode maszyna wirtualna, która używa LLVM do kompilacji do kodu maszynowego w czasie wykonywania ...)
  • około 50% R jest napisane w C
  • i oczywiście C jest (było) napisane w C ! (ale pierwszy kompilator C, skierowany na PDP-11, był mieszanką B i asemblera).

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:

manlio
źródło
5
Z punktu widzenia implementacji kompilatorów / tłumaczy C był / jest punktem odniesienia. Ponadto wpłynął bezpośrednio lub pośrednio na wiele późniejszych języków (przynajmniej syntaktycznie).
manlio
2
wkrótce będziesz mógł powiedzieć, że C # został napisany w C #! (rodzaj)
DLeh
1
Większość Mono (która zawiera kompilator C # i wiele / większość biblioteki klas podstawowych .NET) jest napisana w języku C #.
Charlie Kilian,
3
Odpowiedź na pytanie „czy C jest matką / ojcem wszystkich języków?” jest „nie”, więc nie sądzę, aby pomocne było dostarczenie wielu przykładów, które są napisane w C. Przykłady kontrprzydatne pomogłyby, ale twoje wybory wciąż pochodzą od C. Na przykład, nawet jeśli Java, Python itp. są teraz hostowane samodzielnie, nadal były ładowane z C, więc są jak „wnukowie” C. Języki takie jak LISP, FORTRAN, ML i (oczywiście) kod maszynowy są prawdziwymi kontrprzykładami, ponieważ C nigdy nie był zaangażowany w ich stworzenie.
Warbo
2
Aspiracja dla wielu języków musi być oczywiście realizowana w miarę możliwości sama w sobie. Wydaje się jednak, że większość języków zależy od C, ponieważ większość języków musi być w stanie wywołać C, aby było przydatne; większość współczesnych interfejsów API systemu operacyjnego i przydatnych bibliotek ma zwykle powiązania w języku C. Musisz także uważać na to, co rozumiesz przez „napisane w”. Implementacja języka zazwyczaj składa się z wielu części: przynajmniej kompilatora i systemu wykonawczego. Systemy wykonawcze są często napisane w języku C, aby poprawić interfejs z systemem operacyjnym.
Pseudonim
10

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

Ofir
źródło
2
Istnieje wiele implementacji Java, większość jest napisana w Javie. Implementacja GNU Objective-C jest napisana w C (lub C ++, myślę, że ostatnio się zmieniły), implementacja LLVM jest napisana w C ++, a kiedyś był interpreter napisany w C #. Istnieje wiele implementacji Pythona, jedna jest napisana w RPython, jedna w Javie, jedna w C #, a jedna w C. PHP ma sześć głównych implementacji, dwie w Javie, dwie w C #, jedna w C ++ i jedna w C ++.
Jörg W Mittag,
1
Nie. Projektanci języków są z pewnością pod wpływem innych języków, ale mogą zignorować te wpływy, jeśli sobie tego życzą.
Jörg W Mittag,
2
Języki @FaizanRabbani są w istocie pojęciami i wyborami paradygmatów, wzorców i kompromisów - bardzo często „język jest tworzony / dostosowywany z innych języków (języków)”, ale jest to całkowicie niezwiązane z językiem implementacji jego kompilatora; język X może pochodzić z języka Y, ale zaimplementowany w języku C lub czymś zupełnie innym - i często tak jest. W tym przypadku „przodek konceptualny” jest ważny, ale język kompilatora jest ledwo istotnym niuansem technicznym, który może się zmieniać z czasem.
Peteris,
3
Ten ostatni link, jeśli ma wątpliwą wartość - zbyt wiele błędów w nim, aby naprawdę potraktować go poważnie.
Nieznany Coder,
4
@SebastianGodelet: HotSpot nie jest implementacją języka Java. Jest to implementacja języka kodu bajtowego JVM. To są dwa zupełnie różne języki. Najczęściej stosowane implementacje języka Java javacpochodzą 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 GCJ
Jörg W Mittag,
4

Zrobił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.

WannabeCoder
źródło
1
wydaje się, że nie oferuje to nic istotnego w porównaniu z punktami podanymi i wyjaśnionymi we wcześniejszych odpowiedziach, szczególnie w pierwszej , z wyjątkiem wątpliwego stwierdzenia, że ​​„C jest oparty na języku o nazwie ALGOL”
gnat
4
Podstawa C w ALGOL nie jest wątpliwa ... Zobacz cm.bell-labs.com/who/dmr/chist.html , en.wikipedia.org/wiki/C_%28programming_language%29 )
WannabeCoder
rzeczywista historia jest o wiele bardziej skomplikowana i interesująca niż; Powiedziałbym, że sposób, w jaki tu wszystko jest ułożone, nie jest zbyt pomocny dla czytelników
komara
3

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

phuclv
źródło
12
Pierwszy kompilator Oberona został napisany w Oberon. To w porządku, pod warunkiem, że jesteś profesorem i masz wielu studentów, którzy ręcznie przetłumaczą dla ciebie kompilator (który miał prof. Wirth).
Jörg W Mittag,
@Jorg, o którym wspomniano w artykule o ładowaniu, do którego odsyłam, więc nie zawracam sobie głowy pisaniem tego, ponieważ to pytanie dotyczy C i żaden kompilator C nie został napisany w ten sposób
phuclv
14
@ JörgWMittag - pierwszy automatyczny kompilator Oberona został napisany w Oberon. Rzeczywistym pierwszym kompilatorem Oberona była grupa studentów.
nnnnnn
4
@nnnnnn: Uważam tę „grupę studentów” za tłumacza, a nie kompilatora.
Paŭlo Ebermann,
4
@ Paŭlo Ebermann Aby dodać kolejny element ludzki: „komputer” był pierwotnie tytułem pracy .
chux
2

Oto lista niektórych języków programowania, które nie są napisane w C, wraz z językami, w których zaimplementowane:

  • Haskell - Haskell
  • Idris - Haskell
  • Adga - Haskell
  • Clash - Haskell
  • PureScript - Haskell
  • Elm - Haskell
  • Rtęć - Rtęć
  • Rdza - Rdza (początkowo OCaml)
  • Idź idź
  • Crystal - Crystal
  • OCaml - OCaml
  • Frege - Frege + Java
  • Haxe - OCaml + Haxe
  • Scala - Scala
  • Futhark - Haskell
  • ATS - ATS

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
C nigdy nie był „niewiarygodnie dobrze zaprojektowanym językiem”. Brodawki, które widzimy dzisiaj, były znane od samego początku. Ale wystarczyło być ojczystym językiem przyjaznego dla deweloperów systemu operacyjnego Unix, a po tym, jak Bell Labs wypuścił Unix na uniwersytety, C / Unix stał się ulubionym językiem / systemem dla pokolenia profesjonalistów komputerowych.
Solomon Slow
PS., Nie było wielu oryginalnych pomysłów w C. Jeśli szukasz matki / ojca wszystkich proceduralnych języków programowania o strukturze bloków, możesz rzucić okiem na ALGOL .
Solomon Slow
Makra Lisp były znacznie lepsze niż C, a ALGOL i Smalltalk miały bloki, zamknięcia i funkcje zagnieżdżone, aby pomóc w organizacji kodu. Rzeczywiście Lisp mógł zostać użyty jako Makroprocesor dla asemblera i stworzył kod, który był krótszy i szybszy (niestandardowe przetwarzanie wyrażeń S) niż wczesna C. Simula, która pojawiła się zanim C miał polimorfizm. Lisp, APL i Smalltalk miały „powłoki”, które były w pełni funkcjonalne (ten sam kod między powłoką i programami) w przeciwieństwie do uniksowych „sh” vs „C” pozwalających na przeplatanie zinterpretowanego i skompilowanego kodu. Wskaźniki były łatwiejsze w Lisp (rplaca / rplacd).
aoeu256
Największą zaletą C było to, że łatwiej było budować „kompilatory” dla C, dzięki czemu łatwiej się rozprzestrzeniało… jak wirus, a dzięki C współcześni programiści nie mają pojęcia, jak budować programy, które są modułowe (zmienność szkodzi modułowości), nie ma pojęcia o przysłówkach / kombinatorach / funkcjach wyższego rzędu [ręcznie zapisuj pętle za każdym razem], a nasze procesory są ograniczone wąskim gardłem „von neumann”, ponieważ nasz system operacyjny jest napisany w C, więc potrzebujemy naszego Procesor do uruchomienia kodu C w celu zapewnienia zgodności wstecznej.
aoeu256
1

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!

Basile Starynkevitch
źródło