Как загружается компилятор Roslyn C#?

Я начал читать о Roslyn, новом компиляторе C#, и мне было интересно, как был скомпилирован компилятор Roslyn?
Я понимаю, что boostrapping необходим для того, чтобы иметь "я компилятор хостинга", и мне стало интересно, как компилятор Roslyn "загрузился"?


person Amittai Shapira    schedule 14.04.2015    source источник
comment
Я не понимаю вашего вопроса. Кажется, вы уже знаете, что такое бутстрэппинг. Тогда чего ты не знаешь?   -  person Sriram Sakthivel    schedule 14.04.2015
comment
Похоже на открытие github.com/dotnet/roslyn/blob/master/src /Roslyn.sln в Visual Studio, и нажатие кнопки компиляции сделает свое дело   -  person xmojmr    schedule 14.04.2015


Ответы (4)


Начальная загрузка является проблемой только в том случае, если еще нет существующей реализации языка. В этом случае не было, так что это легко.

  1. Скомпилируйте первую версию Roslyn, используя существующий компилятор C#.
  2. Затем перекомпилируйте его, используя только что скомпилированную сборку Roslyn.
  3. Готово.
person sepp2k    schedule 14.04.2015
comment
Когда в язык будут добавлены новые ключевые слова, как он будет компилироваться? потому что у нас нет компилятора (пока), который понимает новые токены? Первоначально задано здесь - person Sriram Sakthivel; 14.04.2015
comment
@SriramSakthivel Просто не используйте эти новые функции в компиляторе (сначала). - person sepp2k; 14.04.2015
comment
Глупый я :) Это было очень просто :) - person Sriram Sakthivel; 14.04.2015
comment
Это было несколько сложно для нас — даже несмотря на то, что компилятор C#, который поддерживал await, был выпущен, компилятор Roslyn еще не поддерживал его. Мы не могли использовать его в кодовой базе IDE, потому что пытались перейти на самостоятельный хостинг. Теперь мы можем использовать функции, которые еще не поставлялись всему миру, а раньше было наоборот! - person Jason Malinowski; 17.04.2015

Вот как это было на самом деле (без догадок) сделано командой C#, согласно Эрику Липперту:

Компиляторы C# от 1.0 до 5.0 были написаны на C++. Довольно долго — больше года — мы писали компилятор Roslyn C# на C# и компилировали его с помощью C# 4.0. (С# 5.0 параллельно разрабатывалась сестринской командой.) День, когда мы смогли скомпилировать компилятор Roslyn, а затем развернуться и снова скомпилировать его с помощью только что созданного компилятора, был счастливым днем.

Хорошая статья о экономическом обосновании начальной загрузки компилятора от Мэдса Торгерсена:

«Вот, наконец, наше ценностное предложение: сделать так, чтобы в мире была только одна кодовая база, которая понимает C#, которую разделяли бы все, кто хочет создавать инструменты вместо кода!»

person Amittai Shapira    schedule 03.05.2015

Я предполагаю, что для этого использовался существующий компилятор C#. Я имею в виду, что полностью самозагружаемый компилятор — это хорошо, но в данном случае это не обязательно.

person Georg    schedule 14.04.2015

Почитайте

http://en.wikipedia.org/wiki/Bootstrapping_%28compilers%29

Если нужно получить компилятор для языка X (который написан на языке X), возникает вопрос, как написать первый компилятор. Различные методы, которые используются на практике для решения этой проблемы с курицей или яйцом, включают:

Реализация интерпретатора или компилятора для языка X на языке Y. Никлаус Вирт сообщил, что он написал первый компилятор Pascal на Fortran. [Необходима цитата] Другой интерпретатор или компилятор для X уже был написан на другом языке Y; именно так Scheme часто загружается.

Но для специфики Roslyn, я бы предположил, что он собран с помощью компилятора С# (до Roslyn), а затем собран с самим собой :) (первые несколько запусков), как только он станет стабильным, они, вероятно, просто создадут Roslyn с помощью Roslyn :)

Я бы также предположил, что все это автоматизировано и протестировано.

person Steve Drake    schedule 14.04.2015