编译go语言吗 go语言编译工具( 二 )


package main
func main() {
print("hello, world\n")
}
Go 是怎么使用 Go 来编译自身的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语言实现的自身的编译器就行了 。
Go语言编译成aar并调试 go及gomobile的环境配置这里就不介绍了,直接说aar的生成和使用 。
1. 设置环境变量GOPATH
GOPATH的值可以有多个,用半角分号间隔,但不能以其结束 , 设置完成后需要重新做 gomobile init。
2. 在GOPATH里创建src文件夹 , 用于存放go的包和源文件
3. 在src中创建hello文件夹(go文件的包名)
4. 在hello中创建hello.go文件,并输入内容
5. 编译
执行命令: gomobile bind -target=android hello
会生成一个hello.aar文件
6. 导入到android工程
将hello.aar文件放入工程的libs中,并配置build.gradle
在根结点加入:
在dependencies结点下加入依赖:
7. 在Java中测试
运行后,结果会输出 Hello, Android and Gopher
Golang 的静态编译Go 语言和 C 语言的一个很大的区别是 ,  Go 语言只静态编译,做个测试:
一方面是 Go 语言编译后的可执行文件大小比 C 语言的大很多,
另一方面是 C 语言的可执行文件需要依赖 glibc 动态库,
用 ldd 命令可以看出来:
或者直接删除 glibc 动态库,C 可执行程序报错 , 而 Go 的还能运行:
这时候只有内部命令可以运行,外部命令,包括ln甚至最常用的ls命令也不能运行了:
设置好LD_PRELOAD环境变量之后,ln 命令可以运行,但是sudo仍然不能运行
只能靠root用户来重新创建软连接了:
所以用 sudo 来 rm 文件要小心 , 还是用root比较好 。如果没有预先留一个打开的root终端,登录都登不进去 。
Go语言编译器TinyGo,基于LLVM,在微控制器和小系统上编译和运行 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种微处理器板 。
更多技术细节请参阅原项目 。

推荐阅读