一、初识Go语言

Go语言是Google公司于2009年正式推出的一款开源的编程语言,是由Robert Griesemer、Ken Thompson和Rob Pike等世界顶尖计算科学家精心打造的零碎编程语言。Go语言最显著的特点是编码简洁迅速、反对高效并发和主动内存治理等。此外,Go语言还面向网络服务器、存储系统和数据库等畛域的编程进行了优化设计,并且简化了利用零碎的装置和部署。因而,Go语言受到了宽广程序员的青眼,越来越多地开始利用于谷歌和百度等出名中外企业的产品中。

Go语言形象标识

对于这样一个在云计算和大数据时代最具发展前景的编程语言,龙芯平台能不能很好地反对呢?明天咱们就从Go的源代码开始,逐渐构建龙芯平台上的Go语言环境。只管笔者的试验机器为装置了龙芯开源社区版操作系统Loongnix的龙芯3B迷你电脑,本文的办法实用于所有64位操作系统的MIPS处理器平台。

二、下载Go语言的源代码

为了吸引更多的社区开发力量,Google开源了Go语言的源代码,并托管于世界驰名的github网站中。咱们能够通过执行以下命令获取Go语言的全套源代码:

$ cd ~$ git clone https://github.com/golang/go.git

上述命令要求您的电脑中装置了git版本控制工具。如果您的电脑中没有预装git,能够通过如下命令疾速装置:

$ sudo yum install git

三、从源代码构建Go语言环境

