Ось такими словами починається коментар до свіжого комміту в 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. У коментарях справедливо помітили, що переписування компілятора - не така вже рідкість і стверджувати, що мало хто досягав успіху в цьому - неправильно.
