作者guest0079 (火辣辣的大姊姊)
看板C_and_CPP
标题Re: [问题] 为什麽作业系统都用C写? 而不用C++呢?
时间Sat Mar 7 02:21:59 2009
这串讨论似乎变成C与C++之争
最精采的是看到yehsd、yoco315(按字母顺序排序)两人的激烈攻防
这串讨论我反覆地看过两次,再上google参考前人对C/C++的见解
比对之下,个人觉得yehsd、yoco315两位的论点太虚了,不着边际,搔不到痒处
两位可能都是一等一的高手,程式底子十分深厚,但是两位的言论流於意气之争
几乎没什麽重点可言
讨论什麽constructor是不是空的实在是很无聊,就算是空的又如何?
我个人比较倾向於认为:C++不适合用来写OS,用C写才是王道
但yehsd似乎也提不出多棒的观点来证明C++的不好
以下是我向yoco315提出「用C++不适合写OS」的理由
1.效能也许会较差(这一点两位y兄争了很久):
说真的,我完全不能证明C++比C效能还差,甚至我可以证明,C效能永远不比C++好
证明如下:
若set_Y为C中效能优於C++的子集合,已知C++为C的超集,set_Y必然也是C++的子集
set_Y at C > set_Y at C++,固set_Y为空集合
总之,C做得到的C++也做得到,C++的效能没理由较差
一般认为C++效能较差是有几点现实上的考量:
a. C++太多太杂太难掌握,让程式人员浪费太多时间在语言本身而非问题的最佳解上
b. C++会偷偷增加一些程式码来维持本身的OO特性,一不小心就多出了不必要的code
c. C++会偷偷增加一些程式码来维持运算子过载特性,一不小心就多出了不必要的code
d. 用C++物件导向实作的函式库,很方便使用没错,但代价就是负担太大(如Qt)
e. ...应该还有很多我不知道的
2.C++程式不易读
C++远比C复杂太多了,太多好用的功能叠加在一起就变得很难用
例如:运算子过载(重载?)
Integer a = 1; // a为1
Integer b = 3; // b为2
printf("a+b=%d", a+b); //印出3
运算子过载真是太好用了,而且程式一看就懂,真是太好维护了,但是如果…
Man a_man("大雄"); // 定义一个男人
Woman a_woman("静香"); // 定义一个女人
int money = MAX_VALUE;
printf("干这是什麽鬼:%s", a_man + money + a_woman);
这种code要怎麽维护?先回头找一下Man与Woman中operator + 的定义
再确认与int作运算表示什麽,再查一下书看看运算的顺序的先後关系,如果operator
中又用到其他operator的过载,又要再去查,为了追一个问题,又引起n个问题,为
了确认n个问题,又出现n^2个问题…没完没了。程式很简洁没错,但是要怎麽debug?
难道每一行程式都要猜猜看吗?
好的物件导向远比C好维护,不过C++决对不是好的物件导向语言(这句话一言难尽)
3.物件导向不适合底层程式
了解物件导向的人就知道,它是较贴进人类思维的程式写作方法,反之,它就不是
一个贴近底层机器运作原理的编程原则,机器语言、组语才是最贴近底层运作机制的
语言,想要用OO来描述机器的行为、自然法则、各式各样的protocol…等等诸如此类
的运作机制容易流於天马行空,任意妄为。如果硬要用物件导向来实作底层机制,可
能十个人有十二种不同的见解,没人看得懂彼此的程式,因为每个人对机制的感受都
不一样,物件结构的分析各有各的看法,没完没了。
当然,不用物件导向也是可以写C++程式,但那还不如用C来的单纯
(但个人偏爱用完全无继承机制的物件架构来写C++,来当作是C的加强版)
4.C++的复杂度太高
C公认的圣经只有一本,内文也才两佰多页,一本C++的入门书就一仟多页(C++ Primer)
C++的功能及其运作细节多如牛毛,写了10年的程式也许还会看到自已不懂的语法,或是
debug时发现某个平常不会注意的细节在作怪,这如果只是开发一般的AP还好,如果是开
发OS这种大型、不易物件化的程式时,事情就大条了。因为:
a.开发人员太多,每人都用一种冷门的技巧,那要trace code就要买十本C++在身边才行
b.总有人喜欢卖弄技巧,喜欢来个多重继承,自行定义运算子,把程式的复杂度弄得很高
自以为很强,等到程式成长到自已无法控制(可能久了也忘了)才双手一摊说:比尔盖兹
对不起,我要去Google上班了
c.自已乖一点不要写出太复杂的程式就好了吗?不!因为C++支援太多种技巧、style,
所以有时候不得不乖乖配合别人的程式风格,想维持单一模组风格的一致性也很因难
OS不是少数几个人就能写出来的程式,一定要有不少人力来大量的分工才能完成
,但高度的分工之後又必需维持紧密的偶合关系,是一项复杂度很高,极易失败的专案
,如果再用一个复杂度相对较高的C++工具来写的话,就难上加难了
最後,我很好奇某人说:C++的sort大胜C的qsort,理由何在?
※ 引述《yoco315 (眠月)》之铭言:
: ※ 引述《yehsd (急)》之铭言:
: : [再次感谢版友 adrianshum 提醒, 我应该说的详细点]
: : 和这句, 有没有矛盾点?
: : [我想说的是, ctor 是空的, 还是会有 default ctor, 这点如同 adrianshum
: : 所言. 如果在 instantiation 时指定了自订的 ctor, compiler 就不会去 generate
: : default ctor. 所以 littleshan 所说的: constructor 是 compiler 帮你自动
: : 呼叫的指的应该是 default ctor? 因为这个 ctor 才是 compiler 会自动呼叫的,
: : 希望我没误解 littleshan 所说的 ^^]
: 我觉得你这个人不错,
: 虽然不太懂 C++,但是会念书,也会想,以後会很强。
: 我觉得你不错,
: 所以我现在愿意花时间打字讲些很基本的东西给你看,
: 首先,一「空的」函数,在经过最佳化以後是不会被呼叫的,
: 不管他是你自己手写的,还是编译器自动生成的都一样,
: 这是非常基本非常常见非常简单的最佳化,
: 也就是说你所谓那一百万次的函数呼叫成本其实不存在。
: : 这是 C++的优点, 但是也有可能是双面刃.
: 你不能这样说话的,
: 你得告诉我另外一面是什麽?
: 不然这个句型太强大了,什麽都能套下去,
: 我可以说「C 的不用初始化是一个双面刃」,或说「C 的速度是一个双面刃」,
: 但是我不跟你讲原因,你会不会觉得我很笑?
: C++ 出来的早,只是「建议你」初始化,
: 现在新出来的语言,几乎都强迫你一定要初始化,
: 你看,C++ 很卑微的。
: : 看到这边, 我只能说我可能真的没你那麽懂 C++, 小弟不才,
: : 用 C++ 开发一个比 C 写出来还快的OS, 这个重责大任就交给比较懂的人罗.
: 现在懂的不多没关系,你可以再多念一点,
: 如果你 CPPPL 真的念得很透的话,应该不会讲出上面那些话,
: 使戳使挫在书里面对 C++ 的效能提到很多了。
: 最後是跟程式无关的……
: 自己书看不够的时候,尽量少叫别人看书,感觉不太好,你知道我的意思。
: 一个人有料的时候,自己可能不会知道。
: 但是一个人没料的时候,旁边的人都看得很清楚。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.136.212.64
1F:推 milo9:老板 鸡排一份(拉板凳)...code size和memory没有人提一下 03/07 02:34
2F:→ xam:证明1就证错方向了..没抓到重点.. end 03/07 02:40
3F:推 zerodevil:『一个人没料的时候... (下略)』 03/07 02:44
4F:推 Fenikso:所以说写成add(a_man, money)就不用往前翻找定义是吧.. 03/07 02:49
5F:→ Fenikso:难维护是人的问题 扯到c++干什麽 03/07 02:49
6F:→ soma:我也不知道理由何在 但似乎有很多人测试过 03/07 02:51
8F:→ guest0079:感谢楼上,文中提到 STL's sort ran faster than C's 03/07 03:15
9F:→ guest0079:qsort, because C++'s templates generate optimized 03/07 03:15
10F:→ guest0079:code for a particular data type... 03/07 03:16
11F:→ guest0079:所以C++较快是因编译器作最佳化或是语言本身提供的好处 03/07 03:18
12F:→ guest0079:C不做最佳化是因为语言本身的限制吗? 03/07 03:19
13F:→ weiyucsie:可能一样要配合macro来写吧XD 03/07 03:58
14F:→ weiyucsie:不过刚刚想到简单的实作 code可能会像是inline一样重复 03/07 04:13
15F:→ weiyucsie:感觉至少c++可以内嵌sort中比较的部份(可能比较简单) 03/07 04:21
16F:推 suhorng:嗯,而C的qsort则是每次比较都有函式呼叫,输就输在这里 03/07 10:49
17F:→ suhorng:我不知道qsort有没有结合insertion sort,不过sort有 03/07 10:49
18F:→ suhorng:只是... 有必要用C++写作业系统吗... 如果不必要用到OO的 03/07 10:50
19F:→ suhorng:高阶特性,应该不需要用到C++ ? 03/07 10:50
20F:推 Chevelle:答案大家都知道 只是大家信的教不同而已.. 03/07 10:56
21F:推 yoco315:我想转 joke 03/07 11:28
你这句话的句型太强大了
22F:推 StubbornLin:c语言要写出看不懂的程式码也不难 使用者滥用 03/07 11:28
23F:→ StubbornLin:、恶搞 总不能全怪到语言头上吧= =| 03/07 11:29
24F:→ StubbornLin:你如果要说难懂 去看看template写的meta programming 03/07 11:30
25F:→ StubbornLin:之类的 03/07 11:30
26F:→ StubbornLin:还有C做得到C++也做得到 没理由C++效率比较差这证明.. 03/07 11:32
27F:→ StubbornLin:听起来就好像 你会吃饭 我也会吃饭 没理由我的薪水 03/07 11:32
28F:→ StubbornLin:比你低是一样的= =| 03/07 11:32
1.你说的没错,使用者滥用,不能怪到语言头上,但是如果语言提供一推方法让人滥用
要要怪到语言头上,版上的众高手不会滥用语言,所以不会觉得C++不好,我可以理解
2.C++让人看不懂,是指没办法像C一样用瞄的就可以知道在写什麽,C++存在太多种可能
性,当维护要trace code时就显得麻烦
3.我也知道编译器的好坏、编译选项、目标平台的instruction set、library的实作方式
…等等都会影响程式的效能,不过我必须强调,本文主要讲的是语言本身的特性,而非
强调C与C++的编译器及编译环境,我也知道这才是效能好坏的重点,不过我还是要把
我的命题锁定在语言本身的特性上,我文中也都是以这个命题在讨论
※ 编辑: guest0079 来自: 220.136.212.64 (03/07 12:05)
29F:推 yoco315:老实说你讲的都是十年前早就在newgroup上面被打爆的论点 03/07 12:10
30F:→ yoco315:十几年前的java就是用这些说嘴,後来都自己打嘴了 :X 03/07 12:11
31F:→ yoco315:我没有不礼貌的意思,你跟y能写出这些东西都不错 03/07 12:12
32F:→ yoco315:只是这些论点实在过时到让人觉得怀念 03/07 12:13
33F:推 Fenikso:所以说c++不适合写os的理由是programmer太笨不会用c++ 03/07 12:18
34F:→ alishas:用没OO的语言来实作物件导向负担不是更大... 03/07 12:41
35F:推 buganini:呃 要怪就全部怪在compiler头上就好了 所有的程式语言 03/07 13:36
36F:→ buganini:都是turing equivalent 极限最佳化结果应该都一样 03/07 13:37
37F:→ buganini:所以都是compiler不好 *flee* 03/07 13:37
38F:→ tinlans:这什麽啊?我写了 13 年 C++ 你讲出来的我都没遇过。 03/07 15:11
39F:推 Ebergies:这篇明明很中肯 03/07 15:16
40F:推 H45:看到 OO 我整个火都起来了 03/07 15:54
41F:推 Bencrie:GTK用得很开心啊 XD 03/07 19:14
42F:推 alishas:可惜使用者用的不开心 03/07 20:45
44F:→ alishas:html 03/07 20:46
45F:推 amozartea:只认同3, 1,2,4都是人的问题 不是语言的问题 06/15 02:23