Vala

 
Vala は GObjectを利用したC言語のソースコードを生成する、セルフホスティングコンパイラを持つオブジェクト指向言語である。C#に似た構文を持ち、無名関数やシグナル、プロパティ、ジェネリクス、メモリ管理、例外処理、型推論、および、for-eachなど、C言語にはない言語仕様を持つ。開発者であるJürg BilleterとRaffaele Sandriniは、これらの機能を特殊なランタイムライブラリなしに小さいオーバーヘッドで、GObject オブジェクトシステムを利用した"生の"C言語の実行環境に取り込むことを目的とした。そのため、Valaはアセンブリや中間言語に直接コンパイルされるのではなく、C言語のソースコードにコンパイルされ、Valaの出力するC言語のソースコードはgccなどの標準的なC言語のコンパイラでコンパイルすることができる。
メモリ管理に関して、GObjectシステムは参照カウントを提供する。C言語ではプログラマーが手動で参照の追加や削除を行わなければならないが、Valaでは、直接ポインタを利用せずに言語に備わっている参照型を利用する限り参照カウントの管理は自動で行われる。
ValaからC言語のライブラリを利用するには言語間の接続を定義するvapiファイルを書く必要がある。このような定義を書くことは、特にGObjectをベースにした場合には、C言語のライブラリに対する良いドキュメントとなる。ただしC++のライブラリは利用できない。vapiファイルはGTKを含む大半のGNOMEプラットフォームについて提供されている。
ValaはJürg Billeterにより構想され、彼とRaffaele Sandriniにより実装、2006年3月にセルフホスティングコンパイラとして完成した。
例.
単純な "Hello, World!" プログラム (を参照)
int main () {
 print ("Hello World\n");
 return 0;
より複雑な例。Valaのオブジェクト指向の特徴の一部を示している。
class Sample : Object {
 void greeting () {
 stdout.printf ("Hello World\n");
 
 static void main (string[] args) {
 var sample = new Sample ();
 sample.greeting ();
GTKを使ったGUIを作成する "Hello, World!" プログラムの例。
using Gtk;
int main (string[] args) {
 Gtk.init (ref args);
 var window = new Window ();
 window.title = "Hello, World!";
 window.border_width = 10;
 window.window_position = WindowPosition.CENTER;
 window.set_default_size(350, 70);
 window.destroy.connect (Gtk.main_quit);
 var label = new Label ("Hello, World!");
 window.add (label);
 window.show_all ();
 Gtk.main ();
 return 0;
前の例をGNOME3プラットフォームでコンパイルするには、特別なパラメータが必要である。
$ valac --pkg gtk+-3.0 hellogtk.vala
C言語に変換された結果は、次のようになる。
/* hellogtk.c generated by valac 0.21.1, the Vala compiler
 * generated from hellogtk.vala, do not modify */
gint _vala_main (gchar** args, int args_length1);
static void _gtk_main_quit_gtk_widget_destroy (GtkWidget* _sender, gpointer self);
static void _gtk_main_quit_gtk_widget_destroy (GtkWidget* _sender, gpointer self) {
 gtk_main_quit ();
gint _vala_main (gchar** args, int args_length1) {
 gint result = 0;
 GtkWindow* window = NULL;
 GtkWindow* _tmp0_ = NULL;
 GtkLabel* label = NULL;
 GtkLabel* _tmp1_ = NULL;
 gtk_init (&args_length1, &args);
 _tmp0_ = (GtkWindow*) gtk_window_new (GTK_WINDOW_TOPLEVEL);
 g_object_ref_sink (_tmp0_);
 window = _tmp0_;
 gtk_window_set_title (window, "Hello, World!");
 gtk_container_set_border_width ((GtkContainer*) window, (guint) 10);
 g_object_set (window, "window-position", GTK_WIN_POS_CENTER, NULL);
 gtk_window_set_default_size (window, 350, 70);
 g_signal_connect ((GtkWidget*) window, "destroy", (GCallback) _gtk_main_quit_gtk_widget_destroy, NULL);
 _tmp1_ = (GtkLabel*) gtk_label_new ("Hello, World!");
 g_object_ref_sink (_tmp1_);
 label = _tmp1_;
 gtk_container_add ((GtkContainer*) window, (GtkWidget*) label);
 gtk_widget_show_all ((GtkWidget*) window);
 gtk_main ();
 result = 0;
 _g_object_unref0 (label);
 _g_object_unref0 (window);
 return result;
int main (int argc, char ** argv) {
 g_type_init ();
 return _vala_main (argv, argc);