TinyGo。好东西都是小包装的

562 阅读11分钟

**TL;DR:**为物联网设备、CLI和WebAssembly编码的概念并不是一个新概念。然而,如果我告诉你,可以用Golang来完成这三件事呢。TinyGo是一个专门的项目,专门为小地方的开发设计和使用。这篇文章解释了TinyGo的好处,它是什么,以及你如何使用它。它还为你提供了一个Golang IoT的代码例子,让你看到TinyGo的运行。

什么是 TinyGo?

TinyGo 是 Golang 的小兄弟。它是一个编译器,允许用户编写他们熟悉的 Golang 代码,并在人们认为不可能的地方运行它。这意味着,进入一些技术领域的门槛正在逐渐降低。我这样说是因为我是通过经验来写的。

TinyGo与Golang有什么不同?

开箱即用,Golang是一种功能丰富、性能卓越的编译语言,这意味着Golang被编译成机器可读的代码(那些有趣的 1's 和 0's大家都在谈论)。

反过来,被编译成机器代码后,它可以直接在硬件上运行--所有的CPU/RAM的力量!这就是Golang。Golang的另一个很酷的特点是,在构建二进制的程序时,它包括广泛的交叉兼容性,适用于不同的系统架构。

一旦二进制文件被构建,它就可以在任何兼容的分布/架构上运行,只要在构建过程中指定了它。要找到支持的架构列表(在你的机器上安装Go后),在终端运行这个命令:go tool dist list

输出结果会是这样的。

aix/ppc64
android/386
android/amd64
android/arm
android/arm64
darwin/amd64
darwin/arm64
dragonfly/amd64
freebsd/386
...

那么,TinyGo有什么不同?嗯,它还是你所熟悉和喜爱的 Golang,但 TinyGo 是一个基于LLVM技术的小型编译器。它基本上挑选了一些重要的、可用的库,并从核心语言中剪去了很多脂肪。

通过这样做,TinyGo成为一种更加强大和高效的语言,你可以在意想不到的地方运行。作为一个被削减的例子,该库 html/template不能被TinyGo导入,因为它依赖于其他依赖关系,而这些依赖关系又不能被导入。

要阅读TinyGo支持的软件包,请访问文档页面

你可以在哪里使用TinyGo?

在WebAssembly中使用TinyGo

什么是WebAssembly?

网络开发通常可能与JavaScript有关,但情况并非如此。WebAssembly是W3C的官方标准,允许人们在不使用JavaScript的情况下开发网络应用。

我首先必须强调,WebAssembly不是JavaScript的替代品,但可以作为一种很好的补充。这两种技术可以很好地合作来提供网络内容。用一句小话来说,WebAssembly是一种为网络编写代码的格式。WebAssembly被设计成具有很高的性能,这就是为什么开销小的语言是最好的。

WebAssembly允许开发者用熟悉的语言编写代码,并通过网络浏览器为终端用户运行。通过这种方法,可以实现接近原生的性能,而且所需的支持已经在你的现代浏览器中。

从本质上讲,你可以用TinyGo写代码,然后通过WASM编译器,把Golang代码变成机器可读的代码。然后,你可以通过网络浏览器轻松地运行该应用程序。

WebAssembly diagram

使用TinyGo来构建CLI

什么是CLI?

命令行界面(CLI)是一种标准化的方式,让用户与系统或应用程序进行文本交互。CLI的第一个主要使用案例是在1960年代,用户可以使用终端与操作系统互动。这是随后几十年的一个持续趋势,它使系统变得更加复杂,使用户在他们使用的计算机上有更多的自由。

为什么CLI需要很小?

一些CLI直接与操作系统进行交互,这又意味着它们需要一些低级别的权限和一个安全的库集。最初,人们可能会想到用C语言或Python来完成这一任务。它们是成熟的、低级别的语言,过去曾被用于一些高知名度的CLI。

Golang进入了这个房间

然而,对于那些不知道的人来说,Go是从C语言衍生出来的。事实上,它是如此接近,以至于你可以从Go程序中调用C代码--它被称为Cgo。

