Go是一个图灵完备的语言
任何图灵完备的语言理论上都可以用来编译自身。比如c/c++, java, vb, php等等都可以。
至于怎么编译自身的:
用其它语言比如c++实现一个[Go语言编译器-1]
用Go语言写一个[Go语言编译器-2]
用这个c++实现的[Go语言编译器-1]编译第2步里面说的Go语言写的[Go语言编译器-2]
用第3步得到的[Go语言编译器-2],再编译一次第2步里面说的[Go语言编译器-2]的源码。
OK,现在有一个Go语言实现的编译器了,最开始那个c++写的编译器没用了,可以扔掉不要了。以后就不停的优化使用这个Go语言实现的自身的编译器就行了。
TinyGo是一个为微控制器、WebAssembly(Wasm)和命令行工具等小型场景设计的Go语言编译器。TinyGo重用了Go语言工具和LLVM使用的库,以编译用Go语言编写的程序。目前,该项目在GitHub上已经积累了10.1k的Star。
如下为一个示例程序,当运行在任何支持的带板载LED的主板上时,则会点亮内置LED。
上述程序可以在单片机、Adafruit ItsyBitsy M0微控制器或任何支持的带内置LED的板上进行编译和不需要修改的运行,只要设置正确的TinyGo编译器目标即可。例如,设置如下目标可以编译和点亮 单片机。
项目概述
TinyGo项目旨在将Go语言引入到具有单进程或核心的微控制器和小系统。TinyGo类似于emgo,但主要的区别在于作者想要保留Go内存模型。另一个区别在于TinyGo在内部使用LLVM,因而可以获得更小更高效的代码以及更高的灵活性。
创建TinyGo项目的初衷是,如果Python可以在微控制器上运行,Go语言当然也应该能够在更低级微设备上运行。
支持设备
你可以为微控制器、WebAssembly和Linux编译TinyGo程序。目前,TinyGo支持以下85种微处理器板。
更多技术细节请参阅原项目。