
Vala
此條目没有列出任何参考或来源。 (2019年5月17日) |
![]() | |
编程范型 | 面向对象程序设计、结构化程序设计、命令式编程 |
---|---|
實作者 | Jürg Billeter, Raffaele Sandrini |
发行时间 | 2006年 |
穩定版本 | 0.50.4
(2021年2月28日
) |
預覽版本 | 0.51.3
(2021年2月27日
) |
型態系統 | 静态类型, 强类型 |
作業系統 | 所有支持GLib的平台 |
許可證 | GNU宽通用公共许可证2.1+ |
文件扩展名 | .vala, .vapi |
網站 | wiki |
啟發語言 | |
C, C++, C♯, D, Java, BOO |
Vala是一門物件導向的程式語言,由自举編譯器產生C語言代碼和使用GObject系統,允许在Gnome运行时库的基础上使用大量现代的编程技巧。通过使用GLib和GObject,Vala提供了动态类型系统和基于引用计数(reference counting)系统的内存管理的功能。
Vala 语言特点或优势[编辑]
此條目不符合維基百科的质量标准,需要完全重寫。 |
1、语法兼容C#和Java
具有类似C#/Java的表达能力,同时又兼顾原生C语言编译的性能和速度;
面向 Java 开发者的Vala 特性介绍 面向 C# 开发者的 Vala 特性介绍
2、内存所有权和使用引用计数管理,内存使用安全
3、支持接口:支持抽象接口,也支持接口实现
接口实现类似于PHP traits 和 JavaScript 的Mixin的功能;
4、点分名字空间支持大型应用开发
在 DBKangaroo 应用中,已经用 Vala 开发了335个源码模块(2021.2.11),拆分为三个子项目:2个库,一个EXE; Vala 编译器本身就是一个最典型的大型应用;
5、语言级别的正则表达式支持
语言级别集成正则表达式库 PCRE2;
(顺便推荐好工具: 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官方语言
一些使用Vala的大型项目
Elementary OS - 被誉为最具设计感的GNU/Linux发行版
Kangaroo - 基于 GTK 构建的跨平台数据库工具软件
Geary - 电子邮件客户端。
Budgie - 一个基于GTK+的桌面环境,着重于简洁美观。
Ambition - 网页框架设计软件。
Valum - 网页框架设计软件。
支持工具[编辑]
集成开发环境(IDE):
Visual Studio Code(Extension: Vala Code / Vala Language Client + Vala Grammar)
示范代码[编辑]
一个简单的“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 ();
}
}
使用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
以下展示一个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);
}
}
}
}
外部链接[编辑]
- The Vala Programming LanguageArchived 2012-03-10 at WebCite, on GNOME Live!
- Vala 语言书籍《Introducing Vala Programming》 (Apress / Amazon)
- 面向 Java 开发者的Vala 特性介绍
- 面向 C# 开发者的 Vala 特性介绍
- Benchmark of Vala versus C# and CArchived 2012-03-10 at WebCite
- Vala 语言编程规范(Geary版)
- Vala 的语言服务器(Language Server Protocol)项目: VLS, GVLS
- Vala 语言社区: The Vala community on GitHub
- Vala 语言案例列表
- Vala 语言开发的数据库管理工具: DBKangaroo
- Vala 语言库:官方库
- Vala 语言库:第三方库
|
|