Go: утилиты (tool)

Вопросы написания собственного программного кода (на любых языках)

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Go: утилиты (tool)

Непрочитанное сообщение Olej » 14 мар 2023, 12:04

В 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
Соотношение команд и утилит не совсем понятно ...
Но такое впечатление ... что утилиты - это нечто служебное, больше для отладочных целей и ... "вчерашнее" - уходящее из эксплуатации. Но тут я, может, и ошибаюсь...

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Go: утилиты (tool)

Непрочитанное сообщение Olej » 14 мар 2023, 14:38

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)
Вложения
tiny.go
(74 байт) 18 скачиваний
hello.go
(557 байт) 19 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Go: утилиты (tool)

Непрочитанное сообщение Olej » 14 мар 2023, 14:57

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

Вот вам и компиляция :lol:
Но GoLang при этом подтянул (единоразово) довольно много информации по пакетам:

Код: Выделить всё

olej@nvidia:~$ du -hs `go env GOROOT`/pkg
531M    /home/olej/goroot/pkg
Сравните с цифрой выше: +110Mb ... что конкретно он там подтягивал - я не разбирался.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Go: утилиты (tool)

Непрочитанное сообщение Olej » 14 мар 2023, 15:00

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

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Go: утилиты (tool)

Непрочитанное сообщение Olej » 14 мар 2023, 15:06

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)

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Go: утилиты (tool)

Непрочитанное сообщение Olej » 14 мар 2023, 15:11

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, 世界

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Go: утилиты (tool)

Непрочитанное сообщение Olej » 14 мар 2023, 15:14

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

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Go: утилиты (tool)

Непрочитанное сообщение Olej » 14 мар 2023, 15:19

Olej писал(а):
14 мар 2023, 12:04
Соотношение команд и утилит не совсем понятно ...
Но такое впечатление ... что утилиты - это нечто служебное, больше для отладочных целей
И теперь укрепляемся в своей догадке, что утилиты Go, в отличие от команд Go, это служебный инструмент ... для более тонкого анализа и для разработчиков...

И по обсуждениям по Интренет с разработчиками GoLang следует что:
- используйте команду build для создания приложений...
- утилиты compile + link не следует использовать без нужды...
- они больше использовались на ранних версиях GoLang.

Ответить

Вернуться в «Программирование»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 6 гостей