论坛首页 编程语言技术论坛

骂一骂Ruby

浏览 23816 次
锁定老帖子 主题:骂一骂Ruby
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-08-25  
Ruby不能在企业应用的最大问题就是:NO 2PC Support Now...
0 请登录后投票
   发表时间:2006-08-25  
robbin 写道
这个话题我也比较感兴趣,想看看大家有什么有意思的想法出来,可惜没有看到什么太新鲜的东西。

从我这么一小段时间的摸索来说,我觉得ruby/rails开发和运营企业应用还不够成熟。一方面比较缺各种工具类库,即便有的类库,也往往是0.xx版本,非常不成熟;另一方面ruby的运行模式(fastcgi)方式也不尽如人意。

似乎rails压根就不打算进入企业应用领域。关于企业应用,Bob大叔曰:"如果不是着急用的话,可以等等,ruby社区,会弄出来的"。
0 请登录后投票
   发表时间:2006-08-25  
charon 写道
虽然看到很多,但是还是不能理解symbol的目的。
怎么看都象一个指针,但是为什么要出现?
http://www.rubycentral.com/faq/rubyfaq-6.html#ss6.1


Symbol是一个整数,是Hash表中用来检索字符串的关键字(名字),这可以大大加快解析、运算时字符串查找的速度,因为Ruby解析器、运算器需要大量的类名字、方法名字的检索,所以用symbol可以大大提高速度。
0 请登录后投票
   发表时间:2006-08-25  
Readonly 写道
Ruby不能在企业应用的最大问题就是:NO 2PC Support Now...


2PC Support 是说 (prepare, commit) Global Transaction, XA 吧。

大部分的小"企业应用"(MIS, OA, etc)也用不到这个。
跨数据库的"企业应用"(金融,银行)才用到。

Ruby应该至少可以进入小企业应用领域。

----------------------

另外,有几个关于VM和类型的问题,不是很清楚。

Python, ErLang都有VM,都有编译步骤。right?
这样,Python, ErLang都可以脱离源码,直接用中间代码部署运行。right?
Python是否动态强类型?Python的编译步骤是否进行类型检查?

缺乏VM,和编译步骤,不知道算Ruby的缺点还是优点。
0 请登录后投票
   发表时间:2006-08-25  
引用
接Robbin的:小工具库很匮乏亚……Rake现成提供的任务少得可怜,连“目录拷贝”这样的功能都没有,还要自己写一个的说。


我看ruby直接集成了很多Unix shell命令进来,也许ruby假设你拷贝目录就应该写shell命令,不需要rake的taks了。
0 请登录后投票
   发表时间:2006-08-25  
potian 写道
charon 写道
虽然看到很多,但是还是不能理解symbol的目的。
怎么看都象一个指针,但是为什么要出现?
http://www.rubycentral.com/faq/rubyfaq-6.html#ss6.1


Symbol是一个整数,是Hash表中用来检索字符串的关键字(名字),这可以大大加快解析、运算时字符串查找的速度,因为Ruby解析器、运算器需要大量的类名字、方法名字的检索,所以用symbol可以大大提高速度。


就是说在文件加载的时候把symbol转换为整数,多次执行的时候代价就小很多?
不过如果字符串里面没有特殊字符的话,gigix说的那个美观的作用还是比较明显的。
0 请登录后投票
   发表时间:2006-08-25  
buaawhl 写道
Readonly 写道
Ruby不能在企业应用的最大问题就是:NO 2PC Support Now...


2PC Support 是说 (prepare, commit) Global Transaction, XA 吧。

大部分的小"企业应用"(MIS, OA, etc)也用不到这个。
跨数据库的"企业应用"(金融,银行)才用到。

Ruby应该至少可以进入小企业应用领域。

----------------------

另外,有几个关于VM和类型的问题,不是很清楚。

Python, ErLang都有VM,都有编译步骤。right?
这样,Python, ErLang都可以脱离源码,直接用中间代码部署运行。right?
Python是否动态强类型?Python的编译步骤是否进行类型检查?

缺乏VM,和编译步骤,不知道算Ruby的缺点还是优点。


我感觉现在的ruby是介于解析器和VM之间的形态,ruby现在是有GC的(否则用fastcgi去跑,早晚要内存吃光光),但是距离一个成熟的VM这类东西又差的比较远。
0 请登录后投票
   发表时间:2006-08-25  
buaawhl 写道

Python, ErLang都有VM,都有编译步骤。right?
这样,Python, ErLang都可以脱离源码,直接用中间代码部署运行。right?
Python是否动态强类型?Python的编译步骤是否进行类型检查?

python可以直接用中间代码执行,而且中间代码有多种类型
python是动态强类型的。但是编译期肯定不做类型检查,连变量名都不检查
这个是动态语言的短板。就是说必须把单元测试做到弱条件组合覆盖才行(比语句覆盖要强多了),才可能杜绝语法错误
比如
...
if((a>b or c>d); and f>g);:
    print 'aaa'
