Как стать автором
Обновить

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

Время на прочтение 2 мин
Количество просмотров 43K
Вот такими словами начинается комментарий к свежему коммиту в 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 событию!

UPD. В комментариях справедливо заметили, что переписывание компилятора — не такая уж редкость и утверждать, что мало кто добивался успеха в этом — неправильно.
Теги:
Хабы:
+60
Комментарии 112
Комментарии Комментарии 112

Публикации

Истории

Работа

Go разработчик
122 вакансии

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн