vala, vala!

LiYanrui posted @ Dec 24, 2009 05:06:00 PM in 程序设计 with tags vala gtk gtkglext glib , 9084 阅读

这 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 一些,准备迎接我个人认为的那些巨大的变化。

 

Head_small
皮贝贝 说:
2009年12月24日 20:16

Vala 越过了 C++ 去模仿了 Java 了, Gnome 不知道会不会离开 GPL协议

G.S.Alex 说:
2009年12月24日 21:43

哈~一直也在关注vala

相比java,vala更类似c sharp 一些。

ShiningRay 说:
2009年12月25日 19:32

早些时候看到vala确实觉得不错
但是总觉得缺点什么

era.elite 说:
2009年12月25日 21:27

gnome-globalmenu就是用vala写的

GunsNRose 说:
2009年12月28日 04:36

挺牛的项目
最近在学习gobject
可以用 vala来反向工程学一下gobject :D

Avatar_small
Ekd123 说:
2011年4月12日 13:16

毫不犹豫的顶起~
vala最大的好处就是gtkaml的界面设计~XML格式类似glade,这种很类似OFL

@皮贝贝: 错了,语法是仿C#的


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter