На каком языке написан компилятор C #?

148

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

Я также рассмотрел исходный код для новой платформы компилятора C # ( Roslyn ), и он также находится в C #. Как это возможно? Компилятор языка C # написан на C #? Или я что-то упускаю очевидное? Если компилятор C # написан на C #, то как он работает?

CriketerOnSO
источник
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 Самостоятельный хостинг - это конечный результат загрузки.
arx
2
@SriramSakthivel, код компилятора не может использовать новые ключевые слова, по крайней мере, пока не найдется компилятор, который их понимает. Вы всегда используете более старую версию компилятора для сборки новой.
Томас Левеск
32

Компиляторы - это служебные программы - они превращают текст языка программирования в машинный код. Если язык программирования описывает программное обеспечение, это просто компилятор .....

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

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

Если мы пойдем достаточно далеко назад в глубь веков времени, тогда мы действительно достигнем точки, где у нас нет компилятора, - самой первой итерации языка высокого уровня. Затем мы должны достать карандаши и книги с кодами операций и написать первый в сборке. Как мы написали первый ассемблер? Прямой ввод машинного кода, возможно, на перфорированной бумажной ленте или переключателях на передней панели.

Павел
источник
9
А бумажная лента просто переключает переключатели через отверстия в бумаге. :-)
Zan Lynx
2
Бумажная лента как технология хранения никогда не снимет. Он слишком сложен и подвержен ошибкам, плюс он легко горит, если в считывателе есть короткое замыкание, и это полностью разрушит вашу программу.
CVN
16

Компилятор - это просто программа, как и любая другая программа. В этом нет ничего волшебного или особенного. Он требует некоторого ввода и производит вывод. В данном конкретном случае входными данными просто является C #, а выходными - CIL, но это ничем не отличается от входных данных, представляющих собой серию налоговых деклараций, а выходных данных - отчета.

Йорг Миттаг
источник
10
Это другое - это намного проще, -).
Питер - Восстановить Монику
3
@PeterSchneider: Люди любят называть компиляторы мифическими волшебными существами, но в конце концов, это просто программы, которые преобразуют ввод в вывод. Практически каждая программа на планете анализирует некоторые входные данные, пытается понять их и превращает в некоторые выходные данные. В некотором смысле каждый ввод - это программа, написанная на каком-то языке, каждая программа - это компилятор.
Йорг Миттаг
3
Я не мог согласиться больше. Все, что я хотел сказать, это то, что налоговые законы - ужасный беспорядок. Напротив, формальные языки обычно хорошо определены таким образом, который подходит для автоматизации. Что делает простой компилятор, вероятно, более простым для написания, чем программа, занимающаяся налогами. Хотя Эрик Липперт может не согласиться с компиляторами C #, ср. blogs.msdn.com/b/ericlippert/archive/2010/02/04/… . Прошел долгий путь от однопроходных компиляторов Си.
Питер - Восстановить Монику
1
@PeterSchneider: Ах, извините, я неверно истолковал ваш комментарий на 180 ° :-D
Йорг Миттаг
Мне больше всего нравится этот ответ, так как он наиболее непосредственно касается мысли ОП. Он очищает туман, который окружает "всемогущий" компилятор.
Ассаф Леви