W jakim języku jest napisany kompilator C #?

148

Spojrzałem na kod źródłowy pod adresem http://referencesource.microsoft.com/ i okazało się, że cały kod źródłowy jest w C #.

Przyjrzałem się również kodowi źródłowemu nowej platformy kompilatora C # ( Roslyn ) i jest on również w języku C #. Jak to możliwe? Czy kompilator języka C # jest napisany w języku C #? A może brakuje mi czegoś oczywistego? Jeśli kompilator C # jest napisany w języku C #, to jak to działa?

CriketerOnSO
źródło
12
Wiele kompilatorów jest napisanych w języku, który kompilują - uruchamiając Google, aby dowiedzieć się więcej.
Paul Roub,
19
Myślę, że oryginalny kompilator został napisany w C ++.
PoweredByOrange
44
Cóż, młotek można wykuć za pomocą innego młotka. Poprzednia wersja…
Eugene Sh.
10
Opublikowane łącze jest łączem do kodu źródłowego biblioteki Framework, a nie do kompilatora.
Steve

Odpowiedzi:

229

Oryginalny kompilator C # nie został napisany w C #, był w C i C ++. Nowy kompilator Roslyn został napisany w języku C #, ale początkowo został skompilowany za pomocą starego kompilatora. Gdy nowy kompilator był już gotowy, był w stanie skompilować swój własny kod źródłowy: nazywa się to ładowaniem początkowym .

Thomas Levesque
źródło
2
Więc kiedy trzeba dokonać zmiany w "oryginalnym kompilatorze", czy trzeba to skompilować za pomocą starego kompilatora (napisanego w C, C ++) ?
CriketerOnSO
10
Nie byłoby potrzeby zmiany „oryginalnego kompilatora”, nowsze wersje zostałyby zmodyfikowane
pseudonim
1
@CriketerOnSO, nowy kompilator zastąpi stary, więc nie będzie potrzeby modyfikowania starego. Ale gdyby MS chciał to zrobić, przekompilowałoby stary kompilator z kompilatorem C ++, tak jak wcześniej.
Thomas Levesque
3
@ThomasLevesque Self-hosting jest końcowym efektem bootowania.
arx
2
@SriramSakthivel, kod kompilatora nie może używać nowych słów kluczowych, przynajmniej dopóki nie pojawi się kompilator, który je zrozumie. Zawsze używasz starszej wersji kompilatora do tworzenia nowej.
Thomas Levesque
32

Kompilatory to programy narzędziowe - zamieniają tekst języka programowania w kod maszynowy. Jeśli język programowania opisuje oprogramowanie, które akurat jest kompilatorem .....

Kompilatory mogą również tworzyć kod maszynowy dla innych architektur. Na przykład Apple kompiluje iOS, używając stojaków z serwerami z procesorami Intel. Kompilator nie musi uruchamiać generowanego przez siebie kodu ARM, wystarczy go zapisać na dysku.

Kompilator 2.0 musi być napisany w języku, który może przetwarzać kompilator 1.0, ale z pewnością może stworzyć kompilator 2.0 z nowszymi funkcjami, takimi jak optymalizacja. Następnie możesz ponownie skompilować kod źródłowy za pomocą kompilatora 2.0 i stworzyć lepszą wersję samego siebie. Ponownie, kompilator nie wie, że tworzy kolejną wersję siebie.

Jeśli cofniemy się wystarczająco daleko w mgły czasu, dotrzemy do punktu, w którym nie mamy kompilatora - jest to pierwsza iteracja języka wysokiego poziomu. Następnie musimy wyjąć ołówki i książki z kodami operacyjnymi i napisać pierwszą w zespole. Jak napisaliśmy pierwszego asemblera? Bezpośrednie wprowadzenie kodu maszynowego, prawdopodobnie na perforowanej taśmie papierowej lub przerzucaniu przełączników na panelu przednim.

Paweł
źródło
9
A papierowa taśma po prostu przełącza przełączniki przez otwory w papierze. :-)
Zan Lynx
2
Taśma papierowa jako technologia przechowywania nigdy się nie rozwiąże . Jest po prostu zbyt skomplikowany i podatny na błędy, a ponadto łatwo się pali, jeśli w czytniku wystąpi zwarcie, co całkowicie zniszczy twój program.
CVn z
16

Kompilator to po prostu program, jak każdy inny program. Nie ma w tym nic magicznego ani specjalnego. Wymaga pewnych danych wejściowych i generuje pewne dane wyjściowe. W tym konkretnym przypadku tak się składa, że ​​dane wejściowe to po prostu C #, a wynik po prostu CIL, ale nie różni się to od danych wejściowych będących serią deklaracji podatkowych, a wynikiem jest raport.

Jörg W Mittag
źródło
10
Jest inaczej - jest dużo łatwiej, -).
Peter - Przywróć Monikę
3
@PeterSchneider: Ludzie lubią rzucać kompilatory jako mityczne magiczne stworzenia, ale ostatecznie są to tylko programy, które konwertują dane wejściowe na wyjściowe. Prawie każdy program na tej planecie analizuje jakieś dane wejściowe, próbuje nadać im sens i przekształca je w jakieś wyjście. W pewnym sensie każde wejście jest programem napisanym w jakimś języku, każdy program jest kompilatorem.
Jörg W Mittag,
3
Nie mogłem się bardziej zgodzić. Chciałem tylko powiedzieć, że przepisy podatkowe to straszny bałagan. Z kolei języki formalne są zazwyczaj dobrze zdefiniowane w sposób odpowiedni do automatyzacji. Co sprawia, że ​​prosty kompilator jest prawdopodobnie łatwiejszy do napisania niż program zajmujący się podatkami. Chociaż Eric Lippert może nie zgadzać się z kompilatorami C #, por. blogs.msdn.com/b/ericlippert/archive/2010/02/04/... . Przeszedł długą drogę od jednoprzebiegowych kompilatorów C.
Peter - Przywróć Monikę
1
@PeterSchneider: Ach, przepraszam, źle zinterpretowałem twój komentarz przez 180 ° :-D
Jörg W Mittag
Najbardziej podoba mi się ta odpowiedź, ponieważ najbardziej bezpośrednio odnosi się do myśli PO. Usuwa mgłę, która otacza „wszechmocny” kompilator.
Assaf Levy