Genie-00-新的学习目标
终于离开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:
init
print "Hello,World!"
1. 是告诉编译器,这个源代码是用了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编译器,应该就能正常了。 我的目标就是C++先玩明白再说吧 说到语法像Python的静态类型语言,还要能编译到native的,我一开始想到的是RPython…… 引用第1楼secondsen于2010-01-22 23:35发表的:
我的目标就是C++先玩明白再说吧
不是职业的,主要就看各人的喜好了。喜欢就上吧,没有理由。 引用第2楼rednaxela于2010-01-23 11:28发表的:
说到语法像Python的静态类型语言,还要能编译到native的,我一开始想到的是RPython……
以前关注过pypy,它的资料也是非常之少,就知道能翻译成c来编译,能提高最少10倍的性能...但具体怎么用,一团黑。 其实你那个_main可以放在main的后面,因为你已经在之前定义一个接口了。
或者不要那个接口也可以。
页:
[1]