易码技术论坛

 找回密码
 加入易码
搜索
12
返回列表 发新帖
楼主: zhiweichen

数据结构高手请进C语言版

[复制链接]
发表于 2006-11-17 08:34:44 | 显示全部楼层
靠提高语言复杂性而不是提高语言表达力,这不是语言发展的好方向
发表于 2006-11-17 11:28:13 | 显示全部楼层
引用第21楼leesoft2006-11-17 08:34发表的“”:
靠提高语言复杂性而不是提高语言表达力,这不是语言发展的好方向
那,这里有要高考的小朋友,所以请注意句法,这一句是个病句。

下面再说表达能力。

如果论表达能力的话,c语言其实是不在讨论之列的。人们往往会比较几大OO语言,如JAVA,c#,c++等语言的表达能力,有时候会有FP的语言加入这种比较,近年来脚本语言大行其道,也会参与表达能力的争论中。但是对于c语言,还真没见过有人讲他的表达能力。

什么是表达能力?

传统上讲表达能力意味着一个人是否能够将自己内心的思想表现出来,其次,还要让他人能够清楚地了解自己地想法。而一门语言的表达能力,我认为是这门语言对于概念的表述的能力,以及让他人能过清晰地了解这种概念的难易程度。

所谓表达能力,并不是说他把事物最终说明的能力,而是它说明一个事物的难易程度。语言也是,语言的表达能力并不是说他的功能多么多么强大,因为其实从本质上讲,他们都是等价于图灵机的,只要是一门有素质的语言,他们的运算能力全部都相同。所以,表达能力是指他们表述同样一个概念的时候的难易程度,我们可以尝试从编码时间,其他人的理解时间还有出现变动的修改时间上来衡量这个量。其实这个就是一门语言的抽象程度和灵活程度。

不论如何,语言是人写的,要给人看的,有了变动要人来修改的。而人的思维是抽象的,不是二进制的,所以语言的抽象层次越高,人越容易理解,写起来就越容易(当然,指同一层次上的人)。使用一门表达能力好的语言,人可以轻松的将自己脑中的概念直接的转化为代码,也就是把自己的想法直接的,简洁的,灵活的向别人(电脑)转述;而使用一门表达能力差的语言,比如汇编,人必须把高层的抽象一步步转化为低级的数据结构,算法,然后这种数据结构算法要再一次和机器,操作系统关联,并结合汇编领域的多种复杂的技巧,进行再一次的转化,才能产生出汇编代码,就像一个人罗罗嗦嗦半天说不清楚话一样,你无法把自己的思想很清晰地反映出来。

当然,这个定义不是官方的,是个人的。

不过基于这种定义,我们可以讨论一下几种语言的表达能力。

先看汇编吧,从个人来看,上面也提到了,这个语言是没有表达能力的。几乎没有的抽象,不论你是写代码,读代码还是改代码,都不是一件轻松的事情。当然,汇编是高效的,这无可否认,毕竟人和电脑是两个极端,人做的事情复杂了,当然电脑要做的事情就少了。所以汇编不在讨论之列。

关于c和c++,其实可以说的地方并不多,因为相差太大。

c的表达能力好不好,只要看看linux的代码就知道,那个叫程序么?纯粹是天书。

平日很自然的继承,多态的概念,你用c实现一下?人们一直在炒作说c也可以用OO的思想。那时当然可以,汇编还可以呢。关键你怎么做?你要付出多少代价才能换来c++程序员两三行就完成的东西?当然这里面也包含了很多对OO的误解,以为用个struct加上几个函数指针就是OO,那样可是大错特错了。OO的精髓,继承,多态,乃至多继承,虚继承这些c++专有的概念,c语言怎么表达?当你费尽千辛万苦好容易用c实现了这些东西,那么恭喜你,你只是写出了一个c++编译器,而且还不如免费的gcc好用,何苦呢?

OO的概念c语言是很难表达的,至少很难自然的表达。而OO正是时下软件设计的重心,一个重要的范性,c在这里是无用武之地的。也就是c不足以表达OO的概念

再看模板,以及同它关联的泛型编程。不要以为模版就是无类型,就是void*,那可是再一次大错特错。模版是一种设计理念,将类型无关的代码抽提出来,实现可以泛用的代码。当然,void*在一定程度上可以表达这种思想,无类型嘛,和泛类型看起来差不多。但是这一字之差就是本质的区别。你可以使用void*来一个无类型容器,和std::vector比比,运行时的问题一定会折磨你。

同时,也是重要的一点,无类型容器无法表达概念。例如一个存放“人”这种东西的容器,是用泛型容器,你可以明确的使用语言表达出这一点,给你,给代码的读者一个清晰的概念。而无类型容器,在代码层面上无法表现这一点,无类型永远是无类型,而泛型则可以使用的时候指定任意一种类型。也就是无类型的容器表达能力比泛型容器差。

最近的一次C#和JAVA得最大变动,既是加入了泛型容器,因为他们也发现他们以前的无类型容器不够用了,无法清晰的表达概念。

最后看FP,functional programming。这点大家都不熟悉,我也不多说。c++的lamda库已经具备了基本的函数语言的表达能力;当然,还是距人家专业的函数式语言差了很远,不过已经足以让程序员在日常编程中更加方便的表述自己的思想了。c的话确实没听说过有这方面的表达能力,他的自身语言机制不足以支撑起一套足以模拟FP的架构,也就是说c中无法表达fp的思想(还是要注意,无法表达不是无法实现)

c++和JAVA,c#得比较就不说了,和论题无关。不过要讲表达能力的话,c++应该至少稍高于他们二者。c++最近要出(2009)的更新也是在表达上下了一番功夫,从小处的修正,新的关键字的引入,让大家可以更加清晰,更加方便,更加直接的表述自己的设计思想。在这一点上LEE的观点是正确的,加强语言表达能力,而c++也正是在这样做的。
发表于 2006-11-17 11:34:43 | 显示全部楼层
太多了
不细看了
什么是表达力?
用很小的文字集表达相同的意思,那么表达力就强
好好体会吧
发表于 2006-11-17 11:41:48 | 显示全部楼层
提高表达力不是说增加几个词语,这样虽然也提高了一点表达力,但是学习语言的负担也增加了
发表于 2006-11-17 11:44:29 | 显示全部楼层
引用第24楼leesoft2006-11-17 11:41发表的“”:
提高表达力不是说增加几个词语,这样虽然也提高了一点表达力,但是学习语言的负担也增加了

这句话反过来就对了,虽然增加了学习语言的负担,但是也提高了表达力,而且不止一点哦。

而且……啥叫增加了几个词语?这么大段白写了……概念,增加的是概念……
发表于 2006-11-17 11:52:08 | 显示全部楼层
仅仅增加几个概念不是质的变化,只是量的变化,从这个意义上说现在的语言发展方向有误
目前编程还是手工业,这与语言发展的缓慢不无关系
发表于 2006-11-17 11:54:37 | 显示全部楼层
写多少无所谓,要用简练的语言表达清楚的意思
仅仅堆砌语句是无意义的
发表于 2006-11-17 12:42:22 | 显示全部楼层
你猛,不看就知道无意义。

仅仅添加几个概念?那你说怎么才算质的变化?

对了……你用过c++/JAVA/c#或者类似的语言么?
发表于 2006-11-17 12:48:51 | 显示全部楼层
唉,其实语言的发展是好事坏,还是要由广大程序员说了算,你我的争论不过是爱好者之间的争论罢了。你用c用的舒心,我用c++用的也挺好,各是各的好处把,比如你写这种解释器也好,简单的虚拟机也好,c语言确实可以胜任了。不过对于大规模开发,像我现在做的Inventor,或者你们熟悉的AutoCAD,c的话可能开发效率和维护效率都太低了,这时候就非得c++出山。对于企业级的应用,像什么ERP系统这类服务级的系统,c++开发效率就不够,维护成本也太高,反倒对于效率的要求不大,那么使用c#/Java,甚至Ruby,Python等等就是上上之选了
发表于 2006-11-17 13:07:36 | 显示全部楼层
如果看到别人说c++就是显摆,那倒让我想起了在GameRes混VB区的大师。别人一提c语言他就说是显摆……

为什么对只懂VB的人讲c语言会被他认为是显摆呢?我在这里强调一个“只”字,其他就不说了。

世界很大的,多了解些东西比多排斥些东西更有利于自己。
发表于 2006-11-17 14:38:38 | 显示全部楼层
旁观者:一个爱说C,一个爱说C++~~打不完的嘴仗~~
发表于 2006-11-17 14:50:10 | 显示全部楼层
是啊,不过有争论才有进步嘛~~
发表于 2006-11-17 17:32:50 | 显示全部楼层
嗯,可以扯出很多东西~
 楼主| 发表于 2006-11-12 21:53:11 | 显示全部楼层 |阅读模式
  请问2叉树链表生成代码如何
您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2024-4-28 05:28 , Processed in 0.011040 second(s), 17 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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