mirror of https://github.com/tinygo-org/tinygo.git
Ayke van Laethem
7 years ago
1 changed files with 65 additions and 0 deletions
@ -0,0 +1,65 @@ |
|||||
|
# TinyGo - Go compiler for microcontrollers |
||||
|
|
||||
|
> We never expected Go to be an embedded language and so it's got serious |
||||
|
> problems [...]. |
||||
|
|
||||
|
-- Rob Pike, [GopherCon 2014 Opening Keynote](https://www.youtube.com/watch?v=VoS7DsT1rdM&feature=youtu.be&t=2799) |
||||
|
|
||||
|
TinyGo is a project to bring Go to microcontrollers and small systems with a |
||||
|
single processor core. It is similar to [emgo](https://github.com/ziutek/emgo) |
||||
|
but a major difference is that I 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. |
||||
|
|
||||
|
My original reasoning was: if [Python](https://micropython.org/) can run on |
||||
|
microcontrollers, then certainly [Go](https://golang.org/) should be able to and |
||||
|
run on even lower level micros. |
||||
|
|
||||
|
Example program (blinky): |
||||
|
|
||||
|
```go |
||||
|
import "machine" |
||||
|
|
||||
|
func main() { |
||||
|
led := machine.GPIO{machine.LED} |
||||
|
led.Configure(machine.GPIOConfig{Mode: machine.GPIO_OUTPUT}) |
||||
|
for { |
||||
|
led.Low() |
||||
|
runtime.Sleep(runtime.Millisecond * 1000) |
||||
|
|
||||
|
led.High() |
||||
|
runtime.Sleep(runtime.Millisecond * 1000) |
||||
|
} |
||||
|
} |
||||
|
``` |
||||
|
|
||||
|
Currently supported features: |
||||
|
|
||||
|
* control flow |
||||
|
* many (but not all) basic types: most ints, strings, structs |
||||
|
* function calling |
||||
|
* interfaces for basic types (with type switches and asserts) |
||||
|
* goroutines (very initial support) |
||||
|
* function pointers (non-blocking) |
||||
|
|
||||
|
Not yet supported: |
||||
|
|
||||
|
* float, complex, etc. |
||||
|
* garbage collection |
||||
|
* interface methods |
||||
|
* channels |
||||
|
* introspection (if it ever gets implemented) |
||||
|
* standard library (needs more language support) |
||||
|
* `defer` |
||||
|
* closures |
||||
|
* ... |
||||
|
|
||||
|
## Analysis |
||||
|
|
||||
|
The goal is to reduce code size (and increase performance) by performing all |
||||
|
kinds of whole-program analysis passes. The official Go compiler doesn't do a |
||||
|
whole lot of analysis (except for escape analysis) becauses it needs to be fast, |
||||
|
but embedded programs are necessarily smaller so it becomes practical. And I |
||||
|
think especially program size can be reduced by a large margin when actually |
||||
|
trying to optimize for it. |
Loading…
Reference in new issue