> 回顾C++被提出的历史背景:无并发、CPU处理效率低、需要语言支持first-class的编程范式。我们不难发现C++的设计中作出的一个最重要的决策是:通过实现零惩罚的抽象(OO、GP),来达到效率+抽象兼得的目的。而这个决策,在当前的背景下,由一个优点,变成了一个缺点,因为它折中了抽象。如果我们不再需要通过零惩罚的抽象类来获得效率,"零惩罚的抽象"所带来的结果就只是不友好的编程范式。
以后的掌上智能设备也许是条路 不光是驱动 上面应该有许多对性能要求高的应用 Java做不到 C又太轮子 或许CPP可以填补
其实,ruby,shema,python在使用的时候一样有自己的经验技巧,尤其是在要求性能的时候。比如python里range和rangex的效率就有明显差异。C++因为用的人太多,而且经常用在强性能的地方,觉得这个问题被夸大了。
至于C,我觉得C现在相对于C++的最大优势就是编译器实现简单,所以各个平台(包括众多的嵌入式,比如国产青云51系列单片机)都有C编译器,但不一定有C++编译器(那种C++
to C的就别提了,没见过有开源的,更没见人用过)。至于编程思想,C缺少了C++构造和析构的自动机制,反而用起来很别扭,还未必比C++效率高,比如那套glib库……
在 07-11-26,pongba<pon...@gmail.com> 写道:
--
新的理论从少数人的主张到一统天下,并不是因为这个理论说服了别人抛弃旧观点,而是因为一代人的逝去。
My blog: http://googollee.blog.163.com
在并发面前,还是要看0x的工作进展如何吧。如果0x标准广泛接受,那么整个社区都会动起来,包括广泛的跨平台库(不用再考虑pthread和CreateThread的区别),庞大的使用经验(Effective
Thread?)。像erlang,shhema这种天生并行语言确实是更有优势,但是,资源总是稀缺的,cpu内存资源也一样。而且,这种动态语言在内存管理上应该不占优势吧,虽然内存越来越便宜,但随便就用个1、2g的应用也越来越多了。
其实,ruby,shema,python在使用的时候一样有自己的经验技巧,尤其是在要求性能的时候。比如python里range和rangex的效率就有明显差异。C++因为用的人太多,而且经常用在强性能的地方,觉得这个问题被夸大了。
至于C,我觉得C现在相对于C++的最大优势就是编译器实现简单,所以各个平台(包括众多的嵌入式,比如国产青云51系列单片机)都有C编译器,但不一定有C++编译器(那种C++
to C的就别提了,没见过有开源的,更没见人用过)。至于编程思想,C缺少了C++构造和析构的自动机制,反而用起来很别扭,还未必比C++效率高,比如那套glib库……
在 07-11-26,pongba<pon...@gmail.com> 写道:-->
>
> On Nov 26, 2007 10:16 PM, hayate < haya...@gmail.com> wrote:
> > 还有 一些大型的科学计算 高性能服务器 它们都有抽象的需要
> >
> >
> >
> >
> >
> 那些更是并发的天下。在并发获得的性能提升面前,以往C++的优势(零惩罚的语言抽象模型)还存在吗?如果不存在,那为什么要忍受C++的二流抽象呢?为什么不用一流抽象并且支持并发的语言呢?
>
>
> --
>
> 刘未鹏(pongba)|C++的罗浮宫
> http://blog.csdn.net/pongba
> TopLanguage
> http://groups.google.com/group/pongba
> >
>
新的理论从少数人的主张到一统天下,并不是因为这个理论说服了别人抛弃旧观点,而是因为一代人的逝去。
My blog: http://googollee.blog.163.com
我有一个很幼稚的问题:为什么一定要C++语言本身来支持并发呢? 都知道,
unix系统为支持并发提供了许多基本的机制。让操作系统自己提供并发,
然后我们运用C++语言来把这种支持做到我们的应用中,难道不好吗?
回顾C++被提出的历史背景:无并发、CPU处理效率低、需要语言支持first-class的编程范式。我们不难发现C++的设计中作出的一个最重要的决策是:通过实现零惩罚的抽象(OO、GP),来达到效率+抽象兼得的目的。而这个决策,在当前的背景下,由一个优点,变成了一个缺点,因为它折中了抽象。如果我们不再需要通过零惩罚的抽象类来获得效率,"零惩罚的抽象"所带来的结果就只是不友好的编程范式。
但是, 硬件的发展 (并发多核, 内存的廉价), 开发成本占整个系统成本的比重的
增加, C++ 的领域肯定持续萎缩.
就拿游戏编程领域来说, 游戏编程号称是很追求效率, 但是服务器端的业务逻辑,
现在多数都是用脚本语言编写. 客户端, 其实也就是网络和驱动 directx 那一层
用 C++ 好处较大, 更高一层, 现在也有用脚本的. 这都是因为开发, 调试, 热部
署等方面, C++ 并没有优势造成的.
排除掉很低层的应用, 拿稍高层来比较, C 由于有简单的 ABI, 可以作为操作系
统, 数据库或者其较基础性软件提供 api 的语言; 这样, 其他各种语言, 包括编
译的, 脚本的语言都容易调用这个 api, C++ 这点都做不到. 这些高性能要求的领
域本来用C的传统就强, OO 的帮助也不是太大, 用 C++ 编写要提供 API 反而需要
大量的 wrap. 这些位置, C 也很稳固.
C++ 的地位越发尴尬了.
语言和人不一样。人寿命到了,就死了。语言只有在无法满足需要,并且出现替代物的时候才会被逐步替代。
1. 目前C++的应用领域是哪些(要精确)。
对于我而言,...
那么在两层之间就没有c++的空间吗?很明显,还有很多"中间"型的应用被他们掠去了。比如数据库服务器、数据处理、图形处理、各类基础性的业务服务和组件等等。这类应用作为各种应用系统承上启下的支柱,规模足够庞大,有严格的性能要求,扩展性、灵活性的要求更高。这些应用要求语言有强大的抽象能力和足够的性能。c性能占优,但抽象不足,以至难以在成本约束下构建和维护如此复杂的系统。而Java的抽象能力尽管得到提升,非但以损失性能为代价,而且其抽象能力依然无法很好处理复杂系统(纯oop机制造的孽,使原本复杂的系统更复杂)。
很多主张回归c的人只看到c++带来的困难,但却忽视了另一个重要的问题,c++代码的各种软件工程统计数据远远优于c,非常接近ada。(我曾经给出过文档)。这也是很多程序员的局限,只考虑做软件,而不考虑付出的代价。
我们说c++应用有代价,而且不小。
可问题是什么代价?学习代价?不错学通c++不是件易事。但是,学习是暂时的,使用是永远的。这几天,我在.net上做软件,使用c++/cli,很多方面的算法都可以做成通用的模板,一劳永逸。在这方面,我至少消减了10%~20%工作量。但是, 受限于.net库,相比标准c++,还是无法更优。在标准c++中,我可以直接复制、转换、过滤容器,并且做容器差集、并集等操作。在.net中不行(为此,我不得不手工用两个循环做差集操作)。.net尽管提供了空前庞大的类库,但却忽视了这些基本的操作。所有的容器接口不统一,以至大量的隐性"代码损耗"吞噬了程序员的劳动。这些损失是如此细微,以至于每个程序员都把手工循环作为一种"职业技能";而这些损失是如此巨大,以至于至少有超过20%(有时甚至超过一半)的代码用于手工循环。而且当我打算玩上几把swap手法,以获得强异常保证,结果别别扭扭,最终还是放弃了。
...
c++独一无二的优势自然是其不损失性能和静态特性抽象能力。在09之后,这方面能力更是无人能及。
4. C++独一无二(不可取代)的优势到底是什么?
这方面的应用没有被充分地发展,甚至被有意无意地忽视或掩盖了。这是软件行业的一种损失。很多人没有意识到c++在这方面的优势,及其带来的好处。
试想一下,如果我们手头一种语言拥有全面stl化的库,包括基础算法和容器,gui,io,net等等。那么当我们在构造软件时,有多少workaround可以被消除呢?
gp所带来的静多态使得我们在软件开发时可以仅仅考虑各种符号的语义,而无须关心具体选择的算法和对象版本。
如此等等,众多特性对于软件项目而言是弥足珍贵的。
c++的问题是带来这些特性的同时,也带来了大量的"不和谐音"。很多观点都是把c++存在的问题,看作那些特性的问题,加以回避。这种追本求末的认识直接误导了众多不更世事的芸芸众生。以至于在论坛上,java也在那里同c++叫板比抽象。
至于并发么,我不太清楚问题的所在。只是觉得并发在这里并不是问题的关键。未来提升性能的手段很多,并发是其中之一,
关于并发什么的不是很明白,可是对于一个语言是不是会消亡,我想对于软件行业来说,接触过项目开发的人多少都会知道这样一个规律,就是只要这段代码还能完成我们对业务的要求,就绝不会推翻重写。即使只有上百行。同理目前大型设备企业中运行的系统用c++写成的还是很大比例的。因此除非这些系统不能满足需求,不然客户就会不断的在原有的系统上继续开发下去。
在 07-11-27,liang<adam...@gmail.com> 写道:
C++貌似看不出任何死亡的征兆,Java和C#也在走C++的老路。至于Python和Ruby,我看不可能达到C++的高度,跟在Ruby和Python后面的敌人更凶狠。
C++的复杂,很大一部分是和C兼容造成的,但是,理智的C++程序员应该意识到,这些特性就差打上deprecated标记了。C++抛不掉这一部分固然遗憾,但是并不成为致命的问题。
C++固然复杂,Java和C#也开始不简单了。谁要是觉得anotation看上去很美,全当我没说。 那东西压根就不能配得上language这个词.况且本来复杂的东西,看起来复杂没什么大错。C#的template是简单,不过那是被阉割了的。Java根本就是个骗局。
至于OO,那种华丽的巴洛克式的类设计简直就是犯罪。所以,Java,C#在这方面就算本事大,屠龙技而已。倒是应该研究一下怎么加强对组合技术的支持。C++对组合的支持也很烂,不过,比起Java和C#还是要好一点。FP组合能力很强,但是,一来大家不熟悉,二来性能有时候有点问题,第三,对ADT的支持总觉得不顺手。
Java在concurrency方面的贡献值得尊敬。但是,在并行领域,C++并不落后。MPI,OpenMP那种东西,语法上简直有反人类的嫌疑。充其量,也只能算是并行领域的汇编语言。用这些东西,对我来说,基本没有精力去思考和问题本身相关的事情了。并发的大门还没完全打开,现在就下结论为时过早。如果用操作系统来打比方,现在还是设计原子操作,中断门,重入的阶段。离完整的内存管理,进程调度还早着呢。
另
CPU里的SIMD技术推出了无数指令,现在软件能用上多少呢?
C++的话,在语言上明显没有办法显式的利用这些指令。直接汇编也吃不消。靠编译器优化的话能有多大效果?
X86-64增加了好多寄存器,实际软件的性能得到多大的提升?
希望有达人出来解说一番。
在 07-11-29,cherokee<tec...@gmail.com> 写道:
我觉得之所以大家批评C++这么激烈,主要还是应为现在C++坚守的领域缺乏接班人。
C++就算问题再多,大家也只能咬牙忍下去,或者对着0X望梅止渴一下。
好在D看上去还不错,说不定能成为一个不错的接班人。希望能赶快成熟起来。
另
CPU里的SIMD技术推出了无数指令,现在软件能用上多少呢?
C++的话,在语言上明显没有办法显式的利用这些指令。直接汇编也吃不消。靠编译器优化的话能有多大效果?
X86-64增加了好多寄存器,实际软件的性能得到多大的提升?
楼上的发言我很仔细的阅读了。
"通过折衷抽象模型来获得效率"的意思也说的很清楚。
从长期来看,随着硬件的发展,抽象程度必然会越来越高。为了效率而折衷的模型必定会被淘汰。C++不光有为了效率的折衷,还有承重的历史包袱。我希望能有新的语言出来顶替C++的位置。
但是从短期来看,多核的出现反而会降低抽象。
比如说现在的编程语言基本上把内存和CPU都抽象掉了。
但是核的增加会使得统一内存模型无以为继。每个核都会有自己的本地内存。这样的话,为了利用多个核,就必须把内存模型暴露给程序员。
> > C++就算问题再多,大家也只能咬牙忍下去,或者对着0X望梅止渴一下。
> > 好在D看上去还不错,说不定能成为一个不错的接班人。希望能赶快成熟起来。
> >
> > 另
> > CPU里的SIMD技术推出了无数指令,现在软件能用上多少呢?
>
> "现在的事实"不代表"未来的趋势"。好的并发编程模型定会出现的。好的优化技术也定会出现的。
这个地方我没说清楚,抱歉。我这里并不是反问。而是疑问,我对这方面的情况不了解,希望有了解的人出来说明一下。
下面的问题也是一样。
> 主要是理性分析,有批评也是理性的批评。楼上的发言我很仔细的阅读了。
> 理由我已经在第一篇帖子里面陈述得很清楚了,感觉真正看的人很少,因为除了莫兄基本没有人对我的想法提出具体的意见。也许我没有说清楚什么是"通过折衷抽象模型来获得效率"?
"通过折衷抽象模型来获得效率"的意思也说的很清楚。
从长期来看,随着硬件的发展,抽象程度必然会越来越高。为了效率而折衷的模型必定会被淘汰。C++不光有为了效率的折衷,还有承重的历史包袱。我希望能有新的语言出来顶替C++的位置。
但是从短期来看,多核的出现反而会降低抽象。
比如说现在的编程语言基本上把内存和CPU都抽象掉了。
但是核的增加会使得统一内存模型无以为继。每个核都会有自己的本地内存。这样的话,为了利用多个核,就必须把内存模型暴露给程序员。
我一直认为多核这个东东对普通程序员来说意义不大,我们最多做到多线程编程就可以了,而这是老早就成熟了的技术。
一门语言何必遭到这么多的批判评价和指责呢?还是大家对他的关心超过了应有的程度。任何语言都可以实现的东西我们就把他当作一天路,适合就走,不适合就换。多做做项目,就会知道,没有考虑语言好坏的权利。D语言会是新的霸主?乱世阿~
On Nov 30, 2007 8:52 AM, 王磊 <wangle...@gmail.com> wrote:
一门语言何必遭到这么多的批判评价和指责呢?还是大家对他的关心超过了应有的程度。任何语言都可以实现的东西我们就把他当作一天路,适合就走,不适合就换。多做做项目,就会知道,没有考虑语言好坏的权利。D语言会是新的霸主?乱世阿~
我们就是在讨论"适合不适合"、"什么时候才是适合的"不是么?
此外,项目中总会有人去选择语言的,如果有一天你也需要自己去选择的话,权衡哪种语言最合适难道不是重要的?
再说,没有看到reddit上前阵子总有:Why Learning XXX (e.g. Python) make me a good XXX ( e.g. C++) Programmer这样的帖子?
只是觉得c++这门安静的语言最近被风风火火的推上了政治舞台。越来越多的人开始考虑c++的诸多特性是不适该被XXX或者被YYY。以后该被ZZZ。可怜的c++。要是像 lisp 那样成为历史就好了。
在细锁上面,CRITICALSECTION的效率足够满足应用层大部分的应用,我不知道有多少人碰到过写应用层的时候CS也无法满足效率的情况。
嗯,模拟又不是什么好事。每次哪门语言加入类的支持,总有用Lisp的人跳出来说其实高端函数就够了。问题是,放不方便啊?函数模拟OO就好比用OO模拟函数,虽说二者基本等价,但用上去感觉就是不一样。这次es4新特性出来,好多人都说类没有必要。其实呢,没有类的结果就是出现各种互不兼容模拟的类的框架。
就是,就是。我总觉得莫总和pangba讨论的东西太玄了!有点像历史书上讲的那些士人清谈!
说实话,我不太理解你的这个回复,我说的是起码绝大部分的锁都可以用CS完成,你提到的只是一个很特别的情况,我相信我们中的绝大部分人都不会碰到。即
使碰到我也会想办法去解决。除了CS,你还用其他什么类型的细锁,在win用户平台下面?在linux平台下你也没有太多的选择。
说两句挨骂的, 云风应该多读读西方哲学, 和数学史这样的东西, 就会发现形式化是一直在追求的; 比如Linus, 恐怕没人敢去想, Linus
那么说, 很有可能是因为他个人的某一方面素质(虽然在他的领域内他很强)不足以承担他所说的"心智包袱", 而并非用"心智包袱"去换取一些东西不值
得. 如果仅因为Linus这样的人的发言简介肯定了我们的某种感受, 我觉得这也许不是什么好事.
而刘兄你则应该去从事一些项目, 包括C#的, Java的, JavaScript的等等, 然后再回过头来考虑这个问题. 说实话, 我虽然早在
10年前就写过C/C++程序, 但是对C++反而是个新手, 因为近几年, 我从事的工作基本都围绕Web, 也就是C#和JS展开. 正好是你们认
为的能够继续瓜分C++市场的两类语言的两个还算广泛的代表.
但是最近重新关心了一下C++, 实际操作并没有给我带来太多的不爽快,
虽然Anders说的不必要的繁文缛节确实太多了; 而理论上的学习恰恰让我更多的认识了C#这样的语言的不足, C#的各方面设定太在乎那些承受不了"心
智包袱"的家伙了, 比如其泛型与C++的模板比, 只能说是鸡肋. Java由于其JVM实现方式的诸多制约, 就更不要说了.
我个人恰恰认为, C#砍掉的东西, 实际上是在束缚而不是增强我的能力, 这跟是否直接操作硬件无关, 限於时间, 我不打算展开来讨论这种问题;
而JS这样的半LISP语言, 嗯.., 如果变成一个静态语言, 或者采取其它一些能接近静态语言的方式, 如象.NET那样运行时编译然后缓存,
可能大有所为.
但是C++本身也在进步不是么? 当然, C#也在进步, Ruby(不熟, 所以就没用它来说事)也在进步, 最终是殊途同归, 但
每种语言略有偏向的.
你说的问题, 我觉得最大的谬误在于, 你把不同层面的因素放到了一起. 并行带来的性能, 和静态语言的性能, 根本不是一码事. 主要是过程本身是
否可以分解. 如一个可分解的过程, 分为两个不可分解的过程可以放进两个CPU, 但每一个CPU上的效率, 照样是要追求的. 如运行在CPU1上
的一个不可分割的任务C++耗时1ms, 而Ruby耗时2ms, CPU2上的任务, 由于优化, C++和Ruby都是1ms, 但得出结果,
Ruby还是2ms, C++却是1ms. 所以关键还是C++提供的并行化的能力.
殊途同归?meaning what?归到哪条路上?
你 说的问题, 我觉得最大的谬误在于, 你把不同层面的因素放到了一起. 并行带来的性能, 和静态语言的性能, 根本不是一码事. 主要是过程本身是
否可以分解. 如一个可分解的过程, 分为两个不可分解的过程可以放进两个CPU, 但每一个CPU上的效率, 照样是要追求的. 如运行在CPU1上
的一个不可分割的任务C++耗时1ms, 而Ruby耗时2ms, CPU2上的任务, 由于优化, C++和Ruby都是1ms, 但得出结果,
Ruby还是2ms, C++却是1ms. 所以关键还是C++提供的并行化的能力.
pongda 这里说得有道理.
你说的这个逻辑的漏洞在于认为性能是绝对的。然而性能是相对的。所有正确的关于优化的文章都会说:除非必要否则不要提早优化,而且还要"测量两次,优化一 次"。关键是:性能一旦达到一定要求,便出现严重的边际效应递减(接着往下优化便开始不值得起来);否则岂不是所有的应用都要用C++做(越快越好嘛)。 "并发"作为一个强劲的优化手段,在那些可通过并发优化的应用上,会把C++的零惩罚的抽象模型的风头抢掉,于是在这个时候也许就未必需要用C++,而只 需要一门良好支持并发的语言(也许Java,也许C#)就可以了。和Bjarne通信的时候我认为他也认同这么个观点,不过他指出了一个重要的地方:即仍 然会有大量应用场所不仅需要效率、而且无法容易地并行化,这类场所仍然是C++的用武之地。至于到底有哪些我还得再问问。
同样的项目, 例如进行数据处理之后写数据库, 用 python 写, 比 C++ 写能够快
很多完成, 而且功能测试正常之后, 不必再去测试有没有内存泄漏之类的问题.
如果非本质复杂性对效率没有影响, 为什么大家会选用java, 脚本, 而不是 C++
去开发用不着非常高效率的东西 ?
> 不
> 过Brooks不早就说过, 这些非本质复杂性的消除, 根本不会对提高编程效率有决定性影响吗?
>
--
Any complex technology which doesn't come with documentation must be the best
available.
我不认为云风不知道这一点。实际上,从和云风的讨论中,我发现他对设计的认识是非常深刻的。而Linus所言也是对的,只不过前提是在他从事的领域之内。 此外,"心智包袱"是说非本质复杂性,而不是C++用于换取一些东西所必须付出的代价(比如分为明显的动静两种语言特性----OO和GP)。D语言就很大程度上消除了这些"心智包袱";而同样保有了效率和抽象。C++则要等0x,不过C++的优势在于既有代码基。D语言我不太懂, 但是我请你注意的是为什么我不懂这一事实, 谁在支持D, 谁在推广D, 我用D时找到所有我想要的东西吗? 大量的文档, 社区的 帮助, SourceForge上的源代码?
C++相对于其它替代品, 这种优势将是长期的, 而且, 我觉得对于我们来说, 不能忽略这种优势,
我不认为云风不知道这一点。实际上,从和云风的讨论中,我发现他对设计的认识是非常深刻的。而Linus所言也是对的,只不过前提是在他从事的领域之内。 此外,"心智包袱"是说非本质复杂性,而不是C++用于换取一些东西所必须付出的代价(比如分为明显的动静两种语言特性----OO和GP)。D语言就很大程度上消除了这些"心智包袱";而同样保有了效率和抽象。C++则要等0x,不过C++的优势在于既有代码基。D语言我不太懂, 但是我请你注意的是为什么我不懂这一事实, 谁在支持D, 谁在推广D, 我用D时找到所有我想要的东西吗? 大量的文档, 社区的 帮助, SourceForge上的源代码?
C++相对于其它替代品, 这种优势将是长期的, 而且, 我觉得对于我们来说, 不能忽略这种优势,
性能在很多领域是绝对的. 不用BS, 我给你提供一个场景, 我这次做的这个图像处理程序, 算法所有的操作都直接操作内存, 在需要处理的图像大到
一定地步, 其速度说实话有点不能接受. 你可以看看Photoshop的一些特效的速度. 是, 我做大面积的高斯模糊或者什么特效, 进度条闪一下
也就算了. 问题是有些特效是通过鼠标拖动来操作的, 并且必须及时反映结果. 双核我可以把图分两部分, 分别处理, 4核分4部分, 这都很好想
像. 你的意思是说, 未来16核了, 假设C#慢16倍, 假设没有并发本身带来的成本, 那么既然我现在的C++程序用户能接受, 那么很显然将来
C#的效率除以16在乘以16, 还是能接受. 我觉得咱们的分歧就在这里, 因为你没有考虑, 未来的软件, 处理的不是几千像素乘以几千像素的图象
了, 很可能每幅照片都是上万乘以上万像素的. 所以不仅数码相机里得用C/C++, 这些图像处理程序也是照旧. 我估计游戏也是一样, 因为玩家的
要求会不断提高.
当然C#不见得真的慢16倍这么多, 但是你可能听说过的, 那些证明C#或Java性能也比较可靠的传闻也不见得是真的. 比如
Quake2.NET, 很多人说这个移植能达到C 85%的速度, 其实它的实现方式根本就是包装式的. 一般C#程序员, 根本无法掌握. 再多的
核, 应该是大幅提高最终用户的使用体验, 而不是为了让程序员能用效率较低但较好用的编程方式去写程序. 性能的要求也是随着时间增长的.
近几年内还存在着其它问题: 比如我一个几百K, 一两M的共享软件, 却要求用户下一个几百M的运行时? 不过这些问题肯定都能解决. 不过作为一个
C#程序员, 我比较不明白的还是: C++比C#到底麻烦了多少, 连你这个过去扛C++大旗的都不看好了? 我觉得只有明显的让我这样的职业C#选
手感觉不好, 才说明从C++跳到另一门语言, 是个必然的选择吧...
我发现没白偷偷摸摸混到这里来.., 确实很多问题我以前没想过. 你们对C++比我熟多, 所以肯定有经验, 无论是好的还是痛苦的. 只是, 我觉
得我不属于刘兄说的那个用啥就被啥框住, 觉得啥好的那种人, 所以既然我不是一个CPPER, 也不觉得连续用了好几年的C#多么好, 所以就想拿我
的感受来抛砖引玉. 因为我实在觉得纳闷, 我一可说的上是C++门外汉的家伙, 觉得C++可以接受, 而天天话题围绕C++打转的刘兄到开始质疑
了.
On Dec 13, 2007 9:02 AM, Eli <Eli...@gmail.com> wrote:
性能在很多领域是绝对的. 不用BS, 我给你提供一个场景, 我这次做的这个图像处理程序, 算法所有的操作都直接操作内存, 在需要处理的图像大到
一定地步, 其速度说实话有点不能接受. 你可以看看Photoshop的一些特效的速度. 是, 我做大面积的高斯模糊或者什么特效, 进度条闪一下
也就算了. 问题是有些特效是通过鼠标拖动来操作的, 并且必须及时反映结果. 双核我可以把图分两部分, 分别处理, 4核分4部分, 这都很好想
像. 你的意思是说, 未来16核了, 假设C#慢16倍, 假设没有并发本身带来的成本, 那么既然我现在的C++程序用户能接受, 那么很显然将来
C#的效率除以16在乘以16, 还是能接受. 我觉得咱们的分歧就在这里, 因为你没有考虑, 未来的软件, 处理的不是几千像素乘以几千像素的图象
了, 很可能每幅照片都是上万乘以上万像素的. 所以不仅数码相机里得用C/C++, 这些图像处理程序也是照旧. 我估计游戏也是一样, 因为玩家的
要求会不断提高.
当然C#不见得真的慢16倍这么多, 但是你可能听说过的, 那些证明C#或Java性能也比较可靠的传闻也不见得是真的. 比如
Quake2.NET , 很多人说这个移植能达到C 85%的速度, 其实它的实现方式根本就是包装式的. 一般C#程序员, 根本无法掌握. 再多的
核, 应该是大幅提高最终用户的使用体验, 而不是为了让程序员能用效率较低但较好用的编程方式去写程序. 性能的要求也是随着时间增长的.
近几年内还存在着其它问题: 比如我一个几百K, 一两M的共享软件, 却要求用户下一个几百M的运行时? 不过这些问题肯定都能解决. 不过作为一个
C#程序员, 我比较不明白的还是: C++比C#到底麻烦了多少, 连你这个过去扛C++大旗的都不看好了? 我觉得只有明显的让我这样的职业C#选
手感觉不好, 才说明从C++跳到另一门语言, 是个必然的选择吧...
PS3就是这样的结构。
又到了stack唱主角的时候。
C++/D可以雄起一阵了。
在 07-12-14,Yong Yuan<y...@cs.toronto.edu> 写道:
在 07-12-13,Jian Wang<oxygen.j...@gmail.com> 写道:
--
新的理论从少数人的主张到一统天下,并不是因为这个理论说服了别人抛弃旧观点,而是因为一代人的逝去。
My blog: http://googollee.blog.163.com
早几十年就有类似的内存了, 不过当时的关联内存似乎还不能检索字符串, 可以你
提供一个整数给它, 它立刻给你返回一个以前关联好的值.它的逻辑电路设计, 就
是用内容来做检索而不是用 offset.
想想, 你辛辛苦苦做了一个高速的 字符串-->index map, 号称消耗 2G cpu 20%
的能力可以每秒钟检索 30M Bytes, 别人说, 我花 $10 买个内存, 不用消耗这么
贵的 cpu 的能力, 就可以每秒钟检索 800M, 哈哈, 有何感受.
网络上很多设备, 都必须用硬件来加速, 例如, 可以跟踪 session 的路由器, 对
于每一个包, 要查这个包是否在已管理的session 中, 要根据 ip src addr / src
port / dstr addr dst port 来查, 如果不用关联存储来查的话, 你要怎样构造数
据结构, 才能在短短的几个时钟周期内查出来 ? 我想过这个问题, 想不出来.
Jian Wang 写道:
> TCAM这么牛?长见识了。
> 应该是内存芯片和控制器组合实现的吧?
>
问题是, 部分相关的任务, 才是让人头痛的.
考虑一个 c++ 编译器, 可以使用多个线程编译同一个编译单元的, 这个任务, 并
不是完全无法分拆的 ---- 例如, 某个函数, 外围的变量定义, 语句已经分析完
毕, 内部的block, 实际上可以并行分析; 文件级别看, 某个文件, 最外层的类,
他们的 api 级别已经完毕的话, 各个函数体的分析, 也是可以并行的; 但是, 并
发的线程之间要共享的东西也不少, 所以要高效地做好类似的工作, 并不是一个简
单的事情.
> 的片段. 所以多核并不
> 会加强哪种语言, 而是所有的程序员都应该换换思路了.
>
看看这个表, 虽然准确度被一些人质疑, 但是多少还有一些参考意义, 特别是某个语言自身百分比的趋势.最优秀的技术不一定会最流行,有缺陷的技术往往成为事实上的标准。 C++目前最大的优势就是历史的积累。
Position Dec 2007 |
Position Dec 2006 |
Delta in Position | Programming Language | Ratings Dec 2007 |
Delta Dec 2006 |
Status |
---|---|---|---|---|---|---|
1 | 1 | Java | 20.049% | +0.14% | A | |
2 | 2 | C | 13.173% | -3.44% | A | |
3 | 4 | (Visual) Basic | 10.219% | +1.31% | A | |
4 | 5 | PHP | 8.393% | -0.14% | A | |
5 | 3 | C++ | 7.871% | -2.54% | A | |
6 | 7 | Python | 4.697% | +0.93% | A | |
7 | 6 | Perl | 4.383% | -2.01% | A | |
8 | 8 | C# | 3.994% | +0.82% | A | |
9 | 11 | Ruby | 3.089% | +0.76% | A | |
10 | 10 | JavaScript | 2.733% | +0.17% | A | |
11 | 9 | Delphi | 2.673% | +0.10% | A | |
12 | 14 | D | 1.633% | +0.66% | A | |
13 | 13 | PL/SQL | 1.394% | +0.05% | A | |
14 | 12 | SAS | 1.393% | -0.84% | A | |
15 | 18 | COBOL | 0.894% | +0.29% | A- |
Eli 写道:这个, 我来说说我的看法.我不认为云风不知道这一点。实际上,从和云风的讨论中,我发现他对设计的认识是非常深刻的。而Linus所言也是对的,只不过前提是在他从事的领域之内。
此外,"心智包袱"是说非本质复杂性,而不是C++用于换取一些东西所必须付出的代价(比如分为明显的动静两种语言特性----OO和GP)。D语言就很大程度上消除了这些"心智包袱";而同样保有了效率和抽象。C++则要等0x,不过C++的优势在于既有代码基。
D语言我不太懂, 但是我请你注意的是为什么我不懂这一事实, 谁在支持D, 谁在推广D, 我用D时找到所有我想要的东西吗? 大量的文档, 社区的
帮助, SourceForge上的源代码?
我觉得, 一个设计得好的语言, 要学懂语言本身, 看基本的手册, 入门书, 简单的范例就应该足够了, 如果搞到需要网上大量资源去讨论语言的基本使用, 那是失败.
互联网网上的项目, 文档, 社区, 应该是去讨论基于这个语言的种种框架和库, 而不是去讨论种种 workaround, 以及标准库太少而各人重重复复做的类似的库.
说到C++, 网上的东西, 排除掉这些, 剩下的很多吗? 我觉得比 C 和 Java 都少.
当然, 如果要开发 Windows GUI 程序, 不想要虚拟机, 要用编译语言, 要界面漂亮, 要好的调试器, 那除了VC ++, 也没啥选择.