玩玩 Vala

本文介绍了Vala编程语言的特点及初步使用经验,包括其编译流程、语法特性、内存管理方式以及支持的开发环境等。Vala是一种使用GObject的编程语言,采用类似C#的语法,能够编译为C代码并进一步生成可执行文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  看了[url=http://www.cnblogs.com/pingf/archive/2009/11/20/1606742.html]平繁介绍用 C 写 GObject 的文章[/url],想起 Vala 貌似就是使用 GObject 的,而且是使用类似 C# 的语法,应该比用 C 写轻松的多。于是到 [url=http://live.gnome.org/Vala]Vala 的主页[/url]看了一下,果然,Vala 编译的时候,会把 Vala 程序编译成 C 代码,然后再使用 C 编译器编译成本机代码,我最近觉得这种编译方式很好,因为现在而言,几乎任何一个系统,不论是 PC 的,还智能手机,抑或嵌入式设备,总会至少提供一个 C 的编译器,那么把程序先编译成 C 就等于在这些系统上都可以运行了。

  另外,Vala 是所谓 self-hosting 的编译器,也就是说,Vala 的编译器是使用 Vala 编写的。这一点也是我喜欢的,我就一直没想明白,为什么 D 语言的编译器不用 D 来编写,难道是 WB 自己对 D 语言没信心?

  很早就知道 Vala,不过,那个大大的 GNOME 使我误以为 Vala 只能为 Linux 编译程序,这次很高兴的知道,我错了,Vala 是可以在其它平台,甚至也是可以写嵌入式设备的程序的。

  在 Vala 的主页,顺着链接找到 Val(a)IDE 的 Windows 版,下载,安装,同时选择了安装 Vala 编译器,期间自动下载了 Vala,目前最新版本是 0.7.8,安装完毕后,终于可以开始玩玩 Vala 了。

  首先,我用 ValaIDE 新建了一个 GTK 的项目,尝试编译了一些 GTK 的例子,都运行的很好。

  然后新建了一个 SDL 的项目,编译出错,说找不到头文件,看来 Vala 的安装包里没有包含 SDL,SDL 还是要自己安装。于是把 SDL 的头文件复制到 Vala 的 include 目录,静态库复制到 lib 目录,再编译,说找不到 SDL_Image,于是再找 SDL_Image 的头文件和库(这个库貌似要用 VC 编译)复制到相应位置,又是说一堆函数找不到,正好前一段用 C 写过一点儿 SDL 的程序,知道弯儿大概在哪里扭着,调整了一会儿参数,在项目属性里,Builder 中的 Other options: 修改为 -X '-lmingw32' -X '-lSDLmain' -X '-lSDL' -X '-lSDL_image',终于正常编译,并正常运行了,感觉很好。

  目前简单的测试就是这样。

  Vala 编译出的程序比较小,不过链接了几个 dll:glib 和 gobject,glib 有 1M 左右,gobject 300K 左右,稍有点儿大,不过还能接受。

  我比较关心的是,它是怎么解决垃圾回收的,看了它的文档,发现,GObject 并没有使用垃圾回收器,而是使用的引用计数的方式,需要显式的使用“弱”引用来解决循环引用的问题,这一点稍显遗憾。更多的细节,大家可以看看 [url=http://live.gnome.org/Vala/ReferenceHandling]Vala's Memory Management Explained[/url]

  另外,在使用 ValaIDE 的时候,发现它还支持一种叫 [url=http://live.gnome.org/Genie]Genie[/url] 的语言,查了一下,原来也是类似 Vala,使用 GObject 的语言,只是语法比较类似 boo。

  在 MonoDeveloper 的 Vala 绑定说明文件中,发现 Vala 也可以支持单元测试,使用的是 GTest,以后有空也要看看。

  关于调试,我发现在 ValaIDE 里有生成调试信息的选项,而且平繁在留言里也证实,确实是可以使用 GDB 来进行调试的。不过,我个人还是倾向于使用 C# 在 VS 里调试好,然后再使用 Vala 编译,毕竟需要修改的地方很少。

  类似这种把代码编译成 C,而且也是 self-hosting 的语言的,最近还有一个 Vim 的作者的 ZimBu,也可以参考一下,不过,ZimBu 的语法对我来说,还是有点儿别扭,ZimBu 的代码可以在 Google Code 找到,不过主站被墙了,要看的需要翻翻翻。。。
### PTA 7-1 二叉树题目解析 #### 题目描述 给定一棵二叉树的完全前序序列,构建该二叉树并输出其层次遍历结果。假设二叉树的数据元素为单个字符且各不相同,取值范围为 A~Z 和 a~z,二叉树不为空。输入数据分为两行,第一行为二叉树完全前序序列字符(包括 `#`)个数,第二行为二叉树的完全前序序列。例如,上述二叉树的输入为:`ABD##FE###CG#H##I##`,其中 `#` 表示空位置。 #### 输入格式 - 第一行是一个整数 N (N ≤ 50),表示完全前序序列中的字符总数。 - 第二行是长度为 N 的字符串 S,表示二叉树的完全前序序列。 #### 输出格式 按照层次遍历顺序输出二叉树节点的字符,每两个字符之间用一个空格隔开。 #### 解决方案 为了实现这一功能,可以采用递归方法来重建二叉树,并通过队列来进行层次遍历。以下是具体的 Python 实现: ```python class TreeNode: def __init__(self, val=None): self.val = val self.left = None self.right = None def build_tree(preorder): if not preorder or preorder[0] == '#': return None root_val = preorder.pop(0) node = TreeNode(root_val) node.left = build_tree(preorder) node.right = build_tree(preorder) return node def level_order_traversal(root): result = [] queue = [root] while queue: current_node = queue.pop(0) if current_node is not None: result.append(current_node.val) queue.extend([current_node.left, current_node.right]) return ' '.join(result) if __name__ == "__main__": n = int(input().strip()) s = list(input().strip()) tree_root = build_tree(s) print(level_order_traversal(tree_root)) ``` 此代码片段展示了如何基于给定的前序序列创建二叉树以及执行层次遍历操作[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值