For faster navigation, this Iframe is preloading the Wikiwand page for Vala.

Vala

维基百科,自由的百科全书

Vala
Vala Logo.svg
编程范型面向对象结构化指令式
实现者Jürg Billeter, Raffaele Sandrini
发行时间2006年,​16年前​(2006
稳定版本
0.56.2
(2022年7月14日,​31天前​(2022-07-14
类型系统静态类型, 强类型
操作系统所有支持GLib的平台
许可证GNU宽通用公共许可证2.1+
文件扩展名.vala, .vapi
网站wiki.gnome.org/Projects/Vala
启发语言
C, C++, C♯, D, Java, BOO

Vala是一门面向对象编程语言,由自举英语Self-hosting_(compilers)编译器产生C语言代码和使用GObject系统,允许在Gnome运行时库的基础上使用大量现代的编程技巧。通过使用GLibGObject,Vala提供了动态类型系统和基于引用计数(reference counting)系统的内存管理的功能。

描述

Vala是一门编程语言,结合了脚本语言的高级编程语言建造时间性能,与低级的编程语言运行时间性能。相较于用C写成的应用和库,它致力于将现代编程语言特征带给GNOME开发者,而不用强加任何额外的运行时间要求,并且不用使用不同的ABI。Vala的语法类似于C#,并为了更好的适应GObject类型系统而做了修改[1]

历史

版本 发行日期[2]
旧版本,不再支持: 0.0.1 2006-07-15
旧版本,不再支持: 0.1.0 2007-07-09
旧版本,不再支持: 0.10.0 2010-09-18
旧版本,不再支持: 0.20.0 2013-05-27
旧版本,不再支持: 0.30.0 2015-09-18
当前版本: 0.40.25 2021-01-11
旧版本,不再支持: 0.42.0 2018-09-01
旧版本,不再支持: 0.44.0 2019-05-09
旧版本,不再支持: 0.46.0 2019-09-05
当前版本: 0.48.23 2022-02-21
旧版本,不再支持: 0.50.0 2020-09-11
当前版本: 0.52.11 2022-02-21
当前版本: 0.54.7 2022-02-14
格式:
旧版本
旧版本,仍被支持
当前版本
最新的预览版
未来版本
对于旧版本只列出最初发行

Vala由Jürg Billeter构想,并由他和Raffaele Sandrini实现,他希望开发GNOME应用能有对C语言的更高级替代者。他们的确喜欢C#的语法和语义,但不想使用Mono,故而他们在2006年5月完成了一个编译器。最初它使用C来引导英语Bootstrapping (compilers),一年后(在2007年7月的版本0.1.0发行中),Vala编译器成为自宿主英语Self-hosting (compilers)

语言设计

特征

Vala使用GLib和它的子模块(GObject、GModule、GThread、GIO)作为核心库,它们对于多数操作系统都能获得到,并提供:平台无关线程输入/输出文件管理网络套接字插件正则表达式等。Vala的语法目前支持如下现代语言特征:

图形用户界面可以使用GTK部件工具箱Glade GUI建造器英语Graphical user interface builder来开发。

内存管理

对于内存管理,GType或GObject系统提供引用计数。在C语言中,编程者必须手工管理增加和移除引用,而在Vala中,管理这种引用计数是自动化的,如果编程者使用语言内建引用类型而非普通指针的话。唯一需要当心的是避免生成引用环,因为在这种情况下内存管理系统不能正确工作[3]

Vala还允许通过指针的手工内存管理作为一个选项。

绑定

Vala意图提供但现存C库的运行时间访问,特别是基于GObject的库,而不需要运行时间绑定。要通过Vala使用一个库,全部所需就是一个API文件(.vapi),包含采用Vala语法的类和方法声明。但是不支持C++库。目前在Vala的每次发行中,都包括了GTK以及大部分的GNU项目和GNOME平台的vapi文件。还有用Vala写的一个库叫做Gee,为常用数据结构提供基于GObject的接口和类[4]

为从用其他语言比如C#写的应用访问Vala库,写绑定生成器也应当是容易的,因为Vala解析器被写为一个库,所以所有运行时间信息在生成一个绑定的时候都是可获得到的。

工具

编辑器

Vala的开发工具近些年来有了显著改进。下面是具有支持Vala编程的插件的一些流行IDE文本编辑器

代码智慧

目前,有两个活跃开发的语言服务器为Vala提供了代码智慧英语Intelligent code completion

  • benwaffle/vala-language-server,设计用于支持LSP的任何编辑器,包括VSCode、vim和GNOME Builder[8]
  • esodan/gvls,目前是Vala在GNOME Builder中的缺省语言服务器,它对支持LSP的任何编辑器提供支持[9]

建造系统

目前,有一些建造系统支持Vala,包括AutomakeCMakeMeson[10]

调试

对Vala程序的调试可以使用GDBLLDB英语LLDB (debugger)。对于IDE

示范代码

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

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

面向对象

下面是更复杂的一个版本,表现了Vala的一些面向对象的特征:

class HelloWorld: Object {
	private uint year = 0;
	
	public HelloWorld () {
	}
	
	public HelloWorld.with_year (int year) {
		if (year>0)
			this.year = year;
	}

	public void greeting () {
		if (year == 0)
			print ("Hello World\n");
		else
			/* Strings prefixed with '@' are string templates. */
			print (@"Hello World, $(this.year)\n"); 
	}
}

void main (string[] args) {
	var helloworld = new HelloWorld.with_year (2021);
	helloworld.greeting ();
}

因为在GObject库的情况下,Vala不支持多重继承,但是Vala中的类可以实现任何数量的接口,它可以包含它们的方法的缺省实现。下面一段代码展示具有缺省实现的Vala接口(有时称为mixin):

using GLib;

interface Printable {
	public abstract string print ();

	public virtual string pretty_print () {
		return "Please " + print ();
	}
}

class NormalPrint: Object, Printable {
	string print () {
		return "don't forget about me";
	}
}

class OverridePrint: Object, Printable {
	string print () {
		return "Mind the gap";
	}

	public override string pretty_print () {
		return "Override";
	}
}

void main (string[] args) {
	var normal = new NormalPrint ();
	var overridden = new OverridePrint ();

	print (normal.pretty_print ());
	print (overridden.pretty_print ());
}

信号和回调

下面是基本例子,展示如何定义一个信号于非紧凑(compact)的一个类中,它拥有用Vala通过GLib建造的一个信号系统。接着注册回调函数到这个类的一个实例的这个信号。这个实例可以发送这个信号,而连接到这个实例的每个回调函数(也叫做处理器),将安它们连接上的次序来调用:

class Foo {
    public signal void some_event ();   // 定义一个信号

    public void method () {
        some_event ();                  // 发送这个信号(回调得以调用)
    }
}

void callback_a () {
    stdout.printf ("Callback A\n");
}

void callback_b () {
    stdout.printf ("Callback B\n");
}

void main () {
    var foo = new Foo ();
    foo.some_event.connect (callback_a);      // 连接回调函数
    foo.some_event.connect (callback_b);
    foo.method ();
}

线程

在Vala中新线程是代码的一部分,比如要求在运行时间并发执行的一个函数。新线程的创建和同步是用时GLib中的Thread类完成的,它在创建新线程时接受一个函数作为参数,如下面(非常简化的)例子所示:

int question(){
    // 一些print操作 
    for (var i = 0; i < 3; i++){
        print (".");
        Thread.usleep (800000);
        stdout.flush ();
    }

    return 42;
}

void main () {
    if (!Thread.supported ()) {
        stderr.printf ("Cannot run without thread support.\n");
        return;
    }
    print ("The Ultimate Question of Life, the Universe, and Everything");
    // 泛型参数是返回值的类型
    var thread = new Thread<int> ("question", question);

    print(@" $(thread.join ())\n");
}

图形用户界面

使用GTK来创建一个图形用户界面的"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

参见

  • Genie,基于Vala编译器的具有近似Python语法的一种语言。
  • Shotwell,用Vala写的图片组织器。
  • Geary英语Geary (e-mail client),用Vala写的邮件客户端。
  • elementary OS,具有大多用Vala编程的桌面环境的Linux发行版。
  • Budgie,大多用Vala编程的Linux桌面环境。

引用

  1. ^ Vala· GitLab. GNOME. [16 March 2021]. (原始内容存档于2022-05-08). 
  2. ^ Vala Releases. Vala Project. [2021-03-18]. (原始内容存档于2022-03-08). 
  3. ^ Vala's Memory Management Explained. [2022-03-08]. (原始内容存档于2022-05-05). 
  4. ^ Libgee on Gitlab. [2022-03-08]. (原始内容存档于2022-03-24). 
  5. ^ 5.0 5.1 Coding in Vala with Visual Studio Code. [2021-03-17]. (原始内容存档于2022-03-08). 
  6. ^ Coding in Vala with the Vim Text Editor. [2021-03-17]. (原始内容存档于2022-03-08). 
  7. ^ Enable Vala syntax highlighting and code browser support in GNU Emacs. [2021-03-17]. (原始内容存档于2021-05-12). 
  8. ^ benwaffle/vala-language-server on Github. GitHub. [2021-03-17]. (原始内容存档于2021-01-07). 
  9. ^ esodan/gvls on GitLab. [2021-03-17]. (原始内容存档于2022-03-08). 
  10. ^ Vala Tools. [2021-03-29]. (原始内容存档于2022-01-06). 

外部链接

{{bottomLinkPreText}} {{bottomLinkText}}
Vala
Listen to this article

This browser is not supported by Wikiwand :(
Wikiwand requires a browser with modern capabilities in order to provide you with the best reading experience.
Please download and use one of the following browsers:

This article was just edited, click to reload
This article has been deleted on Wikipedia (Why?)

Back to homepage

Please click Add in the dialog above
Please click Allow in the top-left corner,
then click Install Now in the dialog
Please click Open in the download dialog,
then click Install
Please click the "Downloads" icon in the Safari toolbar, open the first download in the list,
then click Install
{{::$root.activation.text}}

Install Wikiwand

Install on Chrome Install on Firefox
Don't forget to rate us

Tell your friends about Wikiwand!

Gmail Facebook Twitter Link

Enjoying Wikiwand?

Tell your friends and spread the love:
Share on Gmail Share on Facebook Share on Twitter Share on Buffer

Our magic isn't perfect

You can help our automatic cover photo selection by reporting an unsuitable photo.

This photo is visually disturbing This photo is not a good choice

Thank you for helping!


Your input will affect cover photo selection, along with input from other users.