else:
    print 'bbb'
...

这种情形下,在编译的时候并不检查a,b,c,d,e,f的存在性,更不用说类型了。而且如果a>b,则c/d的存在与否都无关紧要(因为被短路了).
这样,在单元测试的时候必须要有执行到c>d的case,否则如果里面有语法错误,那就歇菜了
而要做到语句覆盖,只要a>b,f>g,和a>b,f<g两个情况就可以了

引用

缺乏VM,和编译步骤,不知道算Ruby的缺点还是优点。

ruby2马上要有vm了吧。
0 请登录后投票
   发表时间:2006-08-25  
python可以直接用中间代码执行,(我发布程序就是这么干的,发布编译后的代码),但是生成中间代码的编译器版本和运行的vm的版本必须相同(一般用py2exe打包,代码和vm都有了)
0 请登录后投票
   发表时间:2006-08-25  
每个ID对应一个字符串,rb_intern把c字符串转化为ID
  static st_table *sym_tbl;       /*  char* to ID   */
  static st_table *sym_rev_tbl;   /*  ID to char*   */

  ID
  rb_intern(name);
      const char *name;
  {
      const char *m = name;
      ID id;
      int last;

          /* If for a name, there is a corresponding ID that is already
          registered, then return that ID */
      if (st_lookup(sym_tbl, name, &id););
          return id;

          /* omitted ... create a new ID */

          /* register the name and ID relation */
    id_regist:
      name = strdup(name);;
      st_add_direct(sym_tbl, name, id);;
      st_add_direct(sym_rev_tbl, id, name);;
      return id;
}

(parse.y);



把id转换成c字符串
char *
rb_id2name(id);
    ID id;
{
    char *name;

    if (st_lookup(sym_rev_tbl, id, &name););
        return name;
    return 0;
}


rb_str_intern()

VALUE是Ruby所有对象类型的代表,包括Ruby的字符串
 static VALUE
rb_str_intern(str);
  VALUE str;
 {
   ID id;

  ....
  id = rb_intern(RSTRING(str);->ptr);;
  return ID2SYM(id);;
}

(string.c);

首先把字符串转换成id,然后把id转换为 ID2SYM(id);

sym_to_s();

static VALUE
 sym_to_s(sym);
    VALUE sym;
 {
      return rb_str_new2(rb_id2name(SYM2ID(sym);););;
  }

(object.c);

首先用SYM2ID把sym转换为ID,再把ID转换为Ruby的RString



ID2SYM和SYM2ID
直接用ID是不行的,因为ID可能是4的倍数,则有可能和Ruby中的其他非嵌入式对象类型冲突,所以必须要搞一个类型Symbol.

首先,在Ruby中有一个ID类型。定义如下:


80 typedef unsigned long ID;
(ruby.h)

这个ID是一个数字,它和一个字符串一一对应。当然不可能世界上全部字符串都和一个数字一一对应。所以只是限制在一个Ruby进程内部的一一对应关系。

一种语言需要处理大量的名字。包括文件名字、方法名字、变量标识符、常量名字、类名字等等。从内存管理来看,如果所有的名字都用字符串(char *)来处理的话就会有麻烦。另外,字符串之间需要进行大量的比较,但是逐个字符进行比较会严重降低处理速度。因此,我们不把它们直接处理为字符串,而是用和它们关联的某些东西进行处理。而“某些东西”最有可能是一个整数,因为处理起来最简单。

在Ruby的世界,这些ID就是Symbol。到ruby 1.4为止,ID的值被转换成Fixnum,但作为一个symbol使用。这个值现在还可以用Symbol#to_i获得。但是,随着实际应用的累积,现在我们已经理解让Symbol和Fixnum一样的处理方法并不是一个好主意,所以从1.6开始,建立了单独的Symbol类。

由于Symbol对象被大量使用,特别是hash表的关键字。因此Symbol也象Fixnum一样嵌入在VALUE中。让我们来看看宏ID2SYM() ,它把ID转换成Symbol对象。


167 #define SYMBOL_FLAG 0x0e
….
169 #define ID2SYM(x) ((VALUE)(((long)(x))<<8|SYMBOL_FLAG))
(ruby.h)

如果左移8位,那么x就变成256的倍数,也就是肯定是4的倍数。这样当它再加上0×0e(二进制的14)以后它就不再是4的倍数。而且它也不是奇数,因此它不会和现有的其它VALUE值重叠。这是一种很好的方法。 我们可以很容易判断一个VALUE是不是Symbol。


168 #define SYMBOL_P(x) (((VALUE)(x)&0xff)==SYMBOL_FLAG)
(ruby.h)

最后我们来看一看ID2SYM()的反面,SYM2ID()


170 #define SYM2ID(x) RSHIFT((long)x,8)
(ruby.h)

RSHIFT 是按位右移操作。因为右移在不同的平台上对整数的符号位有不同的处理方式,因此这里是一个宏。
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics