Go: TinyGo

встраиваемые модели

Модераторы: Olej, vikos

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

Go: TinyGo

Непрочитанное сообщение Olej » 05 фев 2024, 17:47

Ещё один инструмент ... в дополнение к GoLang (см. Go: инструментарий (продолжение)) - компилятор с языка Go: TinyGo

Overview
Short introduction to TinyGo
Самое интересное здесь вот что:
By using TinyGo you can actually compile and run a binary on a variety of bare metal hardware platforms. For example, you can run this program directly on a BBC micro:bit:

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

tinygo flash -target=microbit ./hello.go
т.е. можно программировать микрокотроллеры, в частности Arduino :!:
Типы поддерживаемых контроллеров - Microcontrollers
...
The introductory Arduino boards based on the 8-bit AVR processors work relatively well under TinyGo. But they have limited amounts of flash and static memory so they support only small applications (e.g. the fmt package may consume too much flash memory, and goroutines may consume too much static memory):

ATmega328P, used by Arduino Nano, Arduino UNO, etc.
...

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

Go: TinyGo

Непрочитанное сообщение Olej » 05 фев 2024, 17:58

Quick install / Linux
Linux install guide

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

olej@R420:~/2024/Go$ wget https://github.com/tinygo-org/tinygo/releases/download/v0.30.0/tinygo_0.30.0_amd64.deb
--2024-02-05 16:25:21--  https://github.com/tinygo-org/tinygo/releases/download/v0.30.0/tinygo_0.30.0_amd64.deb
Распознаётся github.com (github.com)… 140.82.112.4
Подключение к github.com (github.com)|140.82.112.4|:443... соединение установлено.
HTTP-запрос отправлен. Ожидание ответа… 302 Found
Адрес: https://objects.githubusercontent.com/github-production-release-asset-2e65be/136505169/0cea37b7-9d0b-4d21-ac0f-0c2c94cbc558?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAVCODYLSA53PQK4ZA%2F20240205%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20240205T142544Z&X-Amz-Expires=300&X-Amz-Signature=a6c49afeca48abecf77c525696d98e2c14b9e5725dbcdab3df4146349c42cf49&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=136505169&response-content-disposition=attachment%3B%20filename%3Dtinygo_0.30.0_amd64.deb&response-content-type=application%2Foctet-stream [переход]
--2024-02-05 16:25:22--  https://objects.githubusercontent.com/github-production-release-asset-2e65be/136505169/0cea37b7-9d0b-4d21-ac0f-0c2c94cbc558?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAVCODYLSA53PQK4ZA%2F20240205%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20240205T142544Z&X-Amz-Expires=300&X-Amz-Signature=a6c49afeca48abecf77c525696d98e2c14b9e5725dbcdab3df4146349c42cf49&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=136505169&response-content-disposition=attachment%3B%20filename%3Dtinygo_0.30.0_amd64.deb&response-content-type=application%2Foctet-stream
Распознаётся objects.githubusercontent.com (objects.githubusercontent.com)… 185.199.110.133, 185.199.108.133, 185.199.109.133, ...
Подключение к objects.githubusercontent.com (objects.githubusercontent.com)|185.199.110.133|:443... соединение установлено.
HTTP-запрос отправлен. Ожидание ответа… 200 OK
Длина: 126469036 (121M) [application/octet-stream]
Сохранение в: ‘tinygo_0.30.0_amd64.deb’

tinygo_0.30.0_amd64.deb            100%[==============================================================>] 120,61M  2,92MB/s    за 39s     

2024-02-05 16:26:01 (3,11 MB/s) - ‘tinygo_0.30.0_amd64.deb’ сохранён [126469036/126469036]

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

olej@R420:~/2024/Go$ ls -l tinygo_0.30.0_amd64.deb 
-rw-rw-r-- 1 olej olej 126469036 сен 21 16:38 tinygo_0.30.0_amd64.deb

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

