Как Go написан на Go, или История одного парадокса.
Сегодня коллега задал вопрос, который заставил меня улыбнуться: "Как вообще может быть, что Go написан на Go?" И правда, звучит парадоксально, но за этим стоит красивая инженерная история.
Изначально компилятор Go был написан на C. Кен Томпсон и команда начали именно так в 2007 году, используя yacc для парсера. Это логично... Нужно же было с чего-то начать. Первые версии Go (с 1.0 до 1.4) компилировались именно C-компилятором. Но у команды был план.
В 2013 году началась большая работа по переписыванию компилятора на сам Go. Процесс был хитрый: сначала написали транслятор, который автоматически переводил C-код в Go-код, затем постепенно рефакторили и переписывали части вручную. К версии 1.5 (август 2015) компилятор Go полностью стал self-hosted, то есть написан на том же языке, который компилирует.
Зачем это было нужно? Во-первых, dogfooding. Команда Go теперь сама использует свой язык для самых критичных компонентов, что заставляет делать его лучше. Во-вторых, барьер входа для контрибьюторов резко снизился, не нужно знать C, чтобы улучшать компилятор Go. В-третьих, все оптимизации и улучшения языка автоматически ускоряют и сам компилятор.
Я регулярно заглядываю в исходники компилятора, чтобы понять, как работают сложные вещи и как пишут код лучшие умы. И знаете что? Код там удивительно читаемый! Это отличный пример того, как писать на Go правильно, просто, понятно и эффективно.
P.S. Кстати, процесс, когда компилятор языка написан на самом языке, называется bootstrapping. И да, для первой компиляции нового компилятора Go вам всё ещё нужна предыдущая версия Go. Вот такая рекурсия 🔄
Post #36
250

- 🔥 4