На каком языке написан компилятор Go
Что проверяют
Знаете ли вы, что тулчейн Go самодостаточный, и понимаете ли, что такое bootstrap. Вопрос на кругозор, но продолжение обычно содержательное: как собирается сам компилятор и почему сборка Go такая быстрая.
Как отвечать
Штатный компилятор (gc, он же пакет cmd/compile) написан на Go. Изначально компилятор и рантайм были написаны на C, и в версии Go 1.5 их перевели на Go, а код на C из дерева убрали. С тех пор тулчейн собирает сам себя: чтобы собрать новую версию, нужен уже установленный Go предыдущей версии, это и называется bootstrap.
Полезно добавить детали, которые отличают заученный ответ от понимания:
- рантайм (планировщик горутин, сборщик мусора, аллокатор) тоже на Go, плюс ассемблерные вставки для переключения стеков и системных вызовов, причём ассемблер в Go свой, в стиле Plan 9;
- стандартная библиотека на Go;
gcне единственная реализация: естьgccgo, фронтенд в составе GCC, иTinyGoповерх LLVM для микроконтроллеров и wasm;- линкер и
go buildэто отдельные части тулчейна, а командаgoлишь оркестрирует сборку.
Где спотыкаются
Отвечают «на C», опираясь на старые статьи, либо наоборот утверждают, что Go всегда был написан на Go. Правильный ответ содержит обе половины: было на C, стало на Go.
Делают вывод, что компилятор быстрый именно потому, что написан на Go. Скорость сборки идёт от устройства языка: явные зависимости пакетов, отсутствие заголовочных файлов и препроцессора, компиляция пакета в объектный файл с экспортными данными, которые не надо перечитывать целиком.
Путают компилятор с рантаймом. Сборщик мусора и планировщик это не часть компилятора, они линкуются в каждый бинарник, и вопрос «на чём написан GC» ведёт совсем в другую сторону разговора.