olej@R420:~/2024/Go$ sudo dpkg -i tinygo_0.30.0_amd64.deb
[sudo] пароль для olej:       
Выбор ранее не выбранного пакета tinygo.
(Чтение базы данных … на данный момент установлено 587543 файла и каталога.)
Подготовка к распаковке tinygo_0.30.0_amd64.deb …
Распаковывается tinygo (0.30.0) …
Настраивается пакет tinygo (0.30.0) …

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

olej@R420:~/2024/Go$ which tinygo
/usr/local/bin/tinygo

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

olej@R420:~/2024/Go$ tinygo version
tinygo version 0.30.0 linux/amd64 (using go version go1.21.3 and LLVM version 16.0.1)
Ubuntu/Debian
You must have Go already installed on your machine in order to install TinyGo. We recommend Go v1.19 or above.
Каким-то образом он использует уже установленный GoLang ... пока я не пойму как :oops:

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

Go: TinyGo

Непрочитанное сообщение Olej » 05 фев 2024, 18:25

Olej писал(а):
05 фев 2024, 17:58
Linux install guide
Относительно программирования для Arduino:
Additional Requirements for Microcontrollers on Arch Linux

There are some additional requirements to compile TinyGo programs that can run on microcontrollers.
AVR (e.g. Arduino Uno)

To compile and flash TinyGo programs for AVR based processors such as the original Arduino Uno you must install avrdude:

avrdude package

This should allow you to flash TinyGo programs on an Arduino or other supported AVR-based board.
Но показанное там относится только к Arch Linux ...
Проверил для DEB-дистрибутивов:

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

olej@R420:~$ aptitude search avrdude
p   avrdude                                                      - утилита для программирования микроконтроллеров Atmel AVR               
p   avrdude-doc                                                  - документация для avrdude                                               
1). всё на месте
2). всё под теми же именами

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

Go: TinyGo

Непрочитанное сообщение Olej » 05 фев 2024, 18:36

Olej писал(а):
05 фев 2024, 17:58
Linux install guide
Development Builds

You can download the latest builds from the TinyGo dev branch where active development takes place.

To obtain the binary, first go to the list of recent actions for the Linux build:

https://github.com/tinygo-org/tinygo/ac ... anch%3Adev
Или так:

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

olej@R420:~/2024/Go$ git clone https://github.com/tinygo-org/tinygo.git
Клонирование в «tinygo»...
remote: Enumerating objects: 30678, done.
remote: Counting objects: 100% (534/534), done.
remote: Compressing objects: 100% (288/288), done.
remote: Total 30678 (delta 274), reused 395 (delta 228), pack-reused 30144
Получение объектов: 100% (30678/30678), 10.44 МиБ | 1.71 МиБ/с, готово.
Определение изменений: 100% (22400/22400), готово.

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

olej@R420:~/2024/Go$ du -hs tinygo
21M	tinygo

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

Go: TinyGo

Непрочитанное сообщение Olej » 05 фев 2024, 21:29

Olej писал(а):
05 фев 2024, 17:58

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

olej@R420:~/2024/Go$ which tinygo
Первые предварительные тесты... Возьму давно использовавшийся код вычисления Фибоначчи чисел:

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

olej@R420:~/2024/Go/examples/fibo$ cat fibo_go.go
package main
import ("os"; "strconv")

func fib(n int) int {
	if n < 2 { return 1
	} else { return fib(n-1) + fib(n-2)
	}
}

func main() {
	n, _ := strconv.Atoi(os.Args[1])
	println(fib(n))
}
Компиляция:
- GoLang:

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

olej@R420:~/2024/Go/examples/fibo$ time go build -o fibo_golang fibo_go.go  

real	0m0,206s
user	0m0,328s
sys	0m0,135s
- TinyGo:

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

olej@R420:~/2024/Go/examples/fibo$ time tinygo build -o fibo_gotiny fibo_go.go  

real	0m3,441s
user	0m5,627s
sys	0m0,467s
Компиляция TinyGo длиннее в 16.7 раз!
Возможно, на программах большего объёма эта разница нивелируется? ... или нет?
Вложения
fibo_go.go
(192 байт) 9 скачиваний

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

Go: TinyGo

