tinygo README

The project's README from github.com/tinygo-org/tinygo. As one markdown file: README.md.

TinyGo - Go compiler for small places

Linux macOS Windows Docker Nix

TinyGo is a Go compiler intended for use in small places such as microcontrollers, WebAssembly (wasm/wasi), and command-line tools.

It reuses libraries used by the Go language tools alongside LLVM to provide an alternative way to compile programs written in the Go programming language.

[!IMPORTANT] You can help TinyGo with a financial contribution using OpenCollective. Please see https://opencollective.com/tinygo for more information. Thank you!

Embedded

Here is an example program that blinks the built-in LED when run directly on any supported board with onboard LED:

package main

import (
    "machine"
    "time"
)

func main() {
    led := machine.LED
    led.Configure(machine.PinConfig{Mode: machine.PinOutput})
    for {
        led.Low()
        time.Sleep(time.Millisecond * 1000)

        led.High()
        time.Sleep(time.Millisecond * 1000)
    }
}

The above program can be compiled and run without modification on an Arduino Uno, an Adafruit Circuit Playground Express, a Seeed Studio XIAO-ESP32S3 or any of the many supported boards that have a built-in LED, just by setting the correct TinyGo compiler target. For example, this compiles and flashes an Arduino Uno:

tinygo flash -target arduino-uno examples/blinky1

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).

TinyGo programs can run in Fastly Compute, Fermyon Spin, wazero and many other WebAssembly runtimes.

Here is a small TinyGo program for use by a WASI host application:

package main

//go:wasmexport add
func add(x, y uint32) uint32 {
	return x + y
}

This compiles the above TinyGo program for use on any WASI Preview 1 runtime:

tinygo build -buildmode=c-shared -o add.wasm -target=wasip1 add.go

You can also use the same syntax as Go 1.24+:

GOOS=wasip1 GOARCH=wasm tinygo build -buildmode=c-shared -o add.wasm add.go

Installation

See the getting started instructions for information on how to install TinyGo, as well as how to run the TinyGo compiler using our Docker container.

Supported targets

Embedded

You can compile TinyGo programs for over 150 different microcontroller boards.

For more information, please see https://tinygo.org/docs/reference/microcontrollers/

WebAssembly

TinyGo programs can be compiled for both WASM and WASI targets.

For more information, see https://tinygo.org/docs/guides/webassembly/

Operating Systems

You can also compile programs for Linux, macOS, and Windows targets.

For more information:

Currently supported features:

For a description of currently supported Go language features, please see https://tinygo.org/lang-support/.

Documentation

Documentation is located on our web site at https://tinygo.org/.

You can find the web site code at https://github.com/tinygo-org/tinygo-site.

Getting help

If you're looking for a more interactive way to discuss TinyGo usage or development, we have a #TinyGo channel on the Gophers Slack.

If you need an invitation for the Gophers Slack, you can generate one here which should arrive fairly quickly (under 1 min): https://invite.slack.golangbridge.org

Contributing

Your contributions are welcome!

Please take a look at our Contributing page on our web site for details.

Project Scope

Goals:

Non-goals:

Why this project exists

We never expected Go to be an embedded language, and so it’s got serious problems...

-- Rob Pike, GopherCon 2014 Opening Keynote

TinyGo is a project to bring Go to microcontrollers and small systems with a single processor core. It is similar to emgo but a major difference is that we want to keep the Go memory model (which implies garbage collection of some sort). Another difference is that TinyGo uses LLVM internally instead of emitting C, which hopefully leads to smaller and more efficient code and certainly leads to more flexibility.

The original reasoning was: if Python can run on microcontrollers, then certainly Go should be able to run on even lower level micros.

License

This project is licensed under the BSD 3-clause license, just like the Go project itself.

Some code has been copied from the LLVM project and is therefore licensed under a variant of the Apache 2.0 license. This has been clearly indicated in the header of these files.

Some code has been copied and/or ported from Paul Stoffregen's Teensy libraries and is therefore licensed under PJRC's license. This has been clearly indicated in the header of these files.

tinygo (tinygo-org/tinygo)

Searching Database…

17.8K ·GitHub
Что это такое?TinyGo — альтернативный компилятор Go для «маленьких» мест: микроконтроллеров, WebAssembly (wasm/wasi) и утилит командной строки. Он компилирует код на Go, объединяя стандартные библиотеки инструментов Go с LLVM.
Это новый язык или я могу писать обычный Go?Вы пишете обычный Go: TinyGo берёт библиотеки стандартных инструментов Go и меняет бэкенд на LLVM. Он поддерживает большинство пакетов стандартной библиотеки и компилирует большую часть кода на Go без изменений.
Как установить TinyGo и залить первую программу на плату?Следуйте инструкции для начинающих на сайте TinyGo или запускайте компилятор из официального Docker-контейнера. Для встраиваемых платформ вы компилируете и прошиваете прямо на плату, указав целевую платформу компилятора.
Он соберёт любую программу на Go, какую я ему дам?Нет. Скомпилировать любую программу на Go — это официально не цель проекта, и TinyGo не стремится догнать компилятор gc по скорости или эффективно обрабатывать огромные числа горутин, хотя LLVM может ускорить численные расчёты.
Для чего он компилирует — только микроконтроллеры?Более 150 плат на микроконтроллерах, включая Arduino Uno, Adafruit Circuit Playground Express и Seeed Studio XIAO-ESP32S3. Также он собирает WASM для браузера, WASI для серверов, а ещё под Linux, macOS и Windows.
Одна и та же программа будет работать на разных платах без изменений?Как правило, да. Пример с мигающим встроенным светодиодом из README компилируется и работает без изменений на Arduino Uno, Adafruit Circuit Playground Express и Seeed Studio XIAO-ESP32S3 — меняется только целевая платформа компилятора.
Зачем автор вообще создал TinyGo?Роб Пайк говорил, что Go никогда не задумывался как язык для встраиваемых систем. Логика такая: раз Python может работать на микроконтроллерах, то Go должен работать даже на более простых микроконтроллерах. В отличие от emgo, TinyGo сохраняет модель памяти Go (включая сборку мусора) и внутри использует LLVM вместо генерации кода на C.
Где реально можно запустить WebAssembly, собранный через TinyGo?Во многих рантаймах: в README упоминаются Fastly Compute, Fermyon Spin и wazero для серверов и edge-устройств, а также браузеры через обычный WASM. Он компилирует под WASI Preview 1 и поддерживает новый синтаксис экспорта из Go 1.24+.
Поддерживается ли CGo?Да — хорошая поддержка CGo — официальная цель проекта, накладные расходы не больше, чем у обычного вызова функции.
Creator
tinygo-org
Size
14.2 MB
Stars
17.8K
Age
8y
Commits · 90 Days