2012-04-21 3 views
3

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

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

ответ

1

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

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

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

No.

+0

Что делать, если я добавил новый токен и соответствующий узел узла и метод анализа? Или я просто полностью ошибаюсь. – calvin

+0

Инструмент go запускает компилятор Go, но компилятор Go - это проект C, он не использует пакет парсеров Go. – zzzz

5

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

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

+1

Существует непосредственное преимущество при написании компилятора на языке, который он должен компилировать: корм для собак позволяет вам чувствовать свой язык. Однако это также приводит к барьерам: переносимость. Наличие компилятора C для вашего языка означает, что вы можете заставить компилятор работать на любой платформе, которая вам нравится. Уверенный, что время выполнения и кодеген все еще нуждаются в работе, но это меньший разрыв (хотя он все еще может быть жестким). –

+0

На самом деле есть llgo, который является компилятором Go, написанным в Go, используя llvm в качестве backend, еще не завершен, но, кажется, достаточно продвинутый: https://github.com/axw/llgo – uriel

2

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

"Go 1.3+ Compiler Overhaul" (Russ Cox)

В этом контексте пакетах, как идти/анализатор будет принимать участие, и «Фаза 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, так что первая часть уже сделана, и есть экспериментальный тип проверка. в работах, но это в основном для написания инструментов анализа программ.

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

+0

Примечание для себя: И это было моим ** 9000-й ответ ** на переполнение стека через 63 месяца! Менее 6 месяцев после [8000-го ответа] (http://stackoverflow.com/a/17569094/6309). До этого: [7000-й ответ] (http://stackoverflow.com/a/14274272/6309), [6000-й ответ] (http://stackoverflow.com/a/11644343/6309), [5000-й ответ] (http: //stackoverflow.com/a/7917396/6309), [4000-й ответ] (http://stackoverflow.com/a/4953561/6309), [3000-й ответ] (http://stackoverflow.com/a/3074849/ 6309), [2000-й ответ] (http://stackoverflow.com/a/2027976/6309) и [1000-й ответ] (http://stackoverflow.com/a/665252/6309). – VonC