shawind 发表于 2010-1-22 14:03:20

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编译器,应该就能正常了。

secondsen 发表于 2010-1-22 23:35:13

我的目标就是C++先玩明白再说吧

rednaxela 发表于 2010-1-23 11:28:55

说到语法像Python的静态类型语言,还要能编译到native的,我一开始想到的是RPython……

shawind 发表于 2010-1-23 12:39:22

引用第1楼secondsen于2010-01-22 23:35发表的:
我的目标就是C++先玩明白再说吧
不是职业的,主要就看各人的喜好了。喜欢就上吧,没有理由。

shawind 发表于 2010-1-23 12:41:18

引用第2楼rednaxela于2010-01-23 11:28发表的:
说到语法像Python的静态类型语言,还要能编译到native的,我一开始想到的是RPython……
以前关注过pypy,它的资料也是非常之少,就知道能翻译成c来编译,能提高最少10倍的性能...但具体怎么用,一团黑。

tamashii 发表于 2010-1-26 13:12:16

其实你那个_main可以放在main的后面,因为你已经在之前定义一个接口了。
或者不要那个接口也可以。
页: [1]
查看完整版本: Genie-00-新的学习目标