Vala

**Vala** 是一門物件導向的程式語言，由自舉編譯器產生 C 語言代碼和使用 GObject 系統，允許在 GNOME 執行時庫的基礎上使用大量現代的編程技巧。通過使用 GLib 和 GObject，Vala 提供了動態型別系統和基於參照計數（reference counting）系統的記憶體管理的功能。

## 描述

Vala 是一門程式語言，結合了手稿語言的進階程式語言建造時間效能，與低階的程式語言執行時間效能。相較於用 C 寫成的應用和庫，它致力於將現代程式語言特徵帶給 GNOME 開發者，而不用強加任何額外的執行時間要求，並且不用使用不同的 ABI。Vala 的語法類似於 C#，並為了更好的適應 GObject 型別系統而做了修改。

Vala 由 Jürg Billeter 構想，並由他和 Raffaele Sandrini 實現，他希望開發 GNOME 應用能有對 C 語言的更進階替代者。他們的確喜歡 C# 的語法和語意，但不想使用 Mono，故而他們在 2006 年 5 月完成了一個編譯器。最初它使用 C 來引導，一年後（在 2007 年 7 月的版本 0.1.0 發行中），Vala 編譯器實現了自宿主。

## 版本歷史

## 語言設計

### 特徵

Vala 使用 GLib 和它的子模組（GObject、GModule、GThread、GIO）作為核心庫，它們對於多數作業系統都能獲得到，並提供：平台無關執行緒、輸入 / 輸出、檔案管理、網路通訊端、外掛程式、正規表示式等。Vala 的語法目前支援如下現代語言特徵：

* 介面
* 屬性
* 訊號
* Foreach
* lambda 表達式
* 局部變數的類型推論
* 泛型
* 非空類型
* 輔助記憶體管理
* 例外處理

圖形化使用者介面可以使用 GTK 部件工具箱和 Glade GUI 建造器來開發。

### 記憶體管理

對於記憶體管理，GType 或 GObject 系統提供參照計數。在 C 語言中，編程者必須手工管理增加和移除參照，而在 Vala 中，管理這種參照計數是自動化的，如果編程者使用語言內建參照類型而非普通指標的話。唯一需要當心的是避免生成參照環，因為在這種情況下記憶體管理系統不能正確工作，此時需要使用 Vala 內建的 `week` 關鍵字標註弱參照解決。

對於不支援參照計數的類型，Vala 也支援按照生命周期自動釋放記憶體的非參照計數記憶體管理；Vala 還可以通過指標手工記憶體管理。

### 繫結

Vala 意圖提供但現存 C 庫的執行時間存取，特別是基於 GObject 的庫，而不需要執行時繫結。要通過 Vala 使用一個由 C 語言編寫的庫，全部所需就是一個 API 檔案（.vapi），包含採用 Vala 語法的類和方法聲明。但是不支援 C++ 庫。目前在 Vala 的每次發行中，都包括了 GTK 以及大部份的 GNU 專案和 GNOME 平台的 vapi 檔案。還有用 Vala 寫的一個庫叫做 Gee，為常用資料結構提供基於 GObject 的介面和類。

為從用其他語言比如 C# 寫的應用存取 Vala 庫，寫繫結生成器也應當是容易的，因為 Vala 解析器被寫為一個庫，所以所有執行時資訊在生成一個繫結的時候都是可獲得到的。

## 工具

### 編輯器

Vala 的開發工具近些年來有了顯著改進。下面是具有支援 Vala 編程的外掛程式的一些流行 IDE 和文字編輯器：

* GNOME Builder
* Visual Studio Code，具有 Vala 外掛程式
* Vim，具有 arrufat/vala.vim 外掛程式
* Emacs，具有 vala-mode
* Atom
* Geany
* Kate

### 代碼智慧型

目前，有兩個活躍開發的語言伺服器為 Vala 提供了代碼智慧型：

* vala-lang/vala-language-server，設計用於支援 LSP 的任何編輯器，包括 VSCode、vim 和 GNOME Builder。
* esodan/gvls，目前是 Vala 在 GNOME Builder 中的預設語言伺服器，它對支援 LSP 的任何編輯器提供支援。

### 建造系統

目前，有一些建造系統支援 Vala，包括 Automake、CMake、Meson 等。

### 除錯

對 Vala 程式的除錯可以使用 GDB 或 LLDB。對於 IDE：

* GNOME Builder 擁有通過 GDB 的對 Vala 的內建除錯支援。
* Visual Studio Code 擁有對 GDB 和 LLDB 的擴充，比如 cpptools 和 CodeLLDB。

## 示範代碼

一個簡單的「Hello world」程式：

### 物件導向

下面是更複雜的一個版本，表現了 Vala 的一些物件導向的特徵：

因為在 GObject 庫的情況下，Vala 不支援多重繼承，但是 Vala 中的類可以實現任何數量的介面，它可以包含它們的方法的預設實現。下面一段代碼展示具有預設實現的 Vala 介面（有時稱為 mixin）：

### 訊號和回呼

下面是基本例子，展示如何定義一個訊號於非緊湊（compact）的一個類中，它擁有用 Vala 通過 GLib 建造的一個訊號系統。接著註冊回呼函式到這個類的一個實例的這個訊號。這個實例可以傳送這個訊號，而連接到這個實例的每個回呼函式（也叫做處理器），將安它們連接上的次序來呼叫：

### 執行緒

在 Vala 中新執行緒是代碼的一部份，比如要求在執行時間並行執行的一個函式。新執行緒的建立和同步是用時 GLib 中的 `Thread` 類完成的，它在建立新執行緒時接受一個函式作為參數，如下面（非常簡化的）例子所示：

### 圖形化使用者介面

使用 GTK 來建立一個圖形化使用者介面的 "Hello, World!" 程式：

在 GNOME 40 平台上，需要以下命令來編譯這一範例:

## 參見

* Genie，基於 Vala 編譯器的具有近似 Python 語法的一種語言。
* Shotwell，用 Vala 寫的圖片組織器。
* Geary，用 Vala 寫的郵件客戶端。
* elementary OS，具有大多用 Vala 編程的桌面環境的 Linux 發行版。
* Budgie，大多用 Vala 編程的 Linux 桌面環境。

## 參照

## 外部連結

* The Vala Programming Language（頁面存檔備份，存於網際網路檔案館）, on GNOME Live!
* Vala 語言書籍《Introducing Vala Programming》 （Apress （頁面存檔備份，存於網際網路檔案館） / Amazon （頁面存檔備份，存於網際網路檔案館））
* 面向 Java 開發者的 Vala 特性介紹 （頁面存檔備份，存於網際網路檔案館）
* 面向 C# 開發者的 Vala 特性介紹 （頁面存檔備份，存於網際網路檔案館）
* Benchmark of Vala versus C# and C（頁面存檔備份，存於網際網路檔案館）
* Vala 語言編程規範（Geary 版） （頁面存檔備份，存於網際網路檔案館）
* Vala 的語言伺服器（Language Server Protocol）專案： VLS （頁面存檔備份，存於網際網路檔案館）， GVLS （頁面存檔備份，存於網際網路檔案館）
* Vala 語言社群： The Vala community on GitHub （頁面存檔備份，存於網際網路檔案館）
* Vala 語言案例列表 （頁面存檔備份，存於網際網路檔案館）
* Vala 語言開發的資料庫管理工具： DBKangaroo （頁面存檔備份，存於網際網路檔案館）
* Vala 語言庫：官方庫
* Vala 語言庫：第三方庫 （頁面存檔備份，存於網際網路檔案館）