vala, vala!
这 1 年多以来,玩 ConTeXt 把我的业余甚至部分主要时间都变成了“暗时间”。昨晚看到 gedit 小版本号更新,有点奇怪这个东西每次都更新了啥,然后就去 http://projects.gnome.org/ 去查看它的更新记录,发现很多次版本升级只是做了一些微小的 bug 修正以及界面本地化,心里对此很不以为然。正在对 gnome 每次都打太极拳感到郁闷时,在那个页面上发现了 vala。
大致浏览了一下 Vala 的主页,感觉还真有点被它“震撼”。这个基于 GObject 的仿 C# 语言,宛若一种强而有力的“粘合剂”,将 gtk+、glib、Cario、clutter、dbus……等 C 程序库“粘合”到用户自己的程序中,并且充分照顾了我们这帮喜欢写 C 代码的人。
从某种意义上来说,Vala 并非是一种新的语言,它是一种面向对象的 C 代码生成器。例如下面这个 vala 程序,即 hello.vala:
class Sample : Object { void run () { stdout.printf ("Hello World\n"); } static void main (string[] args) { var sample = new Sample (); sample.run (); } }
假如使用 `valac hello.vala` 命令来处理 hello.vala,可以直接生成 hello 程序。假如使用 `valac -C hello.vala` 命令来处理 hello.vala 文件,那么就生成了一份基于 GObject 的具有面向对象特征的 C 代码文件,即 hello.c,其内容具体如下:
#include <glib.h> #include <glib-object.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #define TYPE_SAMPLE (sample_get_type ()) #define SAMPLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_SAMPLE, Sample)) #define SAMPLE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_SAMPLE, SampleClass)) #define IS_SAMPLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_SAMPLE)) #define IS_SAMPLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_SAMPLE)) #define SAMPLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_SAMPLE, SampleClass)) typedef struct _Sample Sample; typedef struct _SampleClass SampleClass; typedef struct _SamplePrivate SamplePrivate; #define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL))) struct _Sample { GObject parent_instance; SamplePrivate * priv; }; struct _SampleClass { GObjectClass parent_class; }; static gpointer sample_parent_class = NULL; GType sample_get_type (void); enum { SAMPLE_DUMMY_PROPERTY }; static void sample_run (Sample* self); Sample* sample_new (void); Sample* sample_construct (GType object_type); static void sample_main (char** args, int args_length1); static void sample_run (Sample* self) { g_return_if_fail (self != NULL); fprintf (stdout, "Hello World\n"); } static void sample_main (char** args, int args_length1) { Sample* sample; sample = sample_new (); sample_run (sample); _g_object_unref0 (sample); } int main (int argc, char ** argv) { g_type_init (); sample_main (argv, argc); return 0; } Sample* sample_construct (GType object_type) { Sample * self; self = (Sample*) g_object_new (object_type, NULL); return self; } Sample* sample_new (void) { return sample_construct (TYPE_SAMPLE); } static void sample_class_init (SampleClass * klass) { sample_parent_class = g_type_class_peek_parent (klass); } static void sample_instance_init (Sample * self) { } GType sample_get_type (void) { static GType sample_type_id = 0; if (sample_type_id == 0) { static const GTypeInfo g_define_type_info = { sizeof (SampleClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) sample_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (Sample), 0, (GInstanceInitFunc) sample_instance_init, NULL }; sample_type_id = g_type_register_static (G_TYPE_OBJECT, "Sample", &g_define_type_info, 0); } return sample_type_id; }
我感觉真的很酷。
vala 让基于 C 语言的面向对象程序的编程效率显著得到提高,并且非常方便纠集目前众多 C 库的武装力量(我经常认为 python 的力量也源于此),在安装 vala 之后,在 /usr/share/vala/vapi 目录里可以看到目前已经实现的一些 C 库的 vala 绑定。
对于 vala 代码的编辑与编译,现在已经有了 emacs 和 vim 的扩展,另外 gnome 社区还为 vala 开发了一个 valaide。
本来是想找找 gnome 的茬,批判它“长期的无作为”一下,结果我好像被他批判了。看来以后还得把“暗时间”多分给 vala 一些,准备迎接我个人认为的那些巨大的变化。
2009年12月24日 20:16
Vala 越过了 C++ 去模仿了 Java 了, Gnome 不知道会不会离开 GPL协议
2009年12月24日 21:43
哈~一直也在关注vala
相比java,vala更类似c sharp 一些。
2009年12月25日 02:35
我个有福了~ :D
2009年12月25日 19:32
早些时候看到vala确实觉得不错
但是总觉得缺点什么
2009年12月25日 21:27
gnome-globalmenu就是用vala写的
2009年12月28日 04:36
挺牛的项目
最近在学习gobject
可以用 vala来反向工程学一下gobject :D
2011年4月12日 13:16
毫不犹豫的顶起~
vala最大的好处就是gtkaml的界面设计~XML格式类似glade,这种很类似OFL
@皮贝贝: 错了,语法是仿C#的