BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース TinyGoはモノのインターネットに持ち込むことが目的

TinyGoはモノのインターネットに持ち込むことが目的

原文(投稿日:2020/04/10)へのリンク

GoogleがスポンサとなっているTinyGoは、LLVMベースの新しいGoコンパイラで、Arduino Uno、Arduino Nano33 IoTBBC micro.bitなどのマイクロコントローラ、およびWeb Assemblyを使用する最新のブラウザでGoプログラムを実行できるようにする。

TinyGoは、できるだけ小さなバイナリの作成とメモリ使用量の最適化に努める。対照的に、Goコンパイラは速度が最適化される。TinyGoは、Goよりも小さい独自のランタイムも使用する。

原点の論旨は次のとおりです。もしPythonをマイクロコントローラで実行できるなら、Goはさらに低レベルのマイクロで実行できるはずです。

TinyGoは、可能なGoプログラムをコンパイルできるようにすることを目的としておらず、変更なしでほとんどのGoプログラムをコンパイルすることを目指している。スライス、インターフェース、クロージャー、バインドされたメソッドなど、ほとんどの言語機能がサポートされている。他のものは部分的にサポートされるかもしれない。特に、対象となるほとんどのマイクロコントローラはシングルコアであるため、ゴルーチンは最適化されていない。リフレクションは、数値、文字列、構造体などの最も一般的なタイプで使用できる。マップは、文字列、整数、マップキーとしてのポインタなどの型の数を減らす制限になっている。さらに、パフォーマンスが劣る場合がある。

以下は、サポートされているいずれかのマイクロコントローラの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)
    }
}

おそらく、TinyGoの最も印象的な機能は、ガベージコレクションサポートでいくつかのソートを必要とするGoメモリモデルを維持しようとする試みである。TinyGoは単純な保守的なマークスイープコレクタを使用する。収集は、ヒープが使い果たされたときにトリガーされる。これは、コンパイル時に決定できるか、開発者がruntime.GC()を呼び出したときにトリガーされる。TinyGoは、プログラムでメモリ割り当てが実際に発生する場所を検査することにより、メモリ使用量を最適化するためのサポートも提供する。これは、メインループでのメモリ割り当てを回避するのに役立つ。

前述のように、TinyGoはWASMもターゲットにしている。公式のGoコンパイラはWASMにコンパイルできるが、TinyGoははるかに小さな出力を提供できる。Googleによると、ライブラリのインポート時にGoコンパイラが10MB以上のWASMファイルを生成することは珍しくない。代わりに、単純な「hello world」プログラムはTinyGoによって575バイトのWASMプログラムに変換される。

TinyGoはLinuxmacOSWindowsで実行できる。Dockerイメージは、インストールを簡略化するためにも使用できる。

この記事に星をつける

おすすめ度
スタイル

BT