近年来,Go一直是创建CLI的首选语言。一些最流行和最常用的CLI是用Go编写的。Docker CLI、Kubernetes CLI(kubectl )、GitHub CLI,仅举几例。这得益于第三方库和导入程序的创建,它们负责处理复杂的任务,否则开发者就必须自己处理。

其次是隐藏在语言内部的力量。Go的并发性是以go-routine的形式出现的,使异步编程变得简单,并且有一个垃圾收集器来帮助内存管理。所有这些功能(以及更多)都有助于减少完整程序所占用的大小和空间,所有这些都是为了使程序尽可能保持高性能。

然而,如果一个小项目需要为其编写CLI,或者CLI只是执行一些基本的任务,有时这些大型的库和导入可能是多余的。除非最终的目标是写一个复杂的、多功能的CLI,就像前面提到的那些,否则大量的可用库甚至可能不会被使用,导致项目可以不用开销。为了保持CLI的小而精,减少浪费是首要任务。这使得TinyGo成为小型CLI的最佳选择。

TinyGo可以为微控制器供电

什么是微控制器?

微控制器通常是一个小型电路板上的单芯片,允许输入和输出(I/O)。一个常见的、众所周知的例子是Arduino,它对于家庭自动化和房子周围的其他小型项目是非常好的。

随着近年来物联网的蓬勃发展,Arduino也出现了流行趋势。这方面的问题是,Arduino通常是用C++编码的。对一些人来说,这可能被视为进入市场的障碍,因为它是一种复杂的语言,在有其他选择的情况下,不是每个人都愿意学习或使用它。

当我开始玩物联网的时候,我买了一堆Arduinos,认为我可以做一些很酷的项目。然后,我个人被C++的障碍所打动。我的大部分工作都是用Node.js或Golang。在这种情况下,我坐下来思考如何写出我熟悉和喜爱的代码来创建我心中的这些很酷的项目。这就是我遇到TinyGo的地方。

TinyGo支持多少个板?

TinyGo 是一个不断发展的项目。在撰写本文时,TinyGo 支持 60 多个微控制器板。这些板子从Espressif板(ESP)Adafruits,以及前面提到的Arduinos,为人们打开了许多大门,让他们在熟悉的语言中开始物联网的旅程。

请查看TinyGo支持的每个微控制器板的文档以了解更多细节。

为什么TinyGo是C++和MicroPython的最佳替代品?

我不打算用语言bash。C、Python和Go都是很好的语言,有各自的特点。既然如此,这个项目就有很大的发展空间,并在正确的支持下取得成果。

在过去的几年里,Golang的知名度明显提高。由于其 "一流 "的支持,它正迅速成为云原生开发语言的事实选择。在2017年Stack Overflow开发者调查最受欢迎的技术中,Go首次进入榜单,只得到4.4%的分数。与2020年相比,仅仅3年后,它的得分是8.8%。让我们来看看,Golang与一些全球最受欢迎的技能和最高薪酬有关。假设这种增长将继续下去是正确的。

此外,看看物联网市场,我们可以看到另一个上升的趋势。2017年,Garner预测将有84亿台物联网设备被连接。快速跟踪到2025年,有一个预测是高达300亿台设备被连接。这是一个巨大的飞跃!Golang和它的小兄弟TinyGo的成长,可以帮助物联网的发展。

运行中的TinyGo

让我们通过一些代码来看看Golang物联网是如何形成的吧

在这篇博文中,我为你创建了一个小程序,当光电晶体管检测到无光时,会打开4个LED。这基本上是户外夜灯的工作原理。

为了做到这一点,我使用了。

  • Visual Studio Code + TinyGo插件
  • TinyGo版本 0.18.0 darwin/amd64(使用Golang版本 1.16和LLVM版本 11.0.0)
  • 1 x Arduino Uno R3
  • 1个面包板
  • 8条公-母线
  • 5个电阻(1个10kΩ/4个220Ω)。
  • 1个光电晶体管
  • 4个LED灯

第一步。

如果你还没有,请安装Go,然后在你的机器上下载并安装TinyGo

要检查Go是否已经安装,请运行以下命令。

go version

要检查TinyGo是否已经安装,请运行以下命令。

tinygo version