Непрочитанное сообщение Olej » 05 фев 2024, 21:35

Olej писал(а):
05 фев 2024, 21:29
Компиляция:

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

olej@R420:~/2024/Go/examples/fibo$ ls -l fibo_go*
-rw-r--r-- 1 olej olej     192 апр 21  2022 fibo_go.go
-rwxrwxr-x 1 olej olej 1467701 фев  5 20:17 fibo_golang
-rwxrwxr-x 1 olej olej  300744 фев  5 20:17 fibo_gotiny
Но вот размером результат компиляции TinyGo короче результата GoLang в 4,88 раза :!:
И можно подумать, что результат GoLang - за счёт статической сборки. Но нет:

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

olej@R420:~/2024/Go/examples/fibo$ file fibo_go*
fibo_go.go:  C source, ASCII text
fibo_golang: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, Go BuildID=lfvyDkW_SN3g9gWGfJqL/Q_t_waY0gznz_XeM9DY3/zTVAF3fYMeEcS9rJLm9t/aZ31lfKu-MxDGvkSpOmd, with debug_info, not stripped
fibo_gotiny: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, with debug_info, not stripped
И тот и другой собран статически, без подключения разделяемых библиотек Linux (возможно TinyLinux вообще не умеет использовать разделяемые библиотеки Linux *.so :?: ).

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

Go: TinyGo

Непрочитанное сообщение Olej » 05 фев 2024, 21:42

Olej писал(а):
05 фев 2024, 21:29
Компиляция:
А вот на выполнении это изумляет :-o :

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

olej@R420:~/2024/Go/examples/fibo$ time ./fibo_golang 40
165580141

real	0m1,119s
user	0m1,118s
sys	0m0,004s

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

olej@R420:~/2024/Go/examples/fibo$ time ./fibo_gotiny 40
165580141

real	0m0,712s
user	0m0,710s
sys	0m0,001s
Но при более обстоятельных вычислениях эта разница нивелируется:

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

olej@R420:~/2024/Go/examples/fibo$ time ./fibo_golang 45
1836311903

real	0m7,673s
user	0m7,662s
sys	0m0,020s

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

olej@R420:~/2024/Go/examples/fibo$ time ./fibo_gotiny 45
1836311903

real	0m6,995s
user	0m6,987s
sys	0m0,005s
Возможно, при коротких вычислениях существенную часть вносит время загрузки кода на выполнение, т.к. загружается ELF-файл в 5 раз короче.

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

Go: TinyGo

Непрочитанное сообщение Olej » 06 фев 2024, 11:32

Olej писал(а):
05 фев 2024, 21:35
И тот и другой собран статически
TinyGo позволяет собирать и WASM проекты (в формате выполнения в браузере) ... вот их (проекта) страницы документации:
WebAssembly
TinyGo is very useful for compiling programs both for use in browsers (WASM) as well as for use on servers and other edge devices (WASI).
Using WASM
How to call WebAssembly from JavaScript in a browser.
И делается это так (в отличие от стандартного GoLang):

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

olej@R420:~/2024/WebAssembly/example.com/app$ tinygo build -o main.wasm -target wasm main.go
Формат WASM указывается как платформа, target.
Но это совсем отдельная тема разговора: Go: WebAssembly (WASM) :!:

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

Go: TinyGo

Непрочитанное сообщение Olej » 06 фев 2024, 11:35

Olej писал(а):
06 фев 2024, 11:32
Формат WASM указывается как платформа, target.
Но впечатляет общее число этих платформ:

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

olej@R420:~/2024/WebAssembly$ tinygo targets
ae-rp2040
arduino-leonardo
arduino-mega1280
arduino-mega2560
arduino-mkr1000
arduino-mkrwifi1010
arduino-nano-new
arduino-nano
arduino-nano33
arduino-zero
arduino
atmega1284p
atsame54-xpro
attiny1616
badger2040
bluemicro840
bluepill-clone
bluepill
challenger-rp2040
circuitplay-bluefruit
circuitplay-express
clue-alpha
clue
cortex-m-qemu
d1mini
digispark
esp32-c3-devkit-rust-1
esp32-coreboard-v2
esp32-mini32
esp32
esp32c3-12f
esp32c3
esp8266
feather-m0-express
feather-m0
feather-m4-can
feather-m4
feather-nrf52840-sense
feather-nrf52840
feather-rp2040
feather-stm32f405
gameboy-advance
gemma-m0
gnse
gobadge
gopher-badge
gopherbot
gopherbot2
grandcentral-m4
hifive1b
itsybitsy-m0
itsybitsy-m4
itsybitsy-nrf52840
kb2040
lgt92
lorae5
m5stack-core2
m5stack
m5stamp-c3
m5stick-c
macropad-rp2040
maixbit
makerfabs-esp32c3spi35
matrixportal-m4
mch2022
mdbt50qrx-uf2
metro-m4-airlift
microbit-s110v8
microbit-v2-s113v7
microbit-v2
microbit
nano-33-ble-s140v6-uf2
nano-33-ble-s140v7-uf2
nano-33-ble-s140v7
nano-33-ble
nano-rp2040
nicenano
nodemcu
nrf52840-mdk-usb-dongle
nrf52840-mdk
nrf52840-s140v6-uf2
nrf52840-s140v7-uf2
nucleo-f103rb
nucleo-f722ze
nucleo-l031k6
nucleo-l432kc
nucleo-l552ze
nucleo-wl55jc
p1am-100
particle-3rd-gen
particle-argon
particle-boron
particle-xenon
pca10031
pca10040-s132v6
pca10040
pca10056-s140v6-uf2
pca10056-s140v7
pca10056
pca10059
pico
pinetime
pybadge
pygamer
pyportal
qtpy-rp2040
qtpy
reelboard-s140v7
reelboard
riscv-qemu
rp2040
simavr
stm32f469disco
stm32f4disco-1
stm32f4disco
swan
teensy36
teensy40
teensy41
thingplus-rp2040
trinket-m0
trinkey-qt2040
tufty2040
wasi
wasm
waveshare-rp2040-zero
wioterminal
x9pro
xiao-ble
xiao-esp32c3
xiao-rp2040
xiao

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

olej@R420:~/2024/WebAssembly$ tinygo targets | wc -l
132

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

Go: TinyGo

Непрочитанное сообщение Olej » 06 фев 2024, 22:09

Olej писал(а):
05 фев 2024, 21:35
Но вот размером результат компиляции TinyGo короче результата GoLang в 4,88 раза
К вопросу размера исполнимого файла ... любопытно - собираем другое простейшее приложение (типа Hello World, но это не имеет значения):

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

olej@R420:~/2024/WebAssembly/example.com/app$ go build -o main.golang main.go

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

olej@R420:~/2024/WebAssembly/example.com/app$ tinygo build -o main.gotiny main.go

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

olej@R420:~/2024/WebAssembly/example.com/app$ ls -l | grep rwx
-rwxrwxr-x 1 olej olej 1169784 фев  6 20:55 main.golang
-rwxrwxr-x 1 olej olej  608432 фев  6 20:55 main.gotiny
Разница исполнимых бинарных ELF-файлов: 1169784÷608432=1,922620769 раз ... 2 раза.
Удаляем отладочную информацию (strip-уем):

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

olej@R420:~/2024/WebAssembly/example.com/app$ strip main.golang

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

olej@R420:~/2024/WebAssembly/example.com/app$ strip main.gotiny

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

olej@R420:~/2024/WebAssembly/example.com/app$ ls -l | grep rwx
-rwxrwxr-x 1 olej olej 1169784 фев  6 20:57 main.golang
-rwxrwxr-x 1 olej olej  110848 фев  6 20:57 main.gotiny
Теперь разница размеров исполнимого файла: 1169784÷110848=10,553045612 ... >10 раз :-o
Это вот - прямой резон для малых конфигураций (для вот всех тех target выше) 1). компилировать TinyGo и 2). обязательно делать strip (после отладки).

Ответить

Вернуться в «Одноплатные компьютеры»

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

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