幻想森林

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3382|回复: 5

Genie-00-新的学习目标

[复制链接]

136

主题

1751

帖子

548

积分

版主

Rank: 7Rank: 7Rank: 7

积分
548
发表于 2010-1-22 14:03:20 | 显示全部楼层 |阅读模式
终于离开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:
  1. [indent=4]
  2. init
  3.     print "Hello,World!"
复制代码

1.[indent=4] 是告诉编译器,这个源代码是用了4个空格来作缩进。这里一定要注意,空格数一旦搞错了,就会报错。
用indent指明缩进其实可以不写,但源代码里就必须只用tab来缩进。这也就是编译器的默认模式吧。
源代码直接变成了:
  1. init
  2.     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
结果是
  1. /* helloworld.c generated by valac, the Vala compiler
  2. * generated from hw.gs, do not modify */
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. void _main (char** args, int args_length1);
  7. void _main (char** args, int args_length1) {
  8.     printf ("Hello,World!\n");
  9. }
  10. int main (int argc, char ** argv) {
  11.     _main (argv, argc);
  12.     return 0;
  13. }
复制代码
完全就是标准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编译器,应该就能正常了。
え~え~お!!!
回复

使用道具 举报

550

主题

9116

帖子

214748万

积分

超级版主

如同神一般的存在,腿神!拖后腿的神~~

Rank: 8Rank: 8

积分
2147483647
发表于 2010-1-22 23:35:13 | 显示全部楼层
我的目标就是C++先玩明白再说吧
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
回复 支持 反对

使用道具 举报

8

主题

215

帖子

2223

积分

⑥精研

积分
2223
发表于 2010-1-23 11:28:55 | 显示全部楼层
说到语法像Python的静态类型语言,还要能编译到native的,我一开始想到的是RPython……
回复 支持 反对

使用道具 举报

136

主题

1751

帖子

548

积分

版主

Rank: 7Rank: 7Rank: 7

积分
548
 楼主| 发表于 2010-1-23 12:39:22 | 显示全部楼层
引用第1楼secondsen于2010-01-22 23:35发表的  :
我的目标就是C++先玩明白再说吧
不是职业的,主要就看各人的喜好了。喜欢就上吧,没有理由。
え~え~お!!!
回复 支持 反对

使用道具 举报

136

主题

1751

帖子

548

积分

版主

Rank: 7Rank: 7Rank: 7

积分
548
 楼主| 发表于 2010-1-23 12:41:18 | 显示全部楼层
引用第2楼rednaxela于2010-01-23 11:28发表的  :
说到语法像Python的静态类型语言,还要能编译到native的,我一开始想到的是RPython……
以前关注过pypy,它的资料也是非常之少,就知道能翻译成c来编译,能提高最少10倍的性能...但具体怎么用,一团黑。
え~え~お!!!
回复 支持 反对

使用道具 举报

24

主题

117

帖子

1274

积分

⑥精研

积分
1274
QQ
发表于 2010-1-26 13:12:16 | 显示全部楼层
其实你那个_main可以放在main的后面,因为你已经在之前定义一个接口了。
或者不要那个接口也可以。
Tamashii是啥意思? 魂! ======================= 我真是败给C++的面向对象了啊……
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|幻想森林

GMT+8, 2024-3-29 18:00 , Processed in 0.025878 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表