还在对 C 语言糟糕的内存管理咬牙切齿吗(垃圾收集器)?还在对各种乱七八糟的 NULL 指针调试得天昏地暗吗?还在对 C 语言蹩脚的异常处理内牛满面吗?
何不试试 Cyclone!
先用一个打开 passwd 文件的例子给大家看看,这是 C 语言版:
FILE *f = fopen ("/etc/passwd", "r"); if (f == NULL) { /* 一堆错误处理 */ } int c; c = getc (f); /* 又一堆错误处理 */
尤其是这样多了的麻烦劲,搞得我有时候想用 setjmp 来处理错误。
好了,看看 Cyclone:
FILE *f = fopen ("/etc/passwd", "r"); int c; try { c = getc ((FILE *@notnull)f); } catch { case &Null_Exception: printf ("Couldn't open /etc/passwd.\n"); exit (1); case &Invalid_arguments: printf ("Invalid arugment (%s)", s); exit (1); }
是不是很直观?其中还有一种叫做let的操作符,语法是 let 变量 = N;
也就是说,你不必去管变量类型了,在临时变量的时候,能稍微起一点作用(虽然有点鸡肋)。
其中一句简介,真是深得我心:“认真的C程序员可以写出来安全的程序,不过在实践中,相当多的C程序都不咋地安全。”还有,Cyclone程序会在编译时、链接时、运行时不断检查来确保安全。
还等什么呢?快去试试吧!
PS:目前最好的教程是User's Guide了。要用GCC4编译得用SVN里面的最新版。
PS2:我也只是新发现,从User's Guide里面摘抄了一些内容。注意这个东西不一定与C兼容。
Jul 20, 2011 10:16:49 PM
为什么不要 C++ 或 Perl、Lua 之类的,非要 Cyclone 呢?仅仅是语法相似的话感觉没什么意思。
Jul 21, 2011 01:59:43 AM
Cyclone是编译语言,而C++和C的区别也不在内存管理,Perl、Lua和Python是解释语言,执行速度是一大劣势。而Cyclone和C相似,很多人不用看就能直接上手,省事~
Jul 21, 2011 02:27:27 AM
呃,这样……Cyclone支持尾调用么?
Jul 21, 2011 02:31:27 AM
C支持的应该都支持。。。我没试过。。。最标准的文档,你看user's guide吧
Jul 21, 2011 02:34:14 AM
C和C++都没有尾调用,我试过了。Cyclone假如有尾调用的话就好了,我去看看……
Jul 21, 2011 02:35:23 AM
你指的是
return Foo(somevar);
么?话说我还不知道尾调用是什么玩意……
Jul 21, 2011 02:54:07 AM
嗯,就像这样,不过是在一个函数中的。最后不会返回调用它的函数而是直接从Foo返回。
Jul 21, 2011 02:54:56 AM
在官方网站找不到关于尾调用的信息呢。
Jul 21, 2011 03:20:41 AM
这个啊,我记得C就有这样的功能啊
Jul 21, 2011 03:50:25 AM
噢,是有的,不过不是运行时的,而是编译时就要决定的。运行时是改变不了返回方式的。
Jul 21, 2011 06:02:07 AM
我不觉得这个需要放到运行时啊,因为类型在编译时就确定了
Jul 21, 2011 12:41:28 PM
注意到是说运行时,不是运行时环境...
Jul 21, 2011 12:57:01 PM
不我注意到我在胡扯,请忽略我刚才的胡扯
Jul 21, 2011 01:01:38 PM
http://www.ibm.com/developerworks/cn/linux/l-ceylon/index.html?ca=drs-
看这个,IBM developerworks上的文章
这玩意儿是跑在jvm上的呀.
话说...和vala比较会如何?
Jul 21, 2011 01:06:23 PM
那是Ceylon,这是Cyclone,看清楚。。。
和Vala比较倒比较有趣,应该是相近的。
Cyclone需要检查各种内存问题,Vala则是动态的OO实现。。
Jul 21, 2011 01:23:24 PM
哦...今天眼睛问题很严重啊...我也刚发现自己看错了,想过来留言纠正...(因为正好两个标题同时出现在了greader上...)
Jul 21, 2011 04:26:29 PM
这个注定小众了,感觉倒不如直接用vala之类的,
看了下其还引入了一些比较恶心的语法
比如,其所谓的bounded pointer
void foo(int *@numelts(4) arr);
Jul 22, 2011 10:23:17 AM
这个东西确实很不好看。。。
vala好点