Вот такими словами начинается комментарий к свежему коммиту в master-ветку Go:
This change deletes the C implementations of the Go compiler and assembler from the master branch.
(«Эти изменения удаляют C-реализацию компилятора и ассемблера Go из главной ветки»)
Эти слова — труд почти года работы команды Go по переписыванию компилятора с C на Go. Это был на 90% автоматический процесс. Теперь Go компилирует сам себя.
Зачем это было нужно и чуть больше подробностей под катом.
Картинка: Твиттер Russ Cox
Помимо чисто академического интереса («может ли язык скомпилировать сам себя»), который так или иначе возникает во всех языковых коммьюнити, и успеха в котором практически никто не добивался, вопрос с переписыванием компилятора Go имеет точно такой же практический смысл, как и переписывание любой другой программы. С одной стороны, безусловно, С, как ни крути — быстрее, но с другой — очевидно, что скорость разработки и продуктивность на С — гораздо меньше, чем на Go, а кое-где и реальный show-stopper. Ну и как пишут сами авторы — «Programming in Go is fun. Programming in C is not.».
Изменения, которые авторы Go хотели реализовать в компиляторе/рантайме, часто упирались в практическую сложность их реализации. К примеру, для ускорения сборщика мусора и приближения его показателей к допустимым в hard real-time мире, давно планировалась реализация true concurrent garbage collector (не делающего stop-the-world), но реализовать её на C не представлялось возможным. На Go его реализовать будет намного проще.
Главный вопрос, который возник перед командой — как, собственно, этот массивный переезд осуществить? 80000+ строк кода на С переписать, ничего не пропустив и не потеряв — практически нереально. Было принято решение, учитывая схожесть грамматики языков, написать автоматический конвертор из С в Go и использовать его. Один большой gofix.
Задача ставилась реальной — конвертер должен был работать с кодовой базой Go, на универсальный конвертер на все случаи жизни не замахивались. 99% кода конвертируется автоматически, оставшиеся сложные моменты можно уже доделывать руками.
Вот интересное видео на эту тему с прошлого GopherCon. Посмотрите, кому интересны подробности реализации.
Слайды тут: talks.golang.org/2014/c2go.slide
Впереди еще много работы по оптимизации нового компилятора — всё таки основное волнение у народа было на тему «а вдруг Go-компилятор станет заметно медленее», но Go 1.5 уже будет без единой строчки С-кода, и в распоряжении разработчиков автоматически появятся все инструменты, привычные для Go-программистов для оптимизации и профилирования кода — race-детектор, всевозможные профайлеры, инструменты статического анализа кода и тому подобное.
Выпуск Go 1.5 официально планируется на август 2015-го.
Можно смело поздравить всю команду и всех причастных к этому важному в истории Go событию!
Автор: divan0