Страница 1 из 1
Go: утилиты (tool)
Добавлено: 14 мар 2023, 12:04
Olej
В GoLang...
Есть
команды Go:
Код: Выделить всё
olej@R420:~$ go help
Go is a tool for managing Go source code.
Usage:
go <command> [arguments]
The commands are:
bug start a bug report
build compile packages and dependencies
clean remove object files and cached files
doc show documentation for package or symbol
env print Go environment information
fix update packages to use new APIs
fmt gofmt (reformat) package sources
generate generate Go files by processing source
get add dependencies to current module and install them
install compile and install packages and dependencies
list list packages or modules
mod module maintenance
work workspace maintenance
run compile and run Go program
test test packages
tool run specified go tool
version print Go version
vet report likely mistakes in packages
Use "go help <command>" for more information about a command.
Additional help topics:
buildconstraint build constraints
buildmode build modes
c calling between Go and C
cache build and test caching
environment environment variables
filetype file types
go.mod the go.mod file
gopath GOPATH environment variable
gopath-get legacy GOPATH go get
goproxy module proxy protocol
importpath import path syntax
modules modules, module versions, and more
module-get module-aware go get
module-auth module authentication using go.sum
packages package lists and patterns
private configuration for downloading non-public code
testflag testing flags
testfunc testing functions
vcs controlling version control with GOVCS
Use "go help <topic>" for more information about that topic.
А есть ещё
утилиты Go (собственно, tool - одна из
команд):
Код: Выделить всё
olej@R420:~$ go tool
addr2line
asm
buildid
cgo
compile
covdata
cover
dist
doc
fix
link
nm
objdump
pack
pprof
test2json
trace
vet
Соотношение
команд и
утилит не совсем понятно ...
Но такое впечатление ... что утилиты - это нечто служебное, больше для отладочных целей и ... "вчерашнее" - уходящее из эксплуатации. Но тут я, может, и ошибаюсь...
Go: утилиты (tool)
Добавлено: 14 мар 2023, 14:38
Olej
Olej писал(а): ↑14 мар 2023, 12:04
А есть ещё утилиты Go (собственно, tool - одна из команд):
Собственно, интерес, в первую очередь, из-за утилит: compile + link
И в чём интерес? Кроме всего прочего, что
во множестве вопросы по Интернет: почему возникают упорные ошибки при
любой компиляции:
Код: Выделить всё
olej@nvidia:~/2023/own.BOOKs/BHV.Go.2/examples/tools$ cat tiny.go
package main
import "fmt"
func main() { fmt.Println("Hello, 世界") }
Код: Выделить всё
olej@nvidia:~/2023/own.BOOKs/BHV.Go.2/examples/tools$ go tool compile tiny.go
tiny.go:2:8: could not import fmt (file not found)
Ну и любой исходник Go ... из числа тех с которыми я экспериментировал раньше:
Код: Выделить всё
olej@nvidia:~/2023/own.BOOKs/BHV.Go.2/examples/tools$ go tool compile hello.go
hello.go:8:2: could not import fmt (file not found)
hello.go:9:2: could not import os (file not found)
Go: утилиты (tool)
Добавлено: 14 мар 2023, 14:57
Olej
Olej писал(а): ↑14 мар 2023, 14:38
во множестве вопросы по Интрнет: почему возникают упорные ошибки при любой компиляции:
Т.е. ошибки там, где элементарный import (и успешный при build):
Код: Выделить всё
olej@nvidia:~/2023/own.BOOKs/BHV.Go.2/examples/tools$ go build tiny.go
olej@nvidia:~/2023/own.BOOKs/BHV.Go.2/examples/tools$ ls -l tiny
-rwxrwxr-x 1 olej olej 1762967 мар 14 13:45 tiny
olej@nvidia:~/2023/own.BOOKs/BHV.Go.2/examples/tools$ ./tiny
Hello, 世界
В принципе, можно добиться отдельной компиляции этого (и всякого другого) приложения ... но сначала зафиксируем:
Код: Выделить всё
olej@nvidia:~$ du -hs `go env GOROOT`/pkg
421M /home/olej/goroot/pkg
А вот теперь проделаем (подсказка от разработчиков GoLang):
Код: Выделить всё
olej@nvidia:~$ GODEBUG=installgoroot=all go install std
И теперь:
Код: Выделить всё
olej@nvidia:~/2023/own.BOOKs/BHV.Go.2/examples/tools$ go tool compile tiny.go
Код: Выделить всё
olej@nvidia:~/2023/own.BOOKs/BHV.Go.2/examples/tools$ go tool compile hello.go
Вот вам и компиляция
Но GoLang при этом подтянул (единоразово) довольно много информации по пакетам:
Код: Выделить всё
olej@nvidia:~$ du -hs `go env GOROOT`/pkg
531M /home/olej/goroot/pkg
Сравните с цифрой выше: +110Mb ... что конкретно он там подтягивал - я не разбирался.
Go: утилиты (tool)
Добавлено: 14 мар 2023, 15:00
Olej
Olej писал(а): ↑14 мар 2023, 14:57
Вот вам и компиляция
Olej писал(а): ↑14 мар 2023, 14:57
Код: Выделить всё
olej@nvidia:~/2023/own.BOOKs/BHV.Go.2/examples/tools$ go tool compile tiny.go
Код: Выделить всё
olej@nvidia:~/2023/own.BOOKs/BHV.Go.2/examples/tools$ ls -l tiny.o
-rw-rw-r-- 1 olej olej 8048 мар 14 13:44 tiny.o
Но!
В Go это не объектный файл!
Код: Выделить всё
olej@nvidia:~/2023/own.BOOKs/BHV.Go.2/examples/tools$ file tiny.o
tiny.o: current ar archive
Это AR архив Linux:
Код: Выделить всё
olej@nvidia:~/2023/own.BOOKs/BHV.Go.2/examples/tools$ ar -t tiny.o
__.PKGDEF
_go_.o
Go: утилиты (tool)
Добавлено: 14 мар 2023, 15:06
Olej
Olej писал(а): ↑14 мар 2023, 15:00
В Go это не объектный файл!
Olej писал(а): ↑14 мар 2023, 15:00
Это AR архив Linux:
И есть среди тех же
утилит инструмент для его изучения:
Код: Выделить всё
olej@nvidia:~/2023/own.BOOKs/BHV.Go.2/examples/tools$ go tool objdump tiny.o
TEXT main.main(SB) gofile../home/olej/2023/own.BOOKs/BHV.Go.2/examples/tools/tiny.go
tiny.go:4 0x130c 493b6610 CMPQ 0x10(R14), SP [2:2]R_USEIFACE:type:string [2:2]R_USEIFACE:type:*os.File
tiny.go:4 0x1310 764c JBE 0x135e
tiny.go:4 0x1312 55 PUSHQ BP
tiny.go:4 0x1313 4889e5 MOVQ SP, BP
tiny.go:4 0x1316 4883ec38 SUBQ $0x38, SP
tiny.go:4 0x131a 440f117c2428 MOVUPS X15, 0x28(SP)
tiny.go:4 0x1320 488d1500000000 LEAQ 0(IP), DX [3:7]R_PCREL:type:string
tiny.go:4 0x1327 4889542428 MOVQ DX, 0x28(SP)
tiny.go:4 0x132c 488d1500000000 LEAQ 0(IP), DX [3:7]R_PCREL:main..stmp_0<1>
tiny.go:4 0x1333 4889542430 MOVQ DX, 0x30(SP)
print.go:314 0x1338 488b1d00000000 MOVQ 0(IP), BX [3:7]R_PCREL:os.Stdout
print.go:314 0x133f 488d0500000000 LEAQ 0(IP), AX [3:7]R_PCREL:go:itab.*os.File,io.Writer
print.go:314 0x1346 488d4c2428 LEAQ 0x28(SP), CX
print.go:314 0x134b bf01000000 MOVL $0x1, DI
print.go:314 0x1350 4889fe MOVQ DI, SI
print.go:314 0x1353 e800000000 CALL 0x1358 [1:5]R_CALL:fmt.Fprintln
tiny.go:4 0x1358 4883c438 ADDQ $0x38, SP
tiny.go:4 0x135c 5d POPQ BP
tiny.go:4 0x135d c3 RET
tiny.go:4 0x135e e800000000 CALL 0x1363 [1:5]R_CALL:runtime.morestack_noctxt
tiny.go:4 0x1363 eba7 JMP main.main(SB)
Go: утилиты (tool)
Добавлено: 14 мар 2023, 15:11
Olej
Olej писал(а): ↑14 мар 2023, 14:57
Вот вам и компиляция
Что мы можем получить от этой
утилиты компиляции?
Прежде всего, собрать исполнимое приложение, ещё одной
утилитоой Go link:
Код: Выделить всё
olej@nvidia:~/2023/own.BOOKs/BHV.Go.2/examples/tools$ go tool link tiny.o
olej@nvidia:~/2023/own.BOOKs/BHV.Go.2/examples/tools$
Код: Выделить всё
olej@nvidia:~/2023/own.BOOKs/BHV.Go.2/examples/tools$ ls -l a.out
-rwxrwxr-x 1 olej olej 1762931 мар 14 14:05 a.out
(Как и всегда и везде, выходной файл мы можем сразу определить опцией -o ...)
И сравнить его с тем, что собиралось
командой build:
Код: Выделить всё
olej@nvidia:~/2023/own.BOOKs/BHV.Go.2/examples/tools$ ls -l tiny
-rwxrwxr-x 1 olej olej 1762967 мар 14 13:45 tiny
Похоже ... хотя чуть-чуть и отличается размером (из-за дефаултных опций, нужно думать)...
И запустить:
Код: Выделить всё
olej@nvidia:~/2023/own.BOOKs/BHV.Go.2/examples/tools$ ./a.out
Hello, 世界
Go: утилиты (tool)
Добавлено: 14 мар 2023, 15:14
Olej
Olej писал(а): ↑14 мар 2023, 15:11
Что мы можем получить от этой утилиты компиляции?
Что очень ценно - можем (опция -m) изучить что из переменных кода разместится в хипе, а что в стеке:
Код: Выделить всё
olej@nvidia:~/2023/own.BOOKs/BHV.Go.2/examples/tools$ go tool compile -m hello.go
/home/olej/2023/own.BOOKs/BHV.Go.2/examples/tools/hello.go:13:13: inlining call to fmt.Println
/home/olej/2023/own.BOOKs/BHV.Go.2/examples/tools/hello.go:14:12: inlining call to fmt.Printf
/home/olej/2023/own.BOOKs/BHV.Go.2/examples/tools/hello.go:21:12: inlining call to fmt.Printf
/home/olej/2023/own.BOOKs/BHV.Go.2/examples/tools/hello.go:22:12: inlining call to fmt.Printf
/home/olej/2023/own.BOOKs/BHV.Go.2/examples/tools/hello.go:13:13: ... argument does not escape
/home/olej/2023/own.BOOKs/BHV.Go.2/examples/tools/hello.go:13:14: "ты кто будешь?" escapes to heap
/home/olej/2023/own.BOOKs/BHV.Go.2/examples/tools/hello.go:15:20: make([]byte, 120) does not escape
/home/olej/2023/own.BOOKs/BHV.Go.2/examples/tools/hello.go:19:33: string(буфер[:Ω - 1]) escapes to heap
/home/olej/2023/own.BOOKs/BHV.Go.2/examples/tools/hello.go:21:12: ... argument does not escape
/home/olej/2023/own.BOOKs/BHV.Go.2/examples/tools/hello.go:21:78: Ω escapes to heap
/home/olej/2023/own.BOOKs/BHV.Go.2/examples/tools/hello.go:22:12: ... argument does not escape
/home/olej/2023/own.BOOKs/BHV.Go.2/examples/tools/hello.go:22:35: ответ escapes to heap
Go: утилиты (tool)
Добавлено: 14 мар 2023, 15:19
Olej
Olej писал(а): ↑14 мар 2023, 12:04
Соотношение команд и утилит не совсем понятно ...
Но такое впечатление ... что утилиты - это нечто служебное, больше для отладочных целей
И теперь укрепляемся в своей догадке, что
утилиты Go, в отличие от
команд Go, это служебный инструмент ... для более тонкого анализа и для разработчиков...
И по обсуждениям по Интренет с
разработчиками GoLang следует что:
- используйте
команду build для создания приложений...
-
утилиты compile + link
не следует использовать без нужды...
- они больше использовались на
ранних версиях GoLang.