Я начал читать о Roslyn, новом компиляторе C#, и мне было интересно, как был скомпилирован компилятор Roslyn?
Я понимаю, что boostrapping необходим для того, чтобы иметь "я компилятор хостинга", и мне стало интересно, как компилятор Roslyn "загрузился"?
Как загружается компилятор Roslyn C#?
Ответы (4)
Начальная загрузка является проблемой только в том случае, если еще нет существующей реализации языка. В этом случае не было, так что это легко.
- Скомпилируйте первую версию Roslyn, используя существующий компилятор C#.
- Затем перекомпилируйте его, используя только что скомпилированную сборку Roslyn.
- Готово.
Вот как это было на самом деле (без догадок) сделано командой C#, согласно Эрику Липперту:
Компиляторы C# от 1.0 до 5.0 были написаны на C++. Довольно долго — больше года — мы писали компилятор Roslyn C# на C# и компилировали его с помощью C# 4.0. (С# 5.0 параллельно разрабатывалась сестринской командой.) День, когда мы смогли скомпилировать компилятор Roslyn, а затем развернуться и снова скомпилировать его с помощью только что созданного компилятора, был счастливым днем.
Хорошая статья о экономическом обосновании начальной загрузки компилятора от Мэдса Торгерсена:
«Вот, наконец, наше ценностное предложение: сделать так, чтобы в мире была только одна кодовая база, которая понимает C#, которую разделяли бы все, кто хочет создавать инструменты вместо кода!»
Я предполагаю, что для этого использовался существующий компилятор C#. Я имею в виду, что полностью самозагружаемый компилятор — это хорошо, но в данном случае это не обязательно.
Почитайте
http://en.wikipedia.org/wiki/Bootstrapping_%28compilers%29
Если нужно получить компилятор для языка X (который написан на языке X), возникает вопрос, как написать первый компилятор. Различные методы, которые используются на практике для решения этой проблемы с курицей или яйцом, включают:
Реализация интерпретатора или компилятора для языка X на языке Y. Никлаус Вирт сообщил, что он написал первый компилятор Pascal на Fortran. [Необходима цитата] Другой интерпретатор или компилятор для X уже был написан на другом языке Y; именно так Scheme часто загружается.
Но для специфики Roslyn, я бы предположил, что он собран с помощью компилятора С# (до Roslyn), а затем собран с самим собой :) (первые несколько запусков), как только он станет стабильным, они, вероятно, просто создадут Roslyn с помощью Roslyn :)
Я бы также предположил, что все это автоматизировано и протестировано.