Back to blog
2 min read
The Go and Zimbu Programming Languages

2009 年 11 月 10 日这天 Google 推出了新的编程语言 Go,而此前一天 Vim 的作者 Bram Moolenaar 也推出自己开发中的语言 Zimbu。这两种语言引起了我极大的兴趣,今天阅读了文档并下载源码编译了 Go 和 Zimbu,记录一点自己的体会。

关于 Go,一个形象的说法是 A System Programming Language That’s Python Meets C++。首席软件工程师 Rob Pike 说:我们开发 Go,是因为近 10 年左右开发程序之难让我们有点沮丧。Go 的定位是系统编程,比如 Web 服务器、存储系统和数据库等,但也欢迎在其它方面的应用。由于这个语言还处于试验期,Google 内部也只是进行测试,尚未进行大规模运用,在此也无法对它做出过多评价。

目前 Go 语言提供了两种 Linux、Mac OS X 下的编译器,为 8g、6g 等 Go compiler 和基于 gcc 的 gccgo,官网介绍了安装方法。我使用的是 Ubuntu,决定采用 gccgo 编译器。安装方法在官方页面有介绍,具体操作如下。

svn checkout svn://gcc.gnu.org/svn/gcc/branches/gccgo gccgo
mkdir objdir
cd objdir
../gccgo/configure --enable-languages=c,c++,go --with-arch=core2 //这里根据你的cpu选择不同型号
make
make install

编译需要安装以下软件包:

sudo apt-get install build-essential libgmp3-dev libmpfr-dev //具体情况看configure的输出信息,我这里安装的是编译必要环境、svn和GMP、MPFR两个库。

编译前做好心理准备,我的 core2 t6570 大概编译了两个半小时……

漫长的准备工作结束后,接下来先写个经典的 Hello World 吧。

package main
import "fmt"

func main() {
  fmt.Printf("Hello, 世界\n")
}

编译运行时报错,找不到 libgo.so.0,这个问题目前还没有解决…… 发现解决方法了,报错信息为

./a.out: error while loading shared libraries: libgo.so.0: cannot open shared object file: No such file or directory

主要原因是找不到 libgo.so.0,后来发现是在/usr/local/lib64(我是 64 位系统,32 位系统可能是 lib32)内,解决方法:

export LD_LIBRARY_PATH=/usr/local/lib64

接下来就是 Zimbu 了,官方网站的介绍如下:

Suppose you want to write a new program, something like a text editor. What language would you write it in?

  • It has to be as fast as possible, so interpreted languages are out.
  • You don’t want to micro manage memory, so C is out.
  • You don’t want to require programmers to have a degree, so C++ is out.<
  • You want fast startup and not depend on a big runtime, so Java is out.
  • It has to run on most systems, anything with a C compiler, so D is out.
  • You want to have fun making something new.

No existing language really meets these demands, so let’s create a new one that does.

难道 Bram Moolenaar 想用 Zimbu 把 Vim 的代码改写一次吗?

这里可以下载到 Zimbu 的源码,目前 Zimbu 还处于开发中,可以编译一些小测试程序。

Hello World 的程序代码如下:

MAIN()
  IO.write("Hello, world!\n")
}

MAIN()就是主函数入口,不过这种大写的风格是在让人不舒服。IO 模块是作为语言的一部分,所以不需要载入的操作。字符串风格和 C 很像,大括号只保留“}”,避免了关于“{”位置的争执,这点我觉得很好。