Vala

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索
Vala
パラダイム マルチパラダイム: 命令型言語, 構造化言語, オブジェクト指向言語
登場時期 2006
開発者 Jürg Billeter, Raffaele Sandrini
最新リリース 0.21.1[1] / 2013年08月2日(8か月前) (2013-08-02
型付け 強い静的型付け
影響を受けた言語 C, C++, C#, D, Java, Python
プラットフォーム クロスプラットフォーム
ライセンス LGPL 2.1+
ウェブサイト live.gnome.org/Vala
拡張子 .vala, .vapi

ValaGObjectを利用したC言語のソースコードを生成する、セルフホスティングコンパイラを持つオブジェクト指向言語である。C#に似た構文を持ち、無名関数シグナル、プロパティ、ジェネリクスメモリ管理例外処理型推論、および、for-eachなど、C言語にはない言語仕様を持つ[2]。開発者であるJürg BilleterとRaffaele Sandriniは、これらの機能を小さいオーバーヘッドかつ特殊なランタイムライブラリを使わずに、GObject オブジェクトシステムを利用した"生の"C言語の実行環境に取り込むことを目的とした。そのため、Valaはアセンブリや中間言語に直接コンパイルされるのではなく、C言語のソースコードにコンパイルされるため、Valaの出力するC言語のソースコードはgccなどの標準的なC言語のコンパイラでコンパイルすることができる[3]

メモリ管理に関して、GObjectシステムは参照カウントを提供する[4]。C言語ではプログラマーが手動で参照の追加や削除を行わなければならないが、Valaでは、プログラマーが直接ポインタを利用せず、言語に備わっている参照型を利用する限り、参照カウントの管理は自動で行われる。

ValaからC言語のライブラリを利用するには、言語間の接続を定義するvapiファイルを書く必要がある。このような定義を書くことは、特にGObjectをベースした場合には、C言語のライブラリに対する良いドキュメントとなる。ただし、C++のライブラリは利用できない。vapiファイルはGTK+を含む大半のGNOMEプラットフォームについて提供されている。

ValaはJürg Billeterにより構想され、彼とRaffaele Sandriniにより実装、2006年3月にセルフホスティングコンパイラとして完成した[5]

[編集]

単純な "Hello, World!" プログラム (en:GTK+ 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 */
 
 
#include <glib.h>
#include <glib-object.h>
#include <stdlib.h>
#include <string.h>
#include <gtk/gtk.h>
 
#define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
 
 
 
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);
}


開発環境[編集]

ValaのIDEを提供するために、様々なプロジェクトが存在する。

関連項目[編集]

  • Genie - Pythonに似た文法を持つ、Valaコンパイラのための言語。
  • MonoDevelop - Valaをサポートする、Linux、Windows、Mac OS Xで利用できるIDE[8]
  • Shotwell - Valaで書かれた、画像管理アプリケーション。
  • Ease - Valaで書かれた、プレゼンテーション用ソフトウェア。

脚注[編集]


外部リンク[編集]

他言語との比較