- 注册时间
- 2004-11-1
- 最后登录
- 2018-4-24
版主
- 积分
- 548
|
终于离开D这个泥潭了。
记得以前说过,我个人中意的语言应该是语法风格像python那样,但是要强类型,最少要能实现C99的绝大部分功能,可以面向对象,编译成二进制文件。现在终于发现了个基本符合这个条件的新语言。名字就叫Genie。(不知道是翻译成精灵还是妖怪- . -)
说到Genie,就不能不提Vala,vala是使用Gboject的“非常类似”C#的语言,所以就不用多说了。值得一提的是Vala是把自己编译成c源代码,然后再编译成二进制文件。而Genie和Vala直接共用同一个编译器,编译流程也是差不多的,自然Genie和Vala之间就可以无缝结合使用。
一般说来,Genie(Vala)编译出来的exe文件至少要须要两个dll:libglib-2.0-0.dll(1m左右) 和 libobject-2.0-0.dll(300k左右),由于这个编译器是基于LGPL2.1+协议,所以就没什么办法把这两个dll改成静态连接了。但是,最近的版本提供了一个指定profile的方式,可以让我们默认使用c标准库这样的库,这样出来的结果就不一定需要那些dll了。但是,似乎这个功能还在开发中,目前还不少的限制(下面详谈),以后可能会好点吧。
因为我的操作系统是Windows,所以只能考虑非官方的windows编译版。地址:http://code.google.com/p/valide/downloads/list
目前最新的vala-0.7.9.exe,基于mingw。直接安装的话,环境变量什么的全部一次性搞定。
c:\valac-0.7.9\bin\valac.exe是Genie和Vala的编译器。
它接受四种后缀名的文件:
*.vala 和 *.vapi 这两种是Vala用的
*.gs Genie的源文件
*.c 不用多说
测试一下那个惯例。
helloworld.gs:- [indent=4]
- init
-     print "Hello,World!"
复制代码
1.[indent=4] 是告诉编译器,这个源代码是用了4个空格来作缩进。这里一定要注意,空格数一旦搞错了,就会报错。
用indent指明缩进其实可以不写,但源代码里就必须只用tab来缩进。这也就是编译器的默认模式吧。
源代码直接变成了:- init
-     print "Hello,World!"
复制代码 这样就好看多了。为什么出现要指定缩进的功能?我猜可能是有的代码编辑器默认会把tab转成空格吧。
2.init 程序的入口,和c语言中的main是一个意思吧。
3.最后要留一个空行,这也是所有mingw系的源代码的通病。
编译命令:
valac helloworld.gs
结果是helloworld.exe,这个结果除去必需带上的两个dll外,是16k,明显是debug模式编译的exe。
因为是基于gcc的,所以和gcc一样,可以用-X把-s -O2这样的参数传给链接器。
valac -X -s  -X -O2 helloworld.gs
最后的exe只有5k,小了不少。
像HelloWorld这样的简单程序,可以用profile功能来去掉glib,gobject的支持。
编译命令:
valac -X -s  -X -O2 --profile=posix helloworld.gs
最后的结果,还是5k。但是这可是真正的5K,不再需要用那两个dll了。
如果对后台发生了什么感兴趣的话,编译时可以加上-C或着--ccode参数用来生成c源代码。
valac --ccode --profile=posix helloworld.gs
或
valac -C --profile=posix helloworld.gs
结果是- /* helloworld.c generated by valac, the Vala compiler
- * generated from hw.gs, do not modify */
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- void _main (char** args, int args_length1);
- void _main (char** args, int args_length1) {
-     printf ("Hello,World!\n");
- }
- int main (int argc, char ** argv) {
-     _main (argv, argc);
-     return 0;
- }
复制代码 完全就是标准c的那些东西,自然就不再需要什么g库了。
最可惜的就是,目前不是所有的代码都能这么直接去掉g库的支持。如果代码里用到了class,list,array...就完蛋了。
换句话说,如果不打算用高级的数据结构,面像对象...就可以把Genie当成python风格的c语言。
这也算是一种用法吧。
ps.又看了下,连enum都不能脱离g库,看来替代c,目前来说也是不可能的,只有等Genie进一步的发展。
ps2.如果在windows下使用valac出现 error: Failed to execute child process...的错误时,可以试试加上--cc=gcc来指定一下c编译器,应该就能正常了。 |
|