仮想のMint17.1上で行った。
コンパイル操作
Cソース出力操作
hello.vala Cソース出力結果
クラスを伴う場合。
hello2.vala
hello2.vala Cソース出力結果
-Cオプションがおもしろい。局所の関数ポインタに値を与えることで、クラスのインスタンス化を行っている。という解釈でよろしい?
Anjuta
Vala IDE
Vala -Ubuntu Documentation
Vala Tutorial -GNOME
コンパイラのインストール
$ sudo apt-get install valac $ valac --version $ Vala 0.22.1
コンパイル
hello.valavoid main() { stdout.printf("Hello Vala\n"); }
コンパイル操作
$ valac ./hello.vala
Cソース出力操作
$ valac ./hello.vala -C -H hello.h
hello.vala Cソース出力結果
/* hello.c generated by valac 0.22.1, the Vala compiler * generated from hello.vala, do not modify */ #include#include #include void _vala_main (void); void _vala_main (void) { FILE* _tmp0_ = NULL; _tmp0_ = stdout; fprintf (_tmp0_, "Hello Vala\n"); } int main (int argc, char ** argv) { g_type_init (); _vala_main (); return 0; }
クラスを伴う場合。
hello2.vala
public class MyLib : Object { public void hello() { stdout.printf("Hello World, MyLib\n"); } public int sum(int x, int y) { return x + y; } } void main() { var test = new MyLib(); test.hello(); int x = 4, y = 5; stdout.printf("The sum of %d and %d is %d\n", x, y, test.sum(x, y)); }
hello2.vala Cソース出力結果
/* hello2.c generated by valac 0.22.1, the Vala compiler * generated from hello2.vala, do not modify */ #include#include #include #define TYPE_MY_LIB (my_lib_get_type ()) #define MY_LIB(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_MY_LIB, MyLib)) #define MY_LIB_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_MY_LIB, MyLibClass)) #define IS_MY_LIB(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_MY_LIB)) #define IS_MY_LIB_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_MY_LIB)) #define MY_LIB_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_MY_LIB, MyLibClass)) typedef struct _MyLib MyLib; typedef struct _MyLibClass MyLibClass; typedef struct _MyLibPrivate MyLibPrivate; #define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL))) struct _MyLib { GObject parent_instance; MyLibPrivate * priv; }; struct _MyLibClass { GObjectClass parent_class; }; static gpointer my_lib_parent_class = NULL; GType my_lib_get_type (void) G_GNUC_CONST; enum { MY_LIB_DUMMY_PROPERTY }; void my_lib_hello (MyLib* self); gint my_lib_sum (MyLib* self, gint x, gint y); MyLib* my_lib_new (void); MyLib* my_lib_construct (GType object_type); void _vala_main (void); void my_lib_hello (MyLib* self) { FILE* _tmp0_ = NULL; g_return_if_fail (self != NULL); _tmp0_ = stdout; fprintf (_tmp0_, "Hello World, MyLib\n"); } gint my_lib_sum (MyLib* self, gint x, gint y) { gint result = 0; gint _tmp0_ = 0; gint _tmp1_ = 0; g_return_val_if_fail (self != NULL, 0); _tmp0_ = x; _tmp1_ = y; result = _tmp0_ + _tmp1_; return result; } MyLib* my_lib_construct (GType object_type) { MyLib * self = NULL; self = (MyLib*) g_object_new (object_type, NULL); return self; } MyLib* my_lib_new (void) { return my_lib_construct (TYPE_MY_LIB); } static void my_lib_class_init (MyLibClass * klass) { my_lib_parent_class = g_type_class_peek_parent (klass); } static void my_lib_instance_init (MyLib * self) { } GType my_lib_get_type (void) { static volatile gsize my_lib_type_id__volatile = 0; if (g_once_init_enter (&my_lib_type_id__volatile)) { static const GTypeInfo g_define_type_info = { sizeof (MyLibClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) my_lib_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (MyLib), 0, (GInstanceInitFunc) my_lib_instance_init, NULL }; GType my_lib_type_id; my_lib_type_id = g_type_register_static (G_TYPE_OBJECT, "MyLib", &g_define_type_info, 0); g_once_init_leave (&my_lib_type_id__volatile, my_lib_type_id); } return my_lib_type_id__volatile; } void _vala_main (void) { MyLib* test = NULL; MyLib* _tmp0_ = NULL; gint x = 0; gint y = 0; FILE* _tmp1_ = NULL; gint _tmp2_ = 0; _tmp0_ = my_lib_new (); test = _tmp0_; my_lib_hello (test); x = 4; y = 5; _tmp1_ = stdout; _tmp2_ = my_lib_sum (test, x, y); fprintf (_tmp1_, "The sum of %d and %d is %d\n", x, y, _tmp2_); _g_object_unref0 (test); } int main (int argc, char ** argv) { g_type_init (); _vala_main (); return 0; }
-Cオプションがおもしろい。局所の関数ポインタに値を与えることで、クラスのインスタンス化を行っている。という解釈でよろしい?
IDE
GeanyAnjuta
Vala IDE
参考
ValaVala -Ubuntu Documentation
Vala Tutorial -GNOME