接下来,安装TinyGo Visual Studio Code Plugin。

install tinygo vscode editor plugin

第2步。

用USB线插入电路板(在这个例子中,我使用的是Arduino R3),然后用编辑器瞄准它。一旦锁定,编辑器将提示重新加载窗口。

tinygo select the target board

reload the vscode editor

🚨警告🚨。编辑器可能会提示你更新编辑器中的go dev 工具。如果你执行更新,你可能会因为一个已知的错误而得到一个错误。在这个问题得到解决之前,建议不要更新这些工具。

vscode update tools notification

第3步。

  1. 在目录中创建一个项目 $HOME/go/src/github.com/tinygo
$ mkdir light-sensor
  1. 改变到新创建的项目目录
$ cd light-sensor
  1. 创建一个新的 .go文件,用于项目目录下的应用程序。
$ touch light-sensor.go
  1. 如果你使用go模块,则创建一个go mod文件
$ go mod init
  1. 最后,在Visual Studio Code中打开该项目

第4步。

首先,阅读下面的代码和注释,然后其次,把它写出来。不要复制和粘贴!

package main

import (
    "machine"
    "time"
)

func main() {

    // Initialise Analog pins
    machine.InitADC()

    // Set the light sensor to Analog pin 0
    lightSensor := machine.ADC{Pin: machine.ADC0}
    lightSensor.Configure(machine.ADCConfig{})
    // Set the LEDs to the corresponding pins
    leds := []machine.Pin{
        machine.D7,
        machine.D8,
        machine.D9,
        machine.D10,
    }

    // Configure each LED as an output
    for _, led := range leds {
        led.Configure(machine.PinConfig{Mode: machine.PinOutput})
    }

    // Constantly loop to get the light sensor reading every 0.1 seconds
    for {
        // 30000 is the lighting threshold for my environment
        if lightSensor.Get() > 30000 {
            // Turn the LEDs off
            for _, led := range leds {
                led.Set(false)
            }
        } else {
            // Turn the LEDs on
            for _, led := range leds {
                led.Set(true)
            }
        }

        // Time to wait before next light sensor reading is collected
        time.Sleep(time.Millisecond * 100)
    }
}

第5步。

连接各部件,使其类似于下图所示的电路板。

circuit board diagram

circuit board

第6步。

接下来,找到所连接的设备在哪个端口上运行。要做到这一点,在终端中输入以下命令,或导航到设备管理器中。

麦克风

$ ls /dev/cu*

Linux:

$ ls /dev/tty*

视窗。

打开设备管理器,展开端口(COM和LPT)列表。找到你的连接设备并记下端口号。在下一步骤中,你将需要这个端口号来闪现设备。

另外,请访问MathWorks网站,了解如何找到所连接设备的端口号的更多信息。

第7步。

现在你有了端口号,设备已经连接好,并通过编辑器锁定了目标,你也写好了代码。下一步是闪现电路板。要做到这一点,请在终端上输入以下命令。

tinygo flash -target=<board-you-are-targeting> -port=<device-port-from-step-6> <name-of-file>

命令示例。

tinygo flash -target=Arduino -port=/dev/cu.usbmodem143201 light-sensor.go

一旦你完成了设备闪存,它应该看起来像这样。

经验之谈

  1. TinyGo是嵌入式系统和WebAssembly开发的最佳选择。
  2. 作为Go语言的小型编译器,现有的Go开发者可以用他们现有的技能进入物联网领域。
  3. 采用率在不断提高,TinyGo已经被最常见的微控制器板所支持,减少了新人和业余爱好者的进入门槛。

TinyGo仍然是一个非常实验性的项目,在很短的时间内就取得了飞跃性的发展。随着Go在软件领域的影响不断扩大,TinyGo可能是一个值得关注的项目。物联网和边缘计算需要有多种轻量级的主语言替代品,因为可用的计算能力往往有限,而整体需求却在不断膨胀。TinyGo只是另一个例子,它是微控制器主流语言的一个伟大的瘦身替代品。就我而言,我肯定会留意线性采用模式,并继续监测和研究像这样令人兴奋的项目。


© 2013-2021 Auth0公司。保留所有权利。