> На каком языке написан компилятор Go (Go)

Уровень: middle · Роль: backend · Язык: Go · Категория: Технические вопросы

Компании: ЦУМ

Стек: Go

> Пример ответа

Короткий ответ

Компилятор Go (gc) написан на самом Go. Первая версия была написана на C, но начиная с Go 1.5 компилятор полностью самодостаточен - это называется self-hosting. Также существует альтернативный компилятор gccgo, написанный на C++, но основной и официальный - gc на Go.

Подробное объяснение

Исторически компилятор Go (исходно назывался gc) был написан на C Кеном Томпсоном и Робом Пайком. Однако в 2015 году, с выходом Go 1.5, произошёл важный переход: компилятор был переписан на сам Go. Это стало возможным благодаря тому, что к тому моменту язык и его runtime достигли достаточной зрелости.

Процесс перехода включал несколько этапов:

  • сначала компилятор на C был переведён на Go вручную,
  • затем использовался сам Go для компиляции самого себя (bootstrap),
  • после этого C-версия была полностью удалена.

Сейчас компилятор gc состоит из нескольких компонентов, все они написаны на Go:

  • фронтенд (парсер, type checking),
  • middle-end (оптимизации, SSA-представление),
  • бэкенд (генерация машинного кода).

Важно понимать, что компилятор не использует CGO для своей работы - он полностью автономен. Исключение составляет только начальная загрузка: для сборки Go из исходников требуется уже установленный Go (или bootstrap-инструмент, написанный на C, который используется только один раз).

На практике

Для backend-разработчика на Go знание языка компилятора важно в следующих аспектах:

  • при сборке Go из исходников нужно иметь уже установленный Go (версия должна быть не ниже определённой),
  • при отладке производительности полезно понимать, что компилятор сам написан на Go, поэтому его поведение можно анализировать стандартными инструментами (pprof, trace),
  • при чтении исходников компилятора (например, для понимания оптимизаций) не нужно знать C - достаточно Go.

Также стоит упомянуть, что gccgo (компилятор на базе GCC) написан на C++, но он используется реже и не является основным. Для большинства задач используется именно gc.

Пример кода

Не требуется, так как вопрос не предполагает написания кода.

Как отвечать на собеседовании

Начните с прямого ответа: "Основной компилятор Go написан на Go". Затем добавьте исторический контекст: "Раньше был на C, но с Go 1.5 переписан на сам Go". Упомяните альтернативу gccgo, но подчеркните, что это не основной путь. Если спросят про bootstrap, объясните, что для сборки нужен уже установленный Go, а для самых первых версий использовался C.

Хорошо показать понимание термина self-hosting и объяснить, почему это важно: компилятор может использовать все возможности языка, включая горутины и сборщик мусора, что упрощает его разработку.

Что проверяет интервьюер

Интервьюер проверяет:

  • базовые знания экосистемы Go,
  • понимание процесса bootstrap,
  • осведомлённость об истории развития языка,
  • способность отличать основной компилятор от альтернативных реализаций.

Это вопрос на общую эрудицию, но он показывает, насколько кандидат погружён в инструментарий, которым пользуется ежедневно.

Типичные ошибки

  • Утверждение, что компилятор написан на C - это верно только для версий до 1.5.
  • Путаница между gc и gccgo - это разные компиляторы с разной архитектурой.
  • Заявление, что компилятор использует CGO - это не так, компилятор полностью автономен.
  • Непонимание bootstrap: некоторые считают, что Go компилируется "сам из ничего", но для сборки нужна предыдущая версия Go или специальный bootstrap-инструмент на C.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью