正在改写C#版的ICTCLAS

断断续续干了快半个月了。
由于中科院的网站上已经下不到源码了,所这这个版本基于有云的地方的C++/CLI版。
原作是比较典型的C式编程方法,常常一个函数上百句。
翻译过程中比较郁闷的地方有以下几点:
1, 原作里处理的字符串都是GBK/GB2312编码的,而C#里字符串都是Unicode格式的,今天为了改编一个函数查了半天的资料,写了个小工具,对着方正GBK字库内码表里的字符,一个个地测试其Unicode码。
原作里字符(逻辑上的)
长度可能为1或2(sizeof(char)),而C#里字符长度永远为1.这样在一些判断条件,循环步长等地方,直能整得人死去活来。
2,不得不说C语言里的指针(比起C#语言里的各种构造)太灵活了,翻译到C#里,可能是数组,可能是ref/out; C语言里的字符串是可变的,C#里的字符串是只读的;这样一来,原文件里某个函数有个char*参数或者局部变量,我就要在接下来的一大串代码中查看这个参数到底是怎么使用的,还要看这个函数的客户在调用完函数之后还有没有使用这个参数,以确定是改成string, ref string, out string还是直接使用char[]. C里的char* + int与C#里的string + int都是合法的操作,但意义完全不同,一不小心没改过来,三两个小时也不一定能找出错在哪里。
3,C的库函数在C#中没有(当然也不可能有)完全对应的实现。比如strlen,要想在各种情况下得到与原作相同的结果,肯定不能改写成*.Length,只能参考C标准库函数的说明用C#重新实现一遍。
4,C语言的多维数组与C#里的多维数组(非锯齿型)基本上是相同的,但是在C里你可以轻松地取出一行数据(比如:int aaa[10][10]; 你可以用 aaa[3]来取得10行里的一行),在C#里,我还真不知道怎么实现。最后我使用了一个二维数组加第一维的索引两个参数来取代。
5,C++里有那么多的构造函数,什么拷贝构造函数,什么赋值构造函数,还能重载操作符=,C#里边完全没有对应的东西,而且VS2005对C++代码也不能查找Operator=的引用,只能靠眼睛去一个个找。
6,VS2005太不稳定了,动不动就死,现在每次调试,执行到某个代码行,必死无疑。
这样每次搞到快吐血,赶紧扔下不管,玩几局魔兽,看看电影,总算坚持下来了。

目前进度:所有CPP代码都已经有了对应的CS代码(可编译通过)。
Dictionary类和ContextStat类的Load,Save等功能已经测试通过。

尚未完成:调试代码使之能正常工作。

此版本完成后将免费开源发放,有愿意帮我减轻点负担的可以联系我(deerchao at gmail dot com)。

另,如果以后有时间,我还准备把HtmlTidy完全使用C#改写,有兴趣一起做的也请联系我。

posted on 2006-11-16 02:57  deerchao  阅读(3813)  评论(3编辑  收藏  举报