Go : кросс-компиляция и переносимость

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

Модератор: Olej

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

Go : кросс-компиляция и переносимость

Непрочитанное сообщение Olej » 23 мар 2022, 23:25

О переносимости между операционными системами и аппаратными архитектурами много уже здесь писалось...
независимый от платформы код

Но это всё - цветочки.
Настоящую переносимость между архитектурами и операционными системами и их стандартами обеспечивает среда языка Go.

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

Re: Go: кросс-компиляция и переносимость

Непрочитанное сообщение Olej » 23 мар 2022, 23:30

Беру элементарный код Go - это в качестве эталона:

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

package main

import (
        "fmt"
        "os"
)

func main() {
        fmt.Println("ты кто будешь?")
        fmt.Printf("> ")
        буфер := make([]byte, 120)
        длина, _ := os.Stdin.Read(буфер) // возвращается 2 значения
        Ω := длина
        ответ := string(буфер[:Ω-1]) // убрали '\n'
        fmt.Printf("какое длинное имя ... целых %d байт\n", Ω)
        fmt.Printf("привет, %s\n", ответ)
}
Компилирую и выполняю в нативном Linux - здесь нет ничего сверх элементарного:

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

[Olej@modules hello]$ gccgo -g hello.go -o hello

[Olej@modules hello]$ ls -l hello
-rwxrwxr-x. 1 Olej Olej 32833 авг 10 13:10 hello
Выполнение:

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

[Olej@modules hello]$ ./hello
ты кто будешь?
> Вася
какое длинное имя ... целых 9 байт
привет, Вася
Вложения
hello.go
(557 байт) 45 скачиваний

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

Re: Go: кросс-компиляция и переносимость

Непрочитанное сообщение Olej » 23 мар 2022, 23:35

Olej писал(а):
23 мар 2022, 23:30
Беру элементарный код Go - это в качестве эталона:
Теперь я компилирую тот же (неизменный файл, что очень важно) компилирую в том же нативном десктопном x86_64 Linux под ARM аппаратную платформу:

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

olej@R420:~/2022/own.BOOKs/BHV/examples/hello$ GOARCH=arm go build -o hello.32.arm hello.go

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

olej@R420:~/2022/own.BOOKs/BHV/examples/hello$ ls -l *.arm
-rwxrwxr-x 1 olej olej 1880350 мар 23 21:59 hello.32.arm

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

olej@R420:~/2022/own.BOOKs/BHV/examples/hello$ file hello.32.arm
hello.32.arm: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, Go BuildID=ZfMUX4fIpDYH_dqrGeIZ/q3f4F1Z0legZmrfeS1Qu/Ozb37t0uutQShZb8-IJl/QT5B9gi5cCsDLo2SLM5f, not stripped

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

Re: Go: кросс-компиляция и переносимость

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

Olej писал(а):
23 мар 2022, 23:35
Теперь я компилирую тот же (неизменный файл, что очень важно) компилирую в том же нативном десктопном x86_64 Linux под ARM аппаратную платформу:
Переношу копированием бинарный исполнимый ELF файл в одноплатный компьютер Raspberry Pi 2 (Raspberry Pi 2 ... снова):

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

olej@raspberrypi:~ $ inxi -Cxxx
CPU:       Info: Quad Core model: ARMv7 v7l variant: cortex-a7 bits: 32 type: MCP arch: v7l rev: 5 
           features: Use -f option to see features bogomips: 256 
           Speed: 1000 MHz min/max: 600/1000 MHz Core speeds (MHz): 1: 1000 2: 1000 3: 1000 4: 1000 

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

olej@raspberrypi:~ $ lsb_release -a
No LSB modules are available.
Distributor ID:	Raspbian
Description:	Raspbian GNU/Linux 11 (bullseye)
Release:	11
Codename:	bullseye

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

olej@raspberrypi:~ $ uname -a
Linux raspberrypi 5.10.103-v7+ #1530 SMP Tue Mar 8 13:02:44 GMT 2022 armv7l GNU/Linux

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

olej@raspberrypi:~ $ ./hello.32.arm 
ты кто будешь?
> вася
какое длинное имя ... целых 9 байт
привет, вася
olej@raspberrypi:~ $ 

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

Re: Go: кросс-компиляция и переносимость

Непрочитанное сообщение Olej » 23 мар 2022, 23:47

Olej писал(а):
23 мар 2022, 23:38
Переношу копированием бинарный исполнимый ELF файл в одноплатный компьютер Raspberry Pi 2 (Rapsberry Pi 2 ... снова):
Теперь переношу точно так же копированием тот же исполнимый бинарный ELF-файл в другую архитектуру Orange Pi One (не совместимы аппаратно с Raspberry Pi - Orange Pi One ... снова):

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

olej@orangepione:~$ inxi -Cxxx
CPU:       Topology: Quad Core model: ARMv7 v7l variant: cortex-a7 bits: 32 type: MCP arch: v7l rev: 5
           features: Use -f option to see features bogomips: 0
           Speed: 1008 MHz min/max: 480/1008 MHz Core speeds (MHz): 1: 1008 2: 1008 3: 1008 4: 1008

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

olej@orangepione:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 20.04.4 LTS
Release:        20.04
Codename:       focal

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

olej@orangepione:~$ uname -a
Linux orangepione 5.15.25-sunxi #22.02.1 SMP Sun Feb 27 09:23:25 UTC 2022 armv7l armv7l armv7l GNU/Linux

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

