本页使用了标题或全文手工转换

Vala

维基百科,自由的百科全书
跳到导航 跳到搜索
Vala
Vala Logo.svg
编程范型 面向对象程序设计结构化程序设计命令式编程
實作者 Jürg Billeter, Raffaele Sandrini
发行时间 2006年
穩定版本
0.46.4
( 2019年11月11日,​7天前​(2019-11-11
型態系統 静态类型, 强类型
作業系統 所有支持GLib的平台
許可證 GNU宽通用公共许可证2.1+
文件扩展名 .vala, .vapi
網站 wiki.gnome.org/Projects/Vala
啟發語言
C, C++, C#, D, Java, Boo

Vala是一門物件導向程式語言,由自主英语Self-hosting編譯器產生C語言代碼和使用GObject系統,允许在Gnome运行时库的基础上使用一些现代的编程技巧。通过使用GLibGObject,Vala提供了动态类型系统和补助内存管理的功能。


Vala 语言特点或优势[编辑]

1、语法兼容C#和Java,表达能力强,生产力高

有C#/Java 的强大表达能力,又有原生编译的性能和速度,更有接地气的独特特性;

面向 Java 开发者的Vala 特性介绍 面向 C# 开发者的 Vala 特性介绍

2、内存所有权和使用引用计数管理,内存使用安全无烦恼

3、支持接口:支持抽象接口,也支持接口实现

接口实现类似于PHP traits 和 JavaScript 的mixin的功能;

4、点分名字空间支持大型应用开发

KangarooDB 应用中,已经用 Vala 开发了185个源码模块;

5、语言级别的正则表达式支持

正则表达式给予了开发者强大的力量,在代码中无处不在,越用越熟练。

顺便推荐好工具: https://regex101.com/

6、有C的速度和良好的互操作性支持

可以生成C头文件和C代码并获得全平台支持,也可以Vala与C混合编译。

7、强大且成熟的类库支持(官方支持约250个库)

基于GLib的强大类库体系,有工业级成熟度的各种库和GUI框架。

默认基于 GObject 的对象系统,也支持构建自己的单根对象体系。

8、有丰富且完善的文档支持(valadoc.org)也有大量开源项目可供参考学习

9、有多种语言服务器【LSP】实现,支持各种编辑器和IDE

https://gitlab.gnome.org/esodan/gvls

https://github.com/benwaffle/vala-language-server

10、Gnome 和 Elementary OS官方语言,并获得IBM公司研究机构采用

有大型机构和大公司采用 Vala 能给予普通开发者更大的信心加持,相信有更多开发者成为 Vala 语言用户;

支持工具[编辑]

集成开发环境(IDE): GNOME_Builder Visual Studio Code

示范代码[编辑]

一个简单的“Hello world”程序:

void main () {
    print ("Hello World\n");
}

更完整的一个版本,表现了Vala的一些面向对象的特性:

class Sample : Object {
	void run () {
		stdout.printf ("Hello World\n");
	}

	static void main (string[] args) {
		var sample = new Sample ();
		sample.run ();
	}
}

Vala 接口代码案例(带有默认实现)

using Gtk;
using Kangaroo.Illuminate.Contracts.Database;
using Kangaroo.Illuminate.Foundation;

namespace Kangaroo.Gui.Contracts 
{
    public interface IMetaLoader : GLib.Object {
        public abstract IConnection connection { get; }

        public virtual void fill_model_with_type(Gtk.ListStore model, DbMetaType meta_type)
        {
            Gtk.TreeIter tree_iter;
            GLib.Value cell_data_value;

            model.clear();
            model.append (out tree_iter);
            cell_data_value = GLib.Value(Type.STRING);
            cell_data_value.set_string("");
            model.set_value(tree_iter, 0, cell_data_value);

            string[] sql_meta_array = connection.inspector().support(meta_type);
            foreach (var meta_value in sql_meta_array) {
                model.append (out tree_iter);
                cell_data_value = GLib.Value(typeof(string));
                cell_data_value.set_string(meta_value);
                model.set_value(tree_iter, 0, cell_data_value);
            }
        }

        public virtual async void fill_model_with_sql(Gtk.ListStore model, string sql, int column = 0)
        {
            string str_value;
            Gtk.TreeIter tree_iter;
            GLib.Value cell_data_value;

            try {
                model.clear();
                model.append (out tree_iter);
                cell_data_value = GLib.Value(Type.STRING);
                cell_data_value.set_string("");
                model.set_value(tree_iter, 0, cell_data_value);

                Gda.DataModel data_model = yield connection.execute_as_model(sql);
                for (int index = 0; index < data_model.get_n_rows(); index++) {
                    str_value = data_model.get_value_at(column, index).get_string();

                    model.append (out tree_iter);
                    cell_data_value = GLib.Value(Type.STRING);
                    cell_data_value.set_string(str_value);
                    model.set_value(tree_iter, 0, cell_data_value);
                }
            } catch (Error e) {
                LoggingService.error(null, "query data failed: %s.", e.message);
            }
        }

        public virtual void fill_list_with_type(Gtk.ComboBoxText combobox, DbMetaType meta_type)
        {
            combobox.remove_all();
            combobox.append_text("");

            string[] sql_meta_array = connection.inspector().support(meta_type);
            foreach (var meta_value in sql_meta_array) {
                combobox.append_text(meta_value);
            }
        }

        public virtual async void fill_list_with_sql(Gtk.ComboBoxText combobox, string sql, int column = 0)
        {
            combobox.remove_all();
            combobox.append_text("");

            try {
                string str_value;
                Gda.DataModel data_model = yield connection.execute_as_model(sql);
                for (int index = 0; index < data_model.get_n_rows(); index++) {
                    str_value = data_model.get_value_at(column, index).get_string();
                    combobox.append_text(str_value);
                }
            } catch (Error e) {
                LoggingService.error(null, "query data failed: %s.", e.message);
            }
        }
    }
}


外部链接[编辑]