玩玩 Vala
看了平繁介绍用 C 写 GObject 的文章,想起 Vala 貌似就是使用 GObject 的,而且是使用类似 C# 的语法,应该比用 C 写轻松的多。于是到 Vala 的主页看了一下,果然,Vala 编译的时候,会把 Vala 程序编译成 C 代码,然后再使用 C 编译器编译成本机代码,我最近觉得这种编译方式很好,因为现在而言,几乎任何一个系统,不论是 PC 的,还智能手机,抑或嵌入式设备,总会至少提供一个 C 的编译器,那么把程序先编译成 C 就等于在这些系统上都可以运行了。
另外,Vala 是所谓 self-hosting 的编译器,也就是说,Vala 的编译器是使用 Vala 编写的。这一点也是我喜欢的,我就一直没想明白,为什么 D 语言的编译器不用 D 来编写,难道是 WB 自己对 D 语言没信心?
很早就知道 Vala,不过,那个大大的 GNOME 使我误以为 Vala 只能为 Linux 编译程序,这次很高兴的知道,我错了,Vala 是可以在其它平台,甚至也是可以写嵌入式设备的程序的。
在 Vala 的主页,顺着链接找到 Val(a)IDE 的 Windows 版,下载,安装,同时选择了安装 Vala 编译器,期间自动下载了 Vala,目前最新版本是 0.7.8,安装完毕后,终于可以开始玩玩 Vala 了。
首先,我用 ValaIDE 新建了一个 GTK 的项目,尝试编译了一些 GTK 的例子,都运行的很好。
然后新建了一个 SDL 的项目,编译出错,说找不到头文件,看来 Vala 的安装包里没有包含 SDL,SDL 还是要自己安装。于是把 SDL 的头文件复制到 Vala 的 include 目录,静态库复制到 lib 目录,再编译,说找不到 SDL_Image,于是再找 SDL_Image 的头文件和库(这个库貌似要用 VC 编译)复制到相应位置,又是说一堆函数找不到,正好前一段用 C 写过一点儿 SDL 的程序,知道弯儿大概在哪里扭着,调整了一会儿参数,在项目属性里,Builder 中的 Other options: 修改为 -X '-lmingw32' -X '-lSDLmain' -X '-lSDL' -X '-lSDL_image',终于正常编译,并正常运行了,感觉很好。
目前简单的测试就是这样。
Vala 编译出的程序比较小,不过链接了几个 dll:glib 和 gobject,glib 有 1M 左右,gobject 300K 左右,稍有点儿大,不过还能接受。
我比较关心的是,它是怎么解决垃圾回收的,看了它的文档,发现,GObject 并没有使用垃圾回收器,而是使用的引用计数的方式,需要显式的使用“弱”引用来解决循环引用的问题,这一点稍显遗憾。更多的细节,大家可以看看 Vala's Memory Management Explained
另外,在使用 ValaIDE 的时候,发现它还支持一种叫 Genie 的语言,查了一下,原来也是类似 Vala,使用 GObject 的语言,只是语法比较类似 boo。
在 MonoDeveloper 的 Vala 绑定说明文件中,发现 Vala 也可以支持单元测试,使用的是 GTest,以后有空也要看看。
关于调试,我发现在 ValaIDE 里有生成调试信息的选项,而且平繁在留言里也证实,确实是可以使用 GDB 来进行调试的。不过,我个人还是倾向于使用 C# 在 VS 里调试好,然后再使用 Vala 编译,毕竟需要修改的地方很少。
类似这种把代码编译成 C,而且也是 self-hosting 的语言的,最近还有一个 Vim 的作者的 ZimBu,也可以参考一下,不过,ZimBu 的语法对我来说,还是有点儿别扭,ZimBu 的代码可以在 Google Code 找到,不过主站被墙了,要看的需要翻翻翻。。。
另外,Vala 是所谓 self-hosting 的编译器,也就是说,Vala 的编译器是使用 Vala 编写的。这一点也是我喜欢的,我就一直没想明白,为什么 D 语言的编译器不用 D 来编写,难道是 WB 自己对 D 语言没信心?
很早就知道 Vala,不过,那个大大的 GNOME 使我误以为 Vala 只能为 Linux 编译程序,这次很高兴的知道,我错了,Vala 是可以在其它平台,甚至也是可以写嵌入式设备的程序的。
在 Vala 的主页,顺着链接找到 Val(a)IDE 的 Windows 版,下载,安装,同时选择了安装 Vala 编译器,期间自动下载了 Vala,目前最新版本是 0.7.8,安装完毕后,终于可以开始玩玩 Vala 了。
首先,我用 ValaIDE 新建了一个 GTK 的项目,尝试编译了一些 GTK 的例子,都运行的很好。
然后新建了一个 SDL 的项目,编译出错,说找不到头文件,看来 Vala 的安装包里没有包含 SDL,SDL 还是要自己安装。于是把 SDL 的头文件复制到 Vala 的 include 目录,静态库复制到 lib 目录,再编译,说找不到 SDL_Image,于是再找 SDL_Image 的头文件和库(这个库貌似要用 VC 编译)复制到相应位置,又是说一堆函数找不到,正好前一段用 C 写过一点儿 SDL 的程序,知道弯儿大概在哪里扭着,调整了一会儿参数,在项目属性里,Builder 中的 Other options: 修改为 -X '-lmingw32' -X '-lSDLmain' -X '-lSDL' -X '-lSDL_image',终于正常编译,并正常运行了,感觉很好。
目前简单的测试就是这样。
Vala 编译出的程序比较小,不过链接了几个 dll:glib 和 gobject,glib 有 1M 左右,gobject 300K 左右,稍有点儿大,不过还能接受。
我比较关心的是,它是怎么解决垃圾回收的,看了它的文档,发现,GObject 并没有使用垃圾回收器,而是使用的引用计数的方式,需要显式的使用“弱”引用来解决循环引用的问题,这一点稍显遗憾。更多的细节,大家可以看看 Vala's Memory Management Explained
另外,在使用 ValaIDE 的时候,发现它还支持一种叫 Genie 的语言,查了一下,原来也是类似 Vala,使用 GObject 的语言,只是语法比较类似 boo。
在 MonoDeveloper 的 Vala 绑定说明文件中,发现 Vala 也可以支持单元测试,使用的是 GTest,以后有空也要看看。
关于调试,我发现在 ValaIDE 里有生成调试信息的选项,而且平繁在留言里也证实,确实是可以使用 GDB 来进行调试的。不过,我个人还是倾向于使用 C# 在 VS 里调试好,然后再使用 Vala 编译,毕竟需要修改的地方很少。
类似这种把代码编译成 C,而且也是 self-hosting 的语言的,最近还有一个 Vim 的作者的 ZimBu,也可以参考一下,不过,ZimBu 的语法对我来说,还是有点儿别扭,ZimBu 的代码可以在 Google Code 找到,不过主站被墙了,要看的需要翻翻翻。。。