olej@orangepione:~$ ./hello.32.arm
ты кто будешь?
> вася
какое длинное имя ... целых 9 байт
привет, вася

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

Re: Go: кросс-компиляция и переносимость

Непрочитанное сообщение Olej » 24 мар 2022, 00:01

Olej писал(а):
23 мар 2022, 23:47
Теперь
Но это ещё далеко не всё!
Компилирую тот же исходный код в Linux под Windows платформы:

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

$ GOOS=windows GOARCH=386 go build -o hello.32.exe
$ GOOS=windows GOARCH=amd64 go build -o hello.64.exe

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

$ ls -l *.exe
-rwxrwxr-x 1 olej olej 1901056 янв 20 01:30 hello.32.exe
-rwxrwxr-x 1 olej olej 2138112 янв 20 01:31 hello.64.exe
$ file *.exe
hello.32.exe: PE32 executable (console) Intel 80386 (stripped to external PDB), for MS Windows
hello.64.exe: PE32+ executable (console) x86-64 (stripped to external PDB), for MS Windows
И теперь они, откопированные в исполнимой .exe форме, исполняются в Windows:

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

X:\Users\Default\Downloads>dir
 Volume in drive X is Boot
 Volume Serial Number is D60A-0DC2

 Directory of X:\Users\Default\Downloads

06/20/2018  02:00 AM    <DIR>          .
06/20/2018  02:00 AM    <DIR>          ..
01/20/2022  03:25 PM         1,054,653 drive-download-20220120T132509Z-001.zip
01/20/2022  03:30 PM         1,901,056 hello.32.exe
01/20/2022  03:30 PM         2,138,112 hello.64.exe
               3 File(s)      5,093,821 bytes
               2 Dir(s)     368,934,912 bytes free

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

X:\Users\Default\Downloads>hello.32.exe
ты кто будешь?
> bastard
какое длинное имя ... целых 9 байт
привет, bastard

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

X:\Users\Default\Downloads>hello.64.exe
ты кто будешь?
> windown
какое длинное имя ... целых 9 байт
привет, windown

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

Re: Go: кросс-компиляция и переносимость

Непрочитанное сообщение Olej » 24 мар 2022, 00:11

Olej писал(а):
24 мар 2022, 00:01
Компилирую тот же исходный код
То, во что компилируется (под какую платформу) определяется 2-мя переменными среды Go: gеременная среды GOARCH определяет процессорную архитектуру, а переменная GOOS — операционную систему на этой архитектуре под которую нужно собирать приложение.

То что реализовано на текущую версию GoLang можно смотреть здесь - Go (Golang) GOOS and GOARCH :
• 17 операционных систем:
All GOOS values:
"aix", "android", "darwin", "dragonfly", "freebsd", "hurd", "illumos", "ios", "js", "linux", "nacl", "netbsd", "openbsd", "plan9", "solaris", "windows", "zos"

• под 24 процессорных платформ:
All GOARCH values:
"386", "amd64", "amd64p32", "arm", "arm64", "arm64be", "armbe", "loong64", "mips", "mips64", "mips64le", "mips64p32", "mips64p32le", "mipsle", "ppc", "ppc64", "ppc64le", "riscv", "riscv64", "s390", "s390x", "sparc", "sparc64", "wasm"
Вот где бинарная переносимость!

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

Re: Go : кросс-компиляция и переносимость

Непрочитанное сообщение Olej » 01 апр 2022, 19:40

Olej писал(а):
23 мар 2022, 23:38
Переношу копированием бинарный исполнимый ELF файл в одноплатный компьютер Raspberry Pi 2
Но кроме переноса, вся инфраструктура Go представлена автономно (для установки) даже в такой "малышке" как Raspberry Pi и для архитектуры ARM v7:

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

olej@raspberrypi:~ $ uname -a
Linux raspberrypi 5.15.30-v7+ #1536 SMP Mon Mar 28 13:43:34 BST 2022 armv7l GNU/Linux

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

olej@raspberrypi:~ $ lsb_release -a
No LSB modules are available.
Distributor ID:	Raspbian
Description:	Raspbian GNU/Linux 11 (bullseye)
Release:	11
Codename:	bullseye
Вот только сколько пакетов в репозитории относящихся к Go!

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

olej@raspberrypi:~ $ aptitude search golang | wc -l
1741

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

Re: Go : кросс-компиляция и переносимость

Непрочитанное сообщение Olej » 01 апр 2022, 19:43

Olej писал(а):
01 апр 2022, 19:40
Вот только сколько пакетов в репозитории относящихся к Go!
Для сравнения, на традиционной x86_64 платформе

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

olej@R420:~$ uname -a
Linux R420 5.4.0-107-generic #121-Ubuntu SMP Thu Mar 24 16:04:27 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

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

olej@R420:~$ aptitude search golang | wc -l
1377

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

Re: Go : кросс-компиляция и переносимость

Непрочитанное сообщение Olej » 02 апр 2022, 21:27

Olej писал(а):
01 апр 2022, 19:40
Но кроме переноса, вся инфраструктура Go представлена автономно (для установки) даже в такой "малышке" как Raspberry Pi и для архитектуры ARM v7:
И ещё меньше, аппаратно и по цене, образец: Orange Pi One - Orange Pi One - Armbian Xfce:

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

olej@orangepione:~$ aptitude search golang | wc -l
1372

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

root@orangepione:~# go version
go version go1.13.8 linux/arm

Ответить

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

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

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