简析Etoys的多语言支持 之 字符及字符串

字符

在Etoys中,字符在Character类中实现。它只有一个实例变量value,用于存放字符的值及语言信息。

Etoys与其它编程语言的一点不同是,它在每一个字符中都留出了几个位用于表示该字符属于哪一种语言,也就是leading char,或者称encoding tag。这个值可以通过向字符发送leadingChar消息得到,而字符的真实值通过charCode取得。value的值可以通过asInteger返回。下面的例子是在中文环境下运行的。

$一 leadingChar	→ 6 (16r6 2r110)
$一 charCode	→ 19968 (16r4E00 2r100111000000000)
$一 asInteger	→ 25185792 (16r1804E00  2r1100000000100111000000000)

具体哪些值代表哪些语言可以参考Yoshiki Ohshima的The Design and Implementation of Multilingualized Squeak。在其中还可以了解到具体在value中leadingChar和charCode是如何组织的。从上面的例子中也可以看出,后22位表示字符值,再用8位表示语言。

对于在字符中加入leading char的意义,由于Yoshiki没有明确说明,只说是有三点原因,这里只能臆测一下:

1. 各语言文字显示的顺序可能不同。左到右,或者右到左。所以需要通过leading char来判定显示的顺序。
2. 用于从FontSet中读取字体。(这在介绍字体显示时会提及)
3. 与Squeak以前的代码兼容。在加入Unicode之前,Squeak中就使用了类似的encoding tag,那时是对于编码的标识。

需要说明的是,Etoys中现在内部字符都是Unicode的,虽然对不同语言有不同处理,但这只是标记语言,与编码无关。

另外在上面举的例子中,用的是中文字符,Etoys中对256个ASCII字符是有特殊处理,这在SBE中有提及,例子如下:

(Character value: 97) == $a → true
(Character value: 500) == (Character value: 500) → false

这是因为在使用Character的value:生成新的字符实例时,如果value值小于256,则Character会从CharacterTable中直接返回一个实例,而不是重新生成一个Character实例。这可以较大地减少在实例创建和存放时的时间及空间上的消耗,在比较字符时可能这一点需要引起注意。至于CharacterTable在什么时候初始化的,还没有找到相关的代码。

在涉及Character这类基本的数据时,必需考虙两方面:时间效率、空间效率。就像CharacterTable的引入,就是为了提升这两方面的效率。而另一方面,时间效率还取决于单字符的运算,空间效率则还取决于字符串的存储。关于字符串的存放,在下一节分析,先来看一下单字符的运算。

前面已经看到,Character类中只有一个实例变量value,而Smalltalk是动态类型的,所以其实value可以绑定任意类型。再则,Etoys中的整型类型是根据大小来自动定的。比如下面的例子:

1000000000 class →  SmallInteger
(1000000000 * 100) class → LargePositiveInteger

所以对于字符的类型表示的效率问题,就完全交由Character类中的各个消息来控制。在Etoys中,将Character的value限定在SmallInteger类型范围里使用,这样可以保证对单字符比较或运算的效率。

字符串

字符串主要是通过String, ByteString, WideString这三个类表示。ByteString是以8位存放的,而WideString则是32位。如果在ByteString中加入大于256的字符,ByteString会自动转为WideString。这是在ByteString>>at:put:中实现的。示例如下:

'abc' class			→ ByteString
'一二三' class			→ WideString
('abc' at: 1 put: $一) class	→ WideString
'abc' byteSize		→ 3
'一二三' byteSize	→ 12
'一bc' byteSize		→ 12

区分对待ByteString与WideString主要是出于存储空间上的考虑,按Yoshiki所说,在Squeak 3.2中,String实例占了1.5MB空间,但我在Etoys 4.1.1中,用String allSubinstances统计,好像没有这么多,暂时不清楚1.5MB是如何统计出来的。

Advertisements
此条目发表在Uncategorized分类目录。将固定链接加入收藏夹。

One Response to 简析Etoys的多语言支持 之 字符及字符串

  1. liizii说道:

    good job

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s