Якою мовою написано компілятор C #?


148

Я переглянув вихідний код за адресою http://referencesource.microsoft.com/ , і, схоже, весь вихідний код знаходиться в C #.

Я також переглянув вихідний код нової платформи компілятора C # ( Roslyn ), і він також знаходиться в C #. Як це можливо? Чи компілятор мови C # написаний на C #? Або я пропускаю щось очевидне? Якщо компілятор C # написаний на C #, то як це працює?


12
Багато компіляторів написано мовою, яку вони компілюють - завантажувальна програма Google, щоб дізнатися більше.
Пол Руб

19
Я думаю, що оригінальний компілятор був написаний на C ++.
PoweredByOrange

44
Ну, молоток можна підробити, використовуючи інший молоток. Попередня його версія ...
Євген Ш.

10
Посилання, яке ви опублікували, є посиланням на вихідний код бібліотеки Framework, а не на компілятор.
Стів

Відповіді:


229

Оригінальний компілятор C # не був написаний на C #, а у C та C ++. Новий компілятор Roslyn був написаний на C #, але спочатку був зібраний зі старим компілятором. Після того, як новий компілятор був зроблений, він зміг зібрати власний вихідний код: це називається завантажувальним .


2
Отже, коли потрібно внести зміни до "оригінального компілятора", чи потрібно це компілювати зі старим компілятором (написаним на C, C ++) ?
CriketerOnSO

10
Не було б потреби змінювати "оригінальний компілятор", новіші версії будуть змінені
Псевдонім

1
@CriketerOnSO новий компілятор замінить старий, тому не потрібно буде змінювати старий. Але якщо MS захотів це зробити, вони перекомпілювали старий компілятор із компілятором C ++, як це робили раніше.
Томас Левеск

3
@ThomasLevesque Самостійний хостинг - це кінцевий результат завантаження.
аркс

2
@SriramSakthivel, код компілятора не може використовувати нові ключові слова, принаймні, не, поки не знайдеться компілятор, який їх розуміє. Ви завжди використовуєте старішу версію компілятора для створення нової.
Томас Левеск

32

Компілятори - це корисні програми - вони перетворюють текст мови програмування в машинний код. Якщо мова програмування описує програмне забезпечення, яке просто стає компілятором .....

Компілятори також можуть створювати машинний код для інших архітектур. Наприклад, Apple компілює iOS за допомогою стійок серверів на базі Intel. Компілятору не потрібно запускати створений ним код ARM, просто запишіть його на диск.

Компілятор 2.0 повинен бути написаний на мові, який компілятор 1.0 може обробляти, але він, безумовно, може створювати компілятор 2.0 з новими функціями, такими як оптимізація. Потім ви можете перекомпілювати вихідний код за допомогою компілятора 2.0 і зробити кращу версію себе. Знову ж, компілятор не знає, що робить іншу версію себе.

Якщо ми підемо досить далеко в тумани часу, тоді ми дійдемо до того моменту, коли у нас немає компілятора - першої ітерації мови високого рівня. Тоді ми повинні дістати олівці та кодувати книги та написати першу в зборах. Як ми написали перший асемблер? Прямий введення машинного коду, ймовірно, на перфоровану паперову стрічку або перемикачі на передній панелі.


9
А паперова стрічка - це просто гортання перемикачів через отвори в папері. :-)
Зан Лінкс

2
Паперова стрічка як технологія зберігання ніколи не зніметься. Це занадто складний і схильний до помилок, плюс він легко згорає, якщо в читальнику є коротке замикання, що повністю знищить вашу програму.
CVn

16

Компілятор - це просто програма, як і будь-яка інша програма. У цьому немає нічого магічного чи особливого. Це займає деякий вхід і дає деякий вихід. У цьому конкретному випадку вхідний показник просто C #, а вихід просто CIL, але це нічим не відрізняється від того, що вхід є серією податкових декларацій, а результатом є звіт.


10
Буває інакше - набагато простіше, -).
Пітер - Відновіть Моніку

3
@PeterSchneider: Люди люблять відтворювати компілятори як міфічні магічні істоти, але врешті-решт, вони просто програми, які перетворюють вхід на вихід. Практично кожна програма на планеті аналізує деякий внесок, намагається зрозуміти це і перетворює його на деякий вихід. У певному сенсі кожен вхід - це програма, написана якоюсь мовою, кожна програма - компілятор.
Йорг W Міттаг

3
Я не міг більше погодитися. Все, що я хотів сказати, - це те, що податкові закони - це жахливий безлад. Навпаки, формальні мови, як правило, добре визначені таким чином, що підходить для автоматизації. Що робить простий компілятор, мабуть, простіше написати, ніж програму, яка займається податками. Хоча Ерік Ліпперт може попросити не погоджуватися на компілятори w # C, пор. blogs.msdn.com/b/ericlippert/archive/2010/02/04 / ... . Пройшов довгий шлях від однопрохідних компіляторів С.
Пітер - Відновіть Моніку

1
@PeterSchneider: Ах, вибачте, я неправильно інтерпретував ваш коментар на 180 ° :-D
Jörg W Mittag

Найкраще мені подобається ця відповідь, оскільки вона безпосередньо стосується думки ОП. Він очищає туман, який оточує компілятор "усіх могутніх".
Ассаф Леві
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.