Компилятор Go переписан на Go

Компилятор Go переписан на Go

532

Вот таковыми словами начинается комментарий к свежайшему коммиту в master-ветку Go:
This change deletes the C implementations of the Go compiler and assembler from the master branch. («Эти конфигурации убирают C-реализацию компилятора и ассемблера Go из главной ветки»)

Это был на 90% автоматический процесс. Эти слова — труд практически года работы команды Go по переписыванию компилятора с C на Go. Сейчас Go компилирует сам себя.

Для чего это было необходимо и чуток больше подробностей под катом.

Картина: Твиттер Russ Cox

Ну и как пишут сами создатели — «Programming in Go is fun. С одной стороны, непременно, С, как ни крути — скорее, но с иной — разумеется, что скорость разработки и продуктивность на С — еще меньше, чем на Go, а кое-где и настоящий show-stopper. Кроме чисто академического энтузиазма («может ли язык скомпилировать сам себя»), который так либо по другому возникает во всех языковых коммьюнити, и фуррора в котором фактически никто не добивался, вопросец с переписыванием компилятора Go имеет точно таковой же практический смысл, как и переписывание хоть какой иной программы. Programming in C is not.».

К примеру, для ускорения сборщика мусора и приближения его характеристик к допустимым в hard real-time мире, издавна планировалась реализация true concurrent garbage collector (не делающего stop-the-world), но воплотить её на C не представлялось вероятным. На Go его воплотить будет намного проще. Конфигурации, которые создатели Go желали воплотить в компиляторе/рантайме, нередко упирались в практическую сложность их реализации.

80000+ строк кода на С переписать, ничего не пропустив и не утратив — фактически нереально. Было принято решение, беря во внимание схожесть грамматики языков, написать автоматический конвертор из С в Go и применять его. Один большой gofix. Основной вопросец, который появился перед командой — как, фактически, этот мощный переезд выполнить?

Задачка ставилась настоящей — конвертер должен был работать с кодовой базой Go, на всепригодный конвертер на все случаи жизни не замахивались. 99% кода конвертируется автоматом, оставшиеся сложные моменты можно уже доделывать руками.

Вот увлекательное видео на эту тему с прошедшего GopherCon. Поглядите, кому увлекательны подробности реализации:

Слайды здесь: talks.golang.org/2014/c2go.slide

Впереди еще много работы по оптимизации новейшего компилятора — всё таки основное волнение у народа было на тему «а вдруг Go-компилятор станет приметно медленее», но Go 1.5 уже будет без единой строки С-кода, и в распоряжении разрабов автоматом покажутся все инструменты, обычные для Go-программистов для оптимизации и профилирования кода — race-сенсор, различные профайлеры, инструменты статического анализа кода и тому схожее.

Выпуск Go 1.5 официально планируется на август 2015-го.

Можно смело поздравить всю команду и всех причастных к этому принципиальному в истории Go событию!

habrahabr.ru UPD. В комментах справедливо увидели, что переписывание компилятора — не таковая уж уникальность и утверждать, что не достаточно кто добивался фуррора в этом — некорректно.