热门问题
时间线
聊天
视角
Vala
程式語言 来自维基百科,自由的百科全书
Remove ads
Vala是一門面向對象的編程語言,由自舉編譯器產生C語言代碼和使用GObject系統,允許在GNOME運行時庫的基礎上使用大量現代的編程技巧。通過使用GLib和GObject,Vala提供了動態類型系統和基於引用計數(reference counting)系統的記憶體管理的功能。
描述
Vala是一門編程語言,結合了腳本語言的高級編程語言建造時間性能,與低級的編程語言運行時間性能。相較於用C寫成的應用和庫,它致力於將現代編程語言特徵帶給GNOME開發者,而不用強加任何額外的運行時間要求,並且不用使用不同的ABI。Vala的語法類似於C#,並為了更好的適應GObject類型系統而做了修改[2]。
Vala由Jürg Billeter構想,並由他和Raffaele Sandrini實現,他希望開發GNOME應用能有對C語言的更高級替代者。他們的確喜歡C#的語法和語義,但不想使用Mono,故而他們在2006年5月完成了一個編譯器。最初它使用C來引導,一年後(在2007年7月的版本0.1.0發行中),Vala編譯器實現了自舉。
版本歷史
Remove ads
語言設計
Vala使用GLib和它的子模塊(GObject、GModule、GThread、GIO)作為核心庫,它們支持多數操作系統,並提供:平台無關線程、輸入/輸出、文件管理、網絡套接字、插件、正則表達式等。Vala的語法目前支持如下現代語言特徵:
對於內存管理,GType或GObject系統提供引用計數。在C語言中,編程者必須手工管理增加和移除引用,而在Vala中,管理這種引用計數是自動化的,如果編程者使用語言內建引用類型而非普通指針的話。唯一需要當心的是避免生成引用環,因為在這種情況下內存管理系統不能正確工作,此時需要使用Vala自帶的week
關鍵字標註弱引用解決。[4]
對於不支持引用計數的類型,Vala也支持按照生命周期自動釋放內存的非引用計數內存管理;Vala還可以通過指針手工內存管理。[5]
Vala意圖提供但現存C庫的運行時間訪問,特別是基於GObject的庫,而不需要運行時綁定。要通過Vala使用一個由C語言編寫的庫,全部所需就是一個API文件(.vapi),包含採用Vala語法的類和方法聲明。但是不支持C++庫。目前在Vala的每次發行中,都包括了GTK以及大部份的GNU項目和GNOME平台的vapi文件。還有用Vala寫的一個庫叫做Gee,為常用數據結構提供基於GObject的接口和類[6]。
為從用其他語言比如C#寫的應用訪問Vala庫,寫綁定生成器也應當是容易的,因為Vala解析器被寫為一個庫,所以所有運行時信息在生成一個綁定的時候都是可獲得到的。
工具
- GNOME Builder擁有通過GDB的對Vala的內建調試支持。
- Visual Studio Code擁有對GDB和LLDB的擴展,比如cpptools和CodeLLDB[7]。
示範代碼
一個簡單的「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 () {
print ("Callback A\n");
}
void callback_b () {
print ("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 ()) {
printerr ("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!"程序:
int main (string[] args) {
var app = new Gtk.Application (
"com.example.App",
ApplicationFlags.DEFAULT_FLAGS
);
app.activate.connect (() => {
var win = new Gtk.ApplicationWindow (app) {
title = "Hello, World!",
default_width = 350,
default_height = 70
};
var label = new Gtk.Label ("Hello, World!");
win.child = label;
win.present ();
});
return app.run (args);
}
在GTK 4平台上,需要以下命令來編譯這一示例:
valac --pkg gtk4 hellogtk.vala
參見
- Genie,基於Vala編譯器的具有近似Python語法的一種語言。
- Shotwell,用Vala寫的圖片組織器。
- Geary,用Vala寫的郵件客戶端。
- elementary OS,具有大多用Vala編程的桌面環境的Linux發行版。
- Budgie,大多用Vala編程的Linux桌面環境。
引用
外部連結
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads