游戏开发论坛

 找回密码
 立即注册
搜索
楼主: bluefire9213

小侃一下k&r和ms编程风格

[复制链接]

0

主题

23

帖子

23

积分

注册会员

Rank: 2

积分
23
发表于 2006-6-25 08:25:00 | 显示全部楼层

Re:小侃一下k&r和ms编程风格


回复:justlikethewind

觉得你说的有点偏激了,或者你很欣赏stl的优雅性,或者你是stl的追求者,甚至是模版元的开发者,看到有人反对固然气愤,但你认为反对的人都不懂stl的优雅就错了,我相信到这论坛的高手还是很多的,大家有不同看法是很正常的事情

我就针对我之前所提出的问题跟你们一起讨论吧,其实在我发帖的时候就预感到肯定有人驳斥我的说法,就像C++里的auto_ptr标准之争,永远都不会平息

首先是学习困难这点,应该没人反对吧?难学易用是stl的特点,模板本来就是一个很复杂的概念,看过《C++ Templates》都知道,这书比一般介绍C++语法的书还要厚,相同规模的模板库必然要比类库复杂难学,单单这一点就使很多初学者却步,模板的出现使C++的门槛更高一层,导致很多人C++没学完就改行跑去学java了,这一点对C++发展是不利的,当然,这点小问题早就被它的强大所覆盖了

其次你所提到库的使用问题,我用CArray确实不比vector少,只要能用它,我都会选它,理由很简单,CArray可以满足我的需求。我不反对vector有多么的优秀,但在一般场合它确实没有CArray简洁方便,就单单看帮助文档也会感觉到CArray比vector简洁很多。使用者所需要的方便是指简单的法则而不是强大的功能,正规表达式能取缔一切的find和replace操作,为何又要定义功能独立的find和replace呢?因为总是使用正规表达式去find东西会很不方便。再说,使用stl库往往需要一些额外的对象,例如iter,这些都是造成不方便的因素,而stl库一些命名法则设计不好也是导致不方便的原因,举例说,empty这个函数会让不少使用者困惑,因为它有歧异,而其它一些库这方面往往要更好些,例如把empty分开写成SetEmpty和IsEmpty,这样就很清晰了

再有关于智能感知的问题,很多人不以为然,我不知道大家有没有用过vc2.0,用过就会明白那种像闭着眼开发的滋味了,我之前曾经放弃过VC转用BCB3.0就是因为它不支持智能感知,VC的IDE对智能感知确实有不少BUG,但模板不支持智能感知也不完全是IDE的问题,因为模板没有实例化是无法实现感知功能的,而要动态实例化模板则必须动态追踪类型,动态类型追踪是非常复杂的概念,它需要遍历所有CPP文件,其所耗时间往往跟编译相当,而且失败的匹配也会经常发生,所以要IDE实现这功能基本是不可能的,VC助手也实现不了这功能。总之,类库比模版库在这方面能获得更好的支持,至少目前是这样,未来很长一段时间也是

对于编译时错误信息的问题就更不用说了,这跟开发者水平没有关系,任何一个开发者都希望看到简短通俗的提示,复杂的警告和错误提示也导致了在扩充stl库时产生不少的困难

最后,我想说说关于C++发展的一些题外话

无可否认,模板的出现令C++踏上也另一个巅峰,然而,C++高贵的身段又有多少人能够分享呢?模板给我们带来了无穷无尽的设计模式,但这些模式往往让人无所适从,它带来的节便性并没有语言的改变来得容易,近年来C++的发展速度已经被其它语言所超越了,C++的应用范围也越来越小,而我们却总是在这些概念复杂的领域里争执不休。我曾经这么想过,模板真的给C++带来巨大的优势了吗?还是说模板让C++走向了一个无底的胡同?这几年微软大力发展其.net计划,.net framework的程序铺天盖地,但.net技术并没有支持C++,可见微软对C++并不感冒,盖茨是做basic语言出身的,他提倡的是简易化编程,而模板并没有让C++变得容易,反观boost,loki,这些库一直没被列入标准,是因为太过于复杂而被拒绝吗?托管C++的出现告诉我们微软的一些想法,当然,制订标准是微软的爱好,但从这样的标准可以看到微软决心,它要彻底改变C++语言,而不是要从模板中提炼出精髓,因为再经典的设计模式也不及一个关键字。试想一下,如果在每个函数或变量前加上一个synchro的关键字就能使这条函数访问实现线程同步,那该是多美好的事情呀,我再也不会看到SingleLock这些奇怪的代码了。别的语言都没有stl,但它们有比C++更短的开放周期,足以证明再优雅的设计也不如实际节便的好。以上纯粹是个人的想法,其实本人并没有什么看法,只是程序写得无聊了上来灌灌水水

7

主题

438

帖子

438

积分

中级会员

Rank: 3Rank: 3

积分
438
发表于 2006-6-25 09:22:00 | 显示全部楼层

Re:小侃一下k&r和ms编程风格

我就针对我之前所提出的问题跟你们一起讨论吧,其实在我发帖的时候就预感到肯定有人驳斥我的说法,就像C++里的auto_ptr标准之争,永远都不会平息
---
你搞错了。关于auto_ptr,没什么争论。auto_ptr只是用于异常时的平滑过渡,不需要什么争论。争论的是smart_prt。

首先是学习困难这点,应该没人反对吧?
---
我反对。我最初学习stl是为了用于编写lalr parser。我没有买专门的stl专著,就买了本TCPL顺手翻翻。大约3天时间,整个库的设计思想和常用接口参数我都能背出来了。我相信其他人也可以。我有一个只用C和VB的同学,只是为了使用ACE而学的C++。他的基本功非常扎实,学stl也就用了一天。一天之后就能自己扩展了stl,用stl风格写了与C风格数组二进制兼容的容器、迭代器,hash容器(那个时候还是C98,stl里面没有hash容器)。

我不反对vector有多么的优秀,但在一般场合它确实没有CArray简洁方便,就单单看帮助文档也会感觉到CArray比vector简洁很多。
---
但是比较使用它们写出的代码,你就会知道vector比CArray简洁很多。当然,如果你只写hello,world。就当我什么都没说。

使用者所需要的方便是指简单的法则而不是强大的功能,正规表达式能取缔一切的find和replace操作,为何又要定义功能独立的find和replace呢?因为总是使用正规表达式去find东西会很不方便。
---
所以stl里面并没有任何正规式匹配的内容。我真是不知道你在说些什么。

再说,使用stl库往往需要一些额外的对象,例如iter,这些都是造成不方便的因素
---
使用iter得到的是高度的抽象,简洁,优雅。任何容器都被抽象为序列,不用再理会它是紧凑容器,松散容器,还是关联容器了。即便从二进制层面上考虑,也和用下标索引具有同样的效率。

而stl库一些命名法则设计不好也是导致不方便的原因
---
stl的命名很好,干净有效。当然,empty的确可以做动词用。不过只要一看它是常函数,那么就一切都明白了。这样的错误也只可能犯一次。

再有关于智能感知的问题,很多人不以为然,我不知道大家有没有用过vc2.0,用过就会明白那种像闭着眼开发的滋味了,我之前曾经放弃过VC转用BCB3.0就是因为它不支持智能感知,VC的IDE对智能感知确实有不少BUG,但模板不支持智能感知也不完全是IDE的问题,因为模板没有实例化是无法实现感知功能的,而要动态实例化模板则必须动态追踪类型,动态类型追踪是非常复杂的概念,它需要遍历所有CPP文件,其所耗时间往往跟编译相当,而且失败的匹配也会经常发生,所以要IDE实现这功能基本是不可能的,VC助手也实现不了这功能。总之,类库比模版库在这方面能获得更好的支持,至少目前是这样,未来很长一段时间也是
---
I 服了 you.模板的智能感知根本不需要实例化。你后面说的什么遍历cpp文件根本是胡扯,连模板最基本的特性——在每个需要使用的编译单元分别进行定义——都没搞清楚就来胡说八道了。哥们,扯编译技术也找对人好伐?我毕业设计是类C解释器,我前面说的那个一天学会stl的哥们在日本大学带队开发编译器。另外,vc2005对模板的智能感知已经很不错了,自己去用用再扯蛋吧。

无可否认,模板的出现令C++踏上也另一个巅峰,然而,C++高贵的身段又有多少人能够分享呢?
---
所以小白最好不要对C++/STL指手画脚。

模板给我们带来了无穷无尽的设计模式,但这些模式往往让人无所适从,它带来的节便性并没有语言的改变来得容易,近年来C++的发展速度已经被其它语言所超越了,C++的应用范围也越来越小,而我们却总是在这些概念复杂的领域里争执不休。我曾经这么想过,模板真的给C++带来巨大的优势了吗?还是说模板让C++走向了一个无底的胡同?这几年微软大力发展其.net计划,.net framework的程序铺天盖地,但.net技术并没有支持C++,可见微软对C++并不感冒,盖茨是做basic语言出身的,他提倡的是简易化编程,而模板并没有让C++变得容易,反观boost,loki,这些库一直没被列入标准,是因为太过于复杂而被拒绝吗?托管C++的出现告诉我们微软的一些想法,当然,制订标准是微软的爱好,但从这样的标准可以看到微软决心,它要彻底改变C++语言,而不是要从模板中提炼出精髓,因为再经典的设计模式也不及一个关键字。试想一下,如果在每个函数或变量前加上一个synchro的关键字就能使这条函数访问实现线程同步,那该是多美好的事情呀,我再也不会看到SingleLock这些奇怪的代码了。别的语言都没有stl,但它们有比C++更短的开放周期,足以证明再优雅的设计也不如实际节便的好。
---
实际上他们只证明了一件事情,人不如故,衣不如新。C++带有大量历史的包袱(对C/老式C++兼容),发展自然就慢。新出现的语言则没有这些问题。我们选择语言只是选择一种工具而已。用合适的工具做合适的工作,是我们唯一不变的style。

7

主题

438

帖子

438

积分

中级会员

Rank: 3Rank: 3

积分
438
发表于 2006-6-25 10:06:00 | 显示全部楼层

Re:小侃一下k&r和ms编程风格

I 服了 you.模板的智能感知根本不需要实例化。
---
真是糟糕,这几天老是找人吵架。嗯,用和蔼的口气试试。
模板的智能感知是不需要实例化的。
只有实例化后的模板类/函数的智能感知需要实例化(很像是废话,不过不是)。即便是后者,也只要把当前编译单元(就是你口中的cpp文件)编译一下就好了,完全用不着遍历所有编译单元。

248

主题

2674

帖子

2702

积分

金牌会员

Rank: 6Rank: 6

积分
2702
QQ
发表于 2006-6-25 14:21:00 | 显示全部楼层

Re:小侃一下k&r和ms编程风格


其实我10秒钟就看懂了爱因斯坦的质能方程,不是吹的。
但是很多人都说这条方程不可理解,包括很多伟大的科学家。

每一个人心中的难和易的标准不同,每一个人对理解的程度的要求也不同。
用我的标准,你们都是傻瓜。
这就是为和你能够随便称呼别人小白的原因所在吧。
但不要用你的标准来衡量别人,你太独特了。

正常人都觉得stl复杂非凡。你和你的同志好朋友,觉得1天就能够明白。
除了佩服,还是佩服。

0

主题

23

帖子

23

积分

注册会员

Rank: 2

积分
23
发表于 2006-6-25 16:00:00 | 显示全部楼层

Re:小侃一下k&r和ms编程风格


可能有些地方我说得不太清楚,让你误解了,关于auto_ptr的纷争,在GameRes里是有文档记载的,你可以查阅一下,http://dev.gameres.com/Program/Abstract/Design/Boost.htm,Boost使用的是模板分类模型,而Loki走的是策略模型(Policy模式),两者都可以说是模板应用的巅峰之作,但很可惜两者都未被列入C++标准

至于智能感知问题我解释得有点混乱,但确实需要实例化才能实现,我就此简单举个例子吧

template<typename T>
class A : public T {};

A<MyBaseClass> test;

上例中,如果要对变量test实现智能感知功能,则必须要对模板A实例化成A<MyBaseClass>才能显示MyBaseClass下的成员函数;这例子比较简单,看不出什么大问题,但如果MyBaseClass是个偏特化模板,这就不得不对MyBaseClass所处的CPP进行实例化编译了,再复杂点说,如果换成Loki库,大量不同的Policy组合,一个定义会使模板瞬间产生成百上千个模板实例,即使是编译也会是相当耗时,就更别说要动态感知了,而要实例化模板是需要对参数类型进行追踪,如果考虑强制转换,这将是一项艰巨的任务,很有可能让IDE产生无穷递归的搜索,也就是我所指的失败的匹配,这往往导致只能完全编译遍历才能实现智能感知功能(关于失败的匹配是有一份很详细的文档,但我忘记叫什么名字了,至于类型追踪和实例化的问题在《Template C++》里有很详细的说明),当然,让C++实现像VB那样动态编译也是有可能的,BCB也曾经实现过,但对于复杂的模板项目,动态编译所耗的时间不会比静态少,微软不可能也不会实现这样的功能,因为实现这样的代价太大了

而其它一些小问题就简单说说好了,stl没有支持正规表达式,但greta库是有的,而且它是完全按照stl的思想去写,可以看成是stl的扩展库,库里只有6个文件,但其模板代码的复杂度足已让人无法参透,greta库是微软研究院的产品,但微软自己都不敢拿来用,即使它比Boost高7倍的效率,这是因为greta库的作者离开了微软,变得很难维护扩充了,stl库也有同样的缺点;学习stl一点都不容易,当然,如果只是学习如何使用,也不是很困难,但要深入研究它的设计实现,这就足足可以写上好几本书了,看看候捷大哥对stl的翻译就知道了,他至少翻译了5本stl的书,可以想象,要对stl库的扩充,写出像Boost这样能完美支持stl里的各种类型模板的扩充库,是何等的困难,还有维护呢?综合所说,我觉得学习stl绝对是一件艰苦的事情,而其发展也确实太慢了,比较一下其它语言,像Java的String类,其丰富的功能可轻易调用,正规表达式,语言编码,类型转换都只是一两个调用而已,相比之下stl的string类就要孙色多了。我的意思是,stl库应该归纳到语言层级别,像类库那样由提供者完整的封装到语言里,而让用户能更多关注的是应用层上的开发问题,如果老是停留在stl里混,C++语言所赋的强大功能就难以发挥出来了,最终只会变得像汇编语言那样,越来越少人用了。目前C++/CLI可能会是一种新的变革,如果能得到ISO的支持就更好,下一代C++将如何发展将是一个很大的X

最后对于C++的历史问题,我也赞同你的看法,确实C++的历史包袱太大了,是时候该做点变革了

7

主题

438

帖子

438

积分

中级会员

Rank: 3Rank: 3

积分
438
发表于 2006-6-25 18:19:00 | 显示全部楼层

Re:小侃一下k&r和ms编程风格

其实我10秒钟就看懂了爱因斯坦的质能方程,不是吹的。
但是很多人都说这条方程不可理解,包括很多伟大的科学家。
---
大侠,你真的用了10秒钟才看懂  E=Mc^2? 这个式子真的需要那么久才能看懂么?我笑得肚子痛了……

71

主题

1804

帖子

1880

积分

金牌会员

Rank: 6Rank: 6

积分
1880
QQ
发表于 2006-6-25 19:06:00 | 显示全部楼层

Re:小侃一下k&r和ms编程风格

justlikethewind
你严重患有智障阿!!!

7

主题

438

帖子

438

积分

中级会员

Rank: 3Rank: 3

积分
438
发表于 2006-6-25 19:12:00 | 显示全部楼层

Re:小侃一下k&r和ms编程风格

Arcol:
真难为你了,费心拼凑了那么一长短文字,却还是我在我眼里错漏百出。

1:auto_ptr从来都不是智能指针,甚至都没有一般的指针语意。大哥你还是多读几年书再来吧。我再说一遍,那是smart_ptr,老大。
2:模板类和类模板请你好好区分清楚,编译器和链接器也要弄明白区别。做小白也要做个有尊严的小白,不要一出口就让人笑掉大牙。
3:一看你就没用过greata和regex,根本就是抄N年前别人的口水,还是个拾人牙慧的小白。
还比regex快7倍呢?自己去看greata多少年没更新,regexp都多少版本了。我至少编译过regexp,运行过,你呢?可悲。
4:候捷是垃圾。《深入浅出mfc》重点章节都是抄自《mfc internal》的。
5:学stl难不难就看谁学了。
6:java的string类型完全是狗屎。语言编码和正规式根本就不应该塞到一个小小的string类型里面。这些都应该作为独立的generic算法存在。
7:下一代的C++我已经重复了无数次了,是C++0x。

7

主题

438

帖子

438

积分

中级会员

Rank: 3Rank: 3

积分
438
发表于 2006-6-25 19:14:00 | 显示全部楼层

Re:小侃一下k&r和ms编程风格

创意天外天:
Grrr...我相信你一见面就把我当成你的兄弟是有理由的。
或许我说话的语气让你想起你的父亲?还是你的爷爷?

7

主题

438

帖子

438

积分

中级会员

Rank: 3Rank: 3

积分
438
发表于 2006-6-25 19:16:00 | 显示全部楼层

Re:小侃一下k&r和ms编程风格

创意天外天:
当然,差点忘了表示一下,我对你父母是兄妹结合这个悲剧,感到万分的同情。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-24 20:38

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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