因为以后最新公布的Go语言的稳固版本为Go 1.6,并且官网从该版本开始正式反对MIPS架构的处理器,故笔者以Go 1.6为例展现Go语言环境在龙芯平台上的构建办法。为了最大限度缩小Go语言对其它编程工具的依赖,从Go 1.5开始,Go语言的编译器、汇编器和链接器等底层工具链全副应用Go语言来实现。故自Go 1.5开始,从源代码装置Go语言环境时须要应用现成的Go语言编译器来编译Go的源代码,上述过程称为Go语言的自举编译。因而,从源代码装置Go 1.6时要求零碎中存在Go 1.4及其以上的Go语言环境。 因为官网从Go 1.6才开始正式反对MIPS架构,因此无奈找到现成的可用于在龙芯上进行自举编译的低版本Go编译器。好在Go语言提供了敌对的穿插编译性能,咱们能够借助X86的机器编译一个MIPS平台的Go编译器,用作在龙芯上从源码构建Go 1.6的自举编译器。因而,在龙芯平台上从源代码构建Go 1.6的环境必须分成两个阶段进行:

    1. 在X86平台上穿插编译出面向MIPS平台的Go语言自举编译工具链;
    1. 在龙芯平台上利用1)中的Go自举编译器构建Go 1.6开发环境。

    上面笔者逐渐向大家展现Go 1.6环境在龙芯平台上的构建过程。等大家走残缺个过程就会发现,在龙芯上从源代码装置Go语言环境非常简单。

    第一阶段:在X86平台上穿插编译出面向MIPS平台的Go语言自举编译工具链。

    轻易找一台装有64位Linux操作系统的X86电脑,逐渐执行以下命令。

    1. 下载Go 1.4(或者更高版本)的二进制发行版作为穿插编译的自举编译工具链 笔者抉择Go 1.4的发行版作为在X86上编译Go 1.6源代码的自举编译器。因为官网 https://golang.org 在国内无奈失常拜访,能够通过其镜像站点 http://golangtc.com/download...。笔者下载的文件为go1.4.2.linux-amd64.tar.gz,大小约59 M。下载后能够解压到任意目录,例如能够通过如下命令将其解压到/opt文件夹下并重命名为go1.4.2:
    $ tar xvzf go1.4.2.linux-amd64.tar.gz -C /opt$ mv /opt/go /opt/go1.4.2
    1. 配置穿插编译的自举编译工具链
    $ export GOROOT_BOOTSTRAP=/opt/go1.4.2
    1. 下载Go 1.6的源代码
    $ cd ~/workspace/golang/$ git clone https://github.com/golang/go.git
    1. 切换到Go 1.6的发行版
    $ cd go$ git checkout release-branch.go1.6
    1. 穿插编译 这一步通过执行脚本bootstrp.bash实现。该脚本执行前,须要通过环境变量GOOS和GOARCH别离指明穿插编译的指标操作系统和处理器架构。
    $ cd ~/workspace/golang/go/src$ GOOS=linux GOARCH=mips64le ./bootstrap.bash

    接下来就是期待穿插编译完结了。因为穿插编译无需执行Go语言官网自带的测试集,个别10分钟内即可实现编译。不出意外的话,整个过程应该十分顺利。如果您看到以下提醒,则表明穿插编译胜利。


    Bootstrap toolchain for linux/mips64le installed in /home/fool/workspace/golang/go-linux-mips64le-bootstrap.Building tbz.-rw-rw-r-- 1 fool fool 46736199  6月  3 09:08 /home/fool/workspace/golang/go-linux-mips64le-bootstrap.tbz

    穿插编译所生成的面向MIPS平台的Go语言自举编译工具链位于压缩包/home/fool/workspace/golang/go-linux-mips64le-bootstrap.tbz中。将该压缩包拷贝到龙芯电脑中备用。

    第二阶段:在龙芯平台上从源代码构建Go 1.6开发环境。

    1. 解压穿插编译生成的面向MIPS平台的自举编译工具链
    $ tar xvjf go-linux-mips64le-bootstrap.tbz -C ~/workspace
    1. 简略测验自举编译工具链是否可用
    $ cd ~/workspace/go-linux-mips64le-bootstrap/bin$ export GOROOT=/home/loongson/workspace/go-linux-mips64le-bootstrap$ ./go version

    如果察看到以下输入,则根本能够阐明穿插编译没有问题。

    go version go1.6.2 linux/mips64le
    1. 下载Go 1.6的源代码并切换到Go 1.6的发行版。
    $ cd ~/workspace$ git clone https://github.com/golang/go.git$ cd go$ git checkout release-branch.go1.6
    1. 编译配置 在当前目录创立名为env.sh的shell脚本,输出以下语句后保留退出。
    #!/bin/bashexport GOROOT_BOOTSTRAP=/home/loongson/workspace/go-linux-mips64le-bootstrapexport GOROOT=/home/loongson/workspace/go

    其中,GOROOT_BOOTSTRAP用于指向自举编译工具链的根目录,GOROOT指向Go 1.6源代码的根目录。 执行env.sh,以实现编译配置。

    $ source env.sh
    1. 首次编译
    $ cd src$ ./all.bash

    上述脚本执行时,首先会利用自举编译工具链实现对Go 1.6源代码的编译,生成龙芯上的Go 1.6环境。随后利用官网的测试集对生成的本地Go 1.6进行测试。测试的过程绝对漫长,须要急躁期待。约20分钟后,测试期间中忽然打印如下错误信息:

    ok      cmd/compile/internal/test    0.038sok      cmd/cover    18.360sok      cmd/doc    0.393sok      cmd/fix    0.192spanic: test timed out after 3m0s goroutine 489 [running]:panic(0x120552480, 0xc4203087f0)    /home/loongson/workspace/go/src/runtime/panic.go:500 +0x4c4testing.startAlarm.func1()    /home/loongson/workspace/go/src/testing/testing.go:918 +0x168created by time.goFunc    /home/loongson/workspace/go/src/time/sleep.go:132 +0x5c…FAIL    cmd/go    208.996sok      cmd/gofmt    0.270sok      cmd/internal/goobj    0.064sok      cmd/internal/obj    0.032sok      cmd/internal/obj/x86    0.067sok      cmd/internal/pprof/profile    0.048sok      cmd/link    0.077sok      cmd/nm    9.304s

    测试项目cmd/go没有通过测试。这是为什么呢?笔者起初狐疑编译生成的Go 1.6可能有问题,重复查看了编译参数的设置,但谬误仍旧。起初,思考到官网既然曾经发表Go 1.6间接反对MIPS,编译出错的概率应极小,更何况后面那么多的测试项目都能正确运行。于是将思路从对编译参数的查看转向对测试参数的排查。显然,谬误由测试超时导致,而默认的超时阈值仅为3分钟。对于龙芯和ARM等低主频的处理器,cmd/go测试项的执行工夫可能会超过3分钟。因而,在龙芯平台上有可能须要适当增大测试超时的阈值。起初,通过一系列剖析和排查,终于找到了环境变量GO_TEST_TIMEOUT_SCALE,用于对测试超时的阈值进行倍增。例如,若设置GO_TEST_TIMEOUT_SCALE = 2,则测试超时的阈值扩充为原来的两倍,即由3分钟增大到6分钟。

    1. 从新编译 依据具体平台的须要在env.sh中减少对环境变量GO_TEST_TIMEOUT_SCALE的设置,例如以下为实用于龙芯平台的env.sh。
    #!/bin/bash export GOROOT_BOOTSTRAP=/home/loongson/workspace/go-linux-mips64le-bootstrapexport GOROOT=/home/loongson/workspace/go

    Added for Loongson

    export GO_TEST_TIMEOUT_SCALE=2
    上述批改实现后,从新执行env.sh和all.bash这两个脚本。

    $ cd ~/workspace/go$ source env.sh$ cd src$ ./all.bash

    待脚本执行完结后,如果察看到如下输入信息,则阐明龙芯平台上Go 1.6的编译和测试顺利完成。整个过程约半小时。

    ALL TESTS PASSED


    Installed Go for linux/mips64le in /home/loongson/workspace/goInstalled commands in /home/loongson/workspace/go/bin*** You need to add /home/loongson/workspace/go/bin to your PATH.
    1. 装置编译生成的Go 1.6。 在~/.bashrc的开端增加如下语句
    export GOROOT=/home/loongson/workspace/goexport PATH=$PATH: $GOROOT/bin

    而后执行

     $   source ~/.bashrc

    四、龙芯上Go语言对全世界的问候

    激动人心的时刻终于到来了!咱们先运行一下Go命令,打印一下版本信息吧:

    $ go versiongo version go1.6.2 linux/mips64le

    接下来,咱们来测试一下Go的“Hello World”!关上任何一款文本编辑器,您能够应用Linux经典的vim,也能够应用更适宜公众的gedit,编写hello.go文件,仅需几行代码:

    package mainimport "fmt"func main() {    fmt.Printf("Hello World!\n")}

    首先编译源代码hello.go。Go和C/C++语言一样,属于动态编译型语言。Go的源程序必须通过编译后能力执行。

    $ go build hello.go

    上述命令会生成名为hello的可执行文件。运行hello

    $ ./helloHello World!

    亲自感触了Go语言在龙芯上的第一个HelloWorld,真是太令人兴奋了! 上述编译和执行的过程也能够应用go run命令一次性实现,例如

    $ go run hello.goHello World!

    五、持续把玩 Go!Go!Go!

    看到这里,有读者不禁会问:除了运行简略的HelloWorld,龙芯平台上的Go还能干什么?Go语言具备不便移植的个性。所有利用Go语言编写的应用程序,通过相应平台的Go语言编译器编译后,都可能在该平台上运行。所以Go语言环境在龙芯平台上的胜利构建意味着龙芯领有了Go的全套软件生态。之前在X86或ARM等平台上搭建的基于Go语言的利用零碎,当初都可能以较低的代价迅速迁徙到龙芯平台上来。 眼下基于Go的开源我的项目十分多,笔者没有工夫一一搭建。笔者生性好玩,故专门筛选了几个较为有意思我的项目进行试验。感兴趣的敌人能够尝试更多的我的项目。须要特地留神的是,在测试开源我的项目时,还须要额定 设置GOPATH环境变量。这是因为许多开源我的项目援用了Go语言的第三方库,须要从GOPATH环境变量指向的门路中加载第三方库或者将所援用的第三方库下载到该门路中。例如,笔者的设置如下:

    $ export GOPATH=/home/loongson/workspace/3rdpkg

    为了便于日后Go语言程序的开发,倡议将上述环境变量也退出到~/.bashrc文件中。

    碰撞反弹游戏 (https://github.com/kurehajime/pong-command)

    游戏时,输出任意一个字符串(如go1.6.2),该字符串会沿直线运动,遇到高低边界或左右围栏则镜面反弹。左侧围栏由电脑自动管制,右侧围栏由玩家操作。游戏的指标是管制右侧围栏在垂直方向的地位,使得字符串一直被碰撞反弹。

    龙芯平台上的碰撞反弹游戏

    汉语拼音转换工具 (https://github.com/mozillazg/go-pinyin)

    将任意汉字转换成对应的汉语拼音。例如,输出“龙芯俱乐部”的执行状况如下:

    龙芯平台上的汉语拼音转换工具

    翻译助手Utran (https://github.com/zengsai/utran)

    能够将英文翻译成汉语。例如,输出“This is go1.6.2 running on Loongson.”的执行状况如下:

    龙芯平台上的翻译助手Utran

    排序算法可视化 (https://github.com/SimonWaldherr/GolangSortingVisualization)

    可将常见的冒泡、抉择、插入和快排等排序算法的排序过程可视化。

    排序过程可视化

    六、遇到问题怎么办?

    以上是笔者在龙芯平台上从源代码构建Go语言环境的记录。读者依照这些操作步骤也应该能疾速构建好Go语言开发环境。如果遇到问题本人不能解决,龙芯社区提供了官网的Bug服务网站(http://bugs.loongnix.org/login_page.php) ,您能够把遇到的问题提交下来,龙芯团队的人会及时为您解决。

    文章来源于龙芯开源社区
    龙芯技术社区