На выходных я наткнулся на пару видеороликов о том, как компилятор Go был переведен с C на Go. Компилятор Go изначально был написан на C, и после того, как он достиг определенного уровня зрелости, создатели стали искать способы начальной загрузки компилятора на Go, чтобы язык мог унаследовать некоторые из преимуществ Go и иметь возможность делать то, что было бы невозможно, если бы все еще основывалось на C.

Вот первое видео с GopherCon, где Расс Кокс рассказывает о своем подходе:

А вот сессия Роба Пайка в следующем году о том, как все прошло, с более подробной информацией о миграции:

Теоретически это блестящий подход, который выглядит примерно так:

  1. Разберите код C с помощью простого парсера yacc
  2. Сгенерировать дерево синтаксического анализа. Настройте дерево, чтобы исправить и переписать C-isms
  3. Просмотрите дерево синтаксического анализа и выведите соответствующий код Go
  4. Компиляция кода Go и проверка вывода путем сравнения с компилятором Go на основе C
  5. Повторяйте, пока оба компилятора не сгенерируют одинаковый результат.

Предостережение заключается в том, что синтаксический анализатор C из шага 1 является очень специализированным, созданным в соответствии с очень специфическим диалектом, которому следуют оригинальные авторы, и не предназначен для использования в качестве конвертера общего назначения, что представляет собой гораздо большую проблему. Кроме того, это не был 100% автоматический процесс, и еще есть код, который нужно скомпилировать вручную, но это упрощает работу по преобразованию, которая в противном случае была бы утомительной работой.

После преобразования в Go может происходить процесс рефакторинга, профилирования и реструктуризации для развития базы кода с помощью цепочки инструментов Go.

Вот как это делается, ребята.