Как работает компилятор Go1?

Я занимался Go около месяца для школьного проекта, и я заметил пакеты go / ast, go / token, go / parser и т. Д. В папке src / pkg / go. Однако компилятор gc был основан на файлах C, расположенных в src / cmd / gc.

Мой вопрос касается новой команды go в Go1, которая строит и запускает программы: этот инструмент зависит от пакетов, на которые я ссылался выше? т.е. если я добавлю новый токен в /go/token/token.go, будет ли он распознан новым компилятором go?

Компилятор Go написан в чистом C и не использует пакеты под go/ . В дереве источников Go его лексер живет в src / cmd / gc / lex.c, а его грамматика Bison – src / cmd / gc / go.y.

go/ packages используются в таких инструментах, как godoc, gofmt и различные команды инструментов go. Может быть, когда-нибудь они могут быть использованы для написания компилятора Go в Go, но никто пока не очень далеко продвинулся по этому пути.

Примечание (18 декабря 2013 г.), есть планы переместить компилятор с C на сам Go:

« Go 1.3+ Compiler Overhaul » (Russ Cox)

В этом контексте будут задействованы пакеты, такие как go / parser, и в «Фазе 5» упоминаются:

Замените переднюю часть новыми (возможно, новыми) версиями go/parser и go/types .
Роберт Гриземер обсудил возможность разработки новых API go/parser и go/types в какой-то момент, основываясь на опыте с текущими (и под новыми именами, чтобы сохранить совместимость Go 1).
Работа по подключению их к задней части компилятора может помочь в разработке дизайна новых API.


Это, вероятно, свидетельство о том, насколько стабильным стал этот язык, поскольку ранее упоминавшийся ранее « A Tour of Go » (июнь 2012 года) четко заявил:

Тот факт, что Go не был написан сам по себе, также значительно облегчил существенные изменения языка.
Перед первым выпуском мы прошли через несколько оптовых синтаксических переворотов, и я рад, что нам не пришлось беспокоиться о том, как мы собираемся перезагружать компилятор или обеспечивать некоторую обратную совместимость во время этих изменений.

Вопрос « Есть ли какой-нибудь план для загрузки в Go Go, чтобы написать компилятор Go в Go? », Упомянутый в то время (опять же, июнь 2012 года):

Нет немедленного плана. Go поставляется с программным анализатором Go, написанным на Go, поэтому первая часть уже выполнена, и в работе есть экспериментальный тип проверки, но они предназначены главным образом для написания инструментов анализа программ.

В прошлом я работал над загруженными языками, и я обнаружил, что самонастраивание не обязательно подходит для языков, которые часто меняются. Это напомнило мне, что я поднимаюсь на скалу и заворачиваю крюки в скалу время от времени, чтобы поймать тебя, если ты упадешь.

этот инструмент зависит от пакетов, на которые я ссылался выше?

Инструмент «go» зависит от этих пакетов

если я добавлю новый токен в /go/token/token.go, будет ли он распознан новым компилятором go?

Нет.

  • В чем разница функций и методов в Go?
  • Невозможно преобразовать строку в интерфейс {}
  • Unmarshal JSON с неизвестными полями
  • Макетные функции в Go
  • Как сбросить gotoutine stacktraces?
  • Как я могу запустить проект с несколькими файлами в основном пакете?
  • Функциональная подпись без функции
  • как слушать N каналов? (оператор динамического выбора)
  • Имена ключевых слов JSON с JSON Marshal в Go
  • есть ли способ создать экземпляр структуры из строки?
  • В обработчиках HTTP Go, почему ResponseWriter имеет значение, но запрашивает указатель?
  • Давайте будем гением компьютера.