2009年2月3日星期二

vala教程翻译1--概览

vala语言是gnome社区专门为Gnome开发者提供的一种现代的语法类似C#的编程语言。它提供了一种简要使用Glib和GObject库的方法。 它首先是一种静态类型的语言(这是设计时决定的不是疏忽)。vala在运行时只需要Glib和GObject库而不像Java或C#一样需要一个运行环 境。通过vala你可以使用任何系统库,仅需要提供一个VAPI文件(描述库的接口)。并且它还与DBus集成在一起。

  • Getting Started
vala语言写的经典的“Hello world”例子:
using GLib;

public class Sample : Object {
public Sample () {
}

public void run () {
stdout.printf ("Hello, world!\n");
}

static int main (string[] args) {
var sample = new Sample ();
sample.run ();
return 0;
}
}
然后存储为hello.vala,在运行以下命令:
valac -o hello hello.vala
生成了可执行文件hello。
  • Vala source file
有两种类型的Vala输入文件,vala源文件(扩展文件名为vala)。VAPI文件(扩展文件名为vapi)是描述了一个库的接口,它可以用c或vala语言来写。VAPI文件不是编译用的也不包含可执行指令。它只有在编译vala源文件的时候才会被使用。

  • Vala conventions(Vala编程风格)
vala的工程完全基于程序的文本,而不是文件的排列和命名。所以vala不要求指定的命名规则和文件排列。有几种与Gnome相近的程序建立的协议是被强烈的建议。工程的目录的结构不在这篇文档的范围之内。
Vala源文件通常包含一个主要的public class,并且是根据这个来命名源文件。一个常用的选择是将主要的class的名字变成小写的,并且加上namespace作为前缀作文件名。对于小的工程可能是多余的所以排除在外。以上的要求都不是必须的只是一个约定。
我们不鼓励在一个单独的vala源文件之中包含超过一个的namespace。namespace通常是用来分开一系列的源文件,但是namespace通常不会被工程之外使用。每个库或者程序会通常有一个主要的namespace,让其他的元素嵌入在内。
在源文件以下的命名规则通常被使用:
  • Namespaces命名为驼峰风格:NameSpaceName
  • Classes命名为驼峰风格:ClassName
  • Method名字都是小写的并且用下划线来分开字:method_name
  • Constants(和emumerated类型的值)是全部大写的,文字间用下划线分开:CONSTANT_NAME
Vala 支持用包的概念来分开程序部分。一个包不是一个安装的系统库和vala绑定的组合,就是一个相同对待的本地目录。在后一种情况下它会包含相似的一些功能 (翻译不好看原文),这个范围是由开发者决定。所有的包里的源文件被放置在一个目录里并且把目录名作为包的名字。使用包的详细方法看vala编译器文档。

  • Vala syntax(Vala语法)

Vala的语法以C#为原形,所以它是一种C风格的语言。大括号是基本的界线标志着一个声名或代码块的开始。

尽管vala和许多vala的工程中使用了一种标准形式,Vala中却没有空格的要求。这形式是一种glibgnome工程使用的编码风格,但是这种形式在这篇文档中没有被讨论,除了被所有的例子使用。

Vala的声名顺序是很灵活的,声名之前你不需要为了使用而事先声名任何东西。

不论是本地变量还是类名,变量名都是有相同的命名规则。合法的变量名必须包含字母或者下划线。把语言的关键字作为变量名也是可能的,只要在关键字前面加上”@”即可,而且在使用这种命名方式时”@”并不是所谓变量名的一部分,它只是告知编译器这个标识符是一个变量。


  • GType and Gobject

Vala使用的运行时类型系统叫做GTypeGType系统允许vala中的所有类型包括基础类型在运行时被确认。一个vala开发者在大多数情况下不需要了解GType,因为所有的和系统的交互都是自动的。

GType提供Vala一种强大的对象模型叫做GObject。所有的类型都继承于Glib.Object类,这个模型提供了比如propertiessignals那样的特性。

GTypeGObject是完全的运行时类型系统,打算对动态类型语言有用。Vala首先是一种静态类型的语言,然后也被设计成不能使用所有的GTypeGObject特性。作为代替vala使用一种条例清晰的设置来支持特别的编程风格。

Vala被设计成很少使用GTypeGObject。只有几种情况下才使用,大部分情况是当使用已存的库,或需要使用系统的一部分。这些情况都在这篇文档中被指出。


  • Memory management(内存管理)

Vala自动使用了Glib中的内存管理,这是一个引用计算系统(以后会解释)。为了使这个也能工作,这个使用的类型必须支持引用计算,所以使用的类型是必须由GObject继承的。

Vala对内存的分配和初始化是必须的。内存管理方案意味着有的时候也是可行的。Vala中没有垃圾收集器和引用循环的自动断裂。这可能会导致内存的泄露。主要的避免这种情况的方法是用弱引用——那是不被计算的引用所以不会阻止内存被释放,但是这样会导致可能会指向不存在的数据。

Vala也允许我们使用指针(象C一样)。一个指针的实例直接代表着内存的地址。指针不是引用,因此自动内存管理规则对指针没用。

详细的关于内存管理的描述以后会说明。


  • Vala compilation(Vala编译器)

Vala程序和库在被编译成机器语言之前先被翻译成C语言。这一步是完全透明的除非你要求,否则就其本身而言这不是经常被要求知道细节的。

当要进行一个比默认的valac更复杂的编译或连接过程时,valac可以被指示只输出中间的C语言形式的程序。每个vala源文件被转换成一个C头文件和一个C源文件。那些C文件可以被编译不需要任何的来自vala工具或库的帮助。

只有在一种情况下需要被提醒,当vala的特性不能被C替代时生成的C API不会和vala一模一样。例如私有struct成员对于C是毫无意义的。这些问题在这篇文档内会被提出。


  • Application entry point(程序入口)

所有的vala程序在被执行时会被调用“main”函数。这必须要一个非实例方法,但是可能存在内部的namespaceclass。如果函数以一个string数组作为参数,它会在执行时传递参数给程序。如果返回一个int类型,这个值会在程序终止时被传递给使用者。这个入口函数可能不会被传递任何参数或着返回其他类型,以下是正确的定义方法:

void main () { ... }
int main () { ... }
void main (string[] args) { ... }
int main (string[] args) { ... }

原英文文档地址:http://www.vala-project.org/doc/vala-draft/
转帖请注明,本贴来自:http://swinging-breeze.blogspot.com/2009/02/vala1.html

没有评论: