作者yoco315 (眠月)
看板C_and_CPP
标题Re: 常见的 C++ 错误观点
时间Fri Mar 13 23:26:47 2009
追加一发,这一发很重要,因为这是 C++ 非常自古以来就被误会的点。
1F:推 softwind:我觉得 Linus说的很中肯 C++扩充C 但不代表 C++比C优越03/06 21:11
2F:→ tinlans:遗憾的是 C++ 并非 C 的扩充。03/06 21:14
3F:推 Chevelle:C++ 如果不是 C 的扩充为什麽要叫 C++?03/06 21:22
事实上的确不是,
因为 C++ 是 Simula 跟 Algol 的混合体在 C 语言上面的实作品。
C++ 的主要概念都是来自於 Simula 跟 Algol 两种语言,
但是当时这两个语言都有些缺点,比方说执行效能跟移植问题。
C++ 当时的目标是融合这两个语言的优点,
然後希望能作到非常方便的可移植性以及高效能。
如果事情不是在 1979 年,是在 2009 的今天,
你想要发明一个语言,到处都可以跑,请问你会怎麽作?
你会想要在每一种机器上面都实作你的语言的编译器?
当然不是,这样太要命了,
最简单的作法是在 JVM 上面跑,因为 JVM 到处都有。
时间回到 1979 年,当初还没有 JVM,
那最普遍的平台是什麽?是 C。
最初的 C++ 是以 C 为载体,
「
把 C 语言当作一个平台」,一个高效能,高移植性的平台,
使用一个 preprocessor,把 C++ 程式码转成合法的 C 语言程式码,
这样就可以透过本来就已经高效能且存在於很多平台的 C 编译器直接被使用。
另外,如果是在今天,
你想要你的新语言能尽快被大家接受,你会怎麽作?
开发一个语言的语法跟现在常见的完全不同(像是 FORTH)?
还是把语法设计成 C-like?当然是後者。
C++ 当初的考量也是这样,
但是他做的更极端,他选择几乎 100% 跟 C 相容(还是有不相容的地方),
於是程式设计师可以快速的接纳 C++,不用重新学。
事实上当初 C++ 有考虑以别的语言为载体,但是最後选定的 C。
也就是说,当初
C++ 发展时所蕴含的「观念」,跟 C 没有关系,
那是一个全新的语言,只是选择用 C 当载体,在
「语法」上刻意设计的跟 C 相容,
事实上也有把 C++ 编成 P 语言(一种简单,容易移植的语言)的编译器唷~
事实上,C++ 发展时也有考虑过跟 C 不相容的语法,
但是使用者的反弹非常明显,你知道的,
程式设计师都很懒,大家都懒得学新东西,
大家都希望我本来就会的东西,到了新的地方还是可以完全套用。
几乎所有跟 C 不相容的尝试最後都被使用者打回来,
不然 C++ 理想上的语法会比现在更精练许多。
而 C++ 这个名字,
其实是 C++ 已经发展好一段时间才取的,
原因是因为「语法上跟 C 很像」,
请千万不要再误会 C++ 是从 C 来的了。
PS.
「C++扩充C 但不代表 C++比C优越」
这句话姑且不论实际上正确不正确,
但是 Linus 讲话一点都不中肯,他的偏见是有名的,加油好吗。
「
Linus 讲话一点都不中肯」
这句话才是公认的中肯。
--
To iterate is human, to recurse, divine.
递回只应天上有, 凡人该当用回圈. L. Peter Deutsch
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 118.160.106.19
4F:→ fuha:看了很多新闻 也觉得他有点偏激 03/13 23:33
5F:→ pico2k:没有一点偏执狂是写不出linux的... 03/14 00:47
6F:推 littleshan:我很喜欢用Linux不过对这件事我必须反对Linus的偏见 03/14 00:57
7F:推 PRAM:我觉得linus很中肯,因为他实际用c++试过写linux kernel,但不 03/14 10:15
8F:→ PRAM:可行。如果你要推翻他的话,那你必须用c++写出linux kernel, 03/14 10:16
9F:→ PRAM:光靠讲故事是没有说服力的,我只是就事论事,得罪得罪。 03/14 10:16
10F:→ yoco315:"Get out and play in your little world." 03/14 10:18
11F:→ ChampYen:本文受教了, 然而原Po楼上回文会不会太过了? 03/14 10:35
12F:→ ChampYen:nice article... 回覆他人观点稍微和缓些可能比较听得下 03/14 10:38
13F:→ yoco315:这不是我讲的,这是 Linus 讲的 XD 还有别的,像是.. 03/14 10:47
14F:→ yoco315: *YOU* are full of bullshit! 或是 03/14 10:48
15F:→ yoco315: don't screw that up. 03/14 10:48
16F:→ yoco315: you have to limit your project in C 03/14 10:49
17F:→ yoco315:Linus 遇到别人谈 C++ 就是这样大脑发热.. 懂了吗.. 03/14 10:50
18F:→ yoco315:像我上面都已经说我不论那句话的对错了,我不讨论宗教问题 03/14 10:51
19F:→ yoco315:我只是说C++的历史,这没什麽好同意还是说服的,这是事实 03/14 10:52
20F:→ yoco315:但是PRAM就像Linus一样大脑发烫的跳出来 03/14 10:52
21F:→ yoco315:说你故事讲得好不代表C++比C好,废话,我根本没在讲C++好 03/14 10:53
22F:→ yoco315:我只是单纯描述C++不是从C来的,选C也是因为C很优秀 03/14 10:55
23F:→ yoco315:但是就是有人会跳出来靠北,还靠北的完全无关 03/14 10:55
24F:推 Chevelle:意思好像差不多啊.. 还是多谢你的历史课 03/14 11:07
25F:→ Chevelle:它都取名叫 C++ 了,那要说「这是全新的语言」就.. 03/14 11:08
26F:推 legnaleurc:所以JavaScript也一定要和Java有关系?XD 03/14 11:43
27F:推 Chevelle:关系的部份有人帮我讲啦 比如「刻意」相容什麽的XD 03/14 11:47
28F:推 HudsonE:C++ 确实和 C 不同啊不然你用 C compiler 编编看 C++ XD 03/14 11:49
29F:→ HudsonE:不过历史虽然这样... 我是觉得从语言角度看 03/14 11:50
30F:→ HudsonE:要说 C++ extends C 也不是什麽[[很罪大恶极的事 XD 03/14 11:50
32F:→ Cloud:三年前看过的文章,Bjarne谈C++历史...我觉得很棒...XD 03/14 12:54
33F:→ yoco315:从 C 出发,加入别的东西,这才叫 extend 03/14 13:12
34F:→ yoco315:从别的地方出发,去相容於 C,这叫 fitting 03/14 13:13
35F:→ yoco315:C++ 跟 C 是有关系,不过不是 extend,是 fit 很难懂吗? 03/14 13:13
36F:→ yoco315:我都讲得这麽白话了,这不是意识形态的问题,这是事实 03/14 13:15
37F:推 Chevelle:我是不觉得讲 C++ extends C 有什麽不好 这样 C++ 会显得 03/14 13:32
38F:→ Chevelle:比较不伟大吗? 刚刚那篇 Bjarne Stroustrup 自己都说了 03/14 13:33
39F:→ Chevelle:a dialect of C called "C with Classes" 03/14 13:33
40F:→ yoco315:没有不好,只是不对 03/14 13:36
41F:→ yoco315:也没有伟大不伟大的问题,只是单纯「不是这样」而已 03/14 13:36
42F:→ yoco315:另外方言怎麽取,也改不了 C++ 不是 extend C 的事实 03/14 13:37
43F:→ yoco315:事实上就不是阿 XDDDD 我就不懂为什麽一堆人要找一推东西 03/14 13:39
44F:→ yoco315:来说你看这你看那你看你看你看你看.. 看再多也不是阿 orz 03/14 13:39
45F:推 Chevelle:我比较希望在那篇里可以找到你所谓的 fitting 说法啊 03/14 13:40
46F:→ Chevelle:人家都说是从 C 来的 难道还要说不是吗? 03/14 13:40
47F:→ yoco315:那篇是the design and evolution of c++ 的摘录加上新发展 03/14 13:42
48F:→ yoco315:你大可直接去看 d&e c++, 不是就不是 @"@ 03/14 13:43
49F:推 Chevelle:你是说这个"摘录"跟书里讲的完全不一样吗? 03/14 13:46
50F:→ yoco315:不,显然是你只看了一点点东西所以产生误解 03/14 13:49
51F:→ yoco315:如果你对於 C++ 发展的过程有更多了解,不会讲出这种话 03/14 13:49
52F:→ yoco315:你想找到所谓 fitting 哪里来,那为什麽不看的更全面一点? 03/14 13:50
53F:→ yoco315:既然要学 C++, 那学得全面一点,完整一点,有更正确的认知 03/14 13:51
54F:→ yoco315:不是更好吗?我不懂为什麽很多人要坚持错误的理解.. @"@ 03/14 13:51
55F:→ yoco315:事实上从OS串开始,我就很讶异(其实已经不讶异了) 03/14 13:52
56F:→ yoco315:很多人一直坚持着错误的看法,我觉得很奇怪.. 03/14 13:53
57F:→ yoco315:为什麽学习一个东西,不去念书看正确的东西.. 03/14 13:53
58F:→ yoco315:而是只凭着自己的想像在坚持一些很奇怪的东西? 03/14 13:54
59F:→ yoco315:不就是因为不懂,所以才在学吗?那为什麽要学又不学对的? 03/14 13:54
60F:→ yoco315:对 C++ 的来源有正确的理解跟认识,到底是哪里不好? 03/14 13:55
61F:推 HudsonE:滑稽而已啊... lol 03/14 13:55
62F:→ yoco315:我不懂为什麽很多人在不了解状况的时候还可以讲话很大声@@ 03/14 13:56
63F:推 Chevelle:我比较信 Stroustrup 说的啦 03/14 13:57
64F:→ yoco315:阿要学就好好学,一直争有什麽好处 -_-?? 03/14 13:57
65F:→ Chevelle:这篇里好像没有看到有人在学 - -" 03/14 13:58
66F:→ yoco315:那当然,问题是你误解了 03/14 13:58
67F:→ yoco315:所以希望你要就去看的更完整一点.. 03/14 13:59
68F:推 Chevelle:你可以说这样讲不好,不过你不能说这麽讲是「错」的吧 03/14 14:02
69F:→ Chevelle:Stroustrup 自己都没有讲得如此斩钉截铁了... 03/14 14:03
70F:推 Chevelle:"C++ is a direct descendant of C that retains almost 03/14 14:05
71F:→ Chevelle:all of C as a subset." 03/14 14:05
72F:→ yoco315:我上面讲了,这是「语法」上跟 C 相容的结果 03/14 14:11
73F:→ yoco315:C++ 本质上大都是 Simula 的 C 语言移植 03/14 14:12
74F:→ yoco315:我老实讲个不客气的,上面那篇53页的文章才po多久 03/14 14:12
75F:→ Chevelle:对了,descendant 好像不是「扩充」出来的,这算我的疏失 03/14 14:12
76F:→ yoco315:坦白说我觉得你只是匆匆爬过,与其这样 03/14 14:12
77F:→ yoco315:为什麽不去完整的看 desing and evo of C++ ? 03/14 14:13
78F:→ yoco315:有更深入跟全面的认识不是更好吗? 03/14 14:13
79F:→ yoco315:我这样讲是很不客气,不太礼貌,这样我是在质疑你 03/14 14:15
80F:→ yoco315:是在质疑你用刚装的半桶水跟我讨论.. 事实上你可能不是 03/14 14:16
81F:→ yoco315:但是坦白说我你给我的感觉就是这样.. 如果误会你我很抱歉 03/14 14:16
82F:→ jaw109:拜读此文, 小弟受教了, 在此谢过~~~~ 03/14 16:21
83F:推 wowtiger:用 C 的档案给 C++ Compiler 应该会 warning 一堆吧 03/14 16:34
84F:推 Chevelle:我是不觉得我说的有那麽「不对」啦,您说的我也认同咩 03/14 16:38
85F:推 wowtiger:我个人是觉得错很大 因为 C++ 要求太多了 C可以C++却不行 03/14 16:57
86F:推 Chevelle:我没说过可用 C++ compiler 去 compile C 的 source 啊 03/14 17:01
87F:推 Chevelle:「扩充」或许太狭义,不过 C++ 「就是从 C 来的」啊 03/14 17:08
88F:→ Chevelle:难道要说是 (accidentally/reluctantly/somewhat) 03/14 17:10
89F:→ Chevelle:has a syntax close to C? 03/14 17:10
90F:推 carlcarl:争到最後 真不晓得你们在干麽 有点无聊= = 03/14 17:55
91F:推 ilovebbs:....有点欢..囧 03/14 18:42
92F:推 Chevelle:"C++ is a direct descendant of Simula and Algol, 03/14 19:57
93F:→ Chevelle:... I chose C as its syntax..." 03/14 19:57
94F:→ Chevelle:y大大要过生日了吧 别争论了 @@ 03/14 19:57
95F:推 hylkevin:推yoco大 择善固执 03/15 03:26
96F:推 chrisdar:所以要拆板啦? C / C++ / MFC / ALT / dotNET 五个讨论板 03/15 11:13
97F:推 zxvc:有时候我会怀疑 择"对"固执 真的有义意吗? 03/15 13:41
98F:→ zxvc:像"打拚"多少人写成"打拼","消费券"多少人写成"消费卷"。 03/15 13:42
99F:→ zxvc:对於原问题,我没有特别支持谁的说法,只是想知道这样讨论有 03/15 13:45
100F:→ zxvc:没有特殊的意义。 03/15 13:46
101F:推 PRAM:口口声声靠北靠北 你说话也有点口德 03/15 18:51
102F:→ PRAM:说起来你也是写不出 c++ 的 linux kernel 吧 :D 03/15 18:51
103F:推 PRAM:就算 linus 再怎麽大脑发烫,你又能怎麽样? 如果你可以用 c++ 03/15 18:57
104F:→ PRAM:写出个 linux kernel,你就可以说他的话是屁话。可惜你写不出 03/15 18:57
105F:→ PRAM:来,光会讲一堆故事有什麽用?这世界不缺会说故事的小咖 :D 03/15 18:57
106F:→ PRAM:你光会靠北 linus 头发烫是没用的 03/15 18:58
107F:推 zerodevil:前面那串一些用c++写的kernel楼上都当没看到就是了= = 03/15 19:04
108F:推 zerodevil:都过多久了还在战os 太闲了是不是 03/15 19:06
109F:推 PRAM:我是说这位 yoco315 要能用c++写linux kernel ,才有资格说 03/15 19:26
110F:→ PRAM:linus 脑发烫,光会说故事是没屁用的 :D 03/15 19:26
111F:→ PRAM:星期天闲着也是闲着,楼上的不也是很闲吗 呵 03/15 19:26
112F:推 kaomark:"C++写linux kernel"跟"C与C++间的历史" 有啥关连啊? 03/15 19:33
113F:推 asoedarren:直接放大绝 善哉善哉... 03/15 19:35
114F:推 zerodevil:"会xxx才有资格批评ooo" 真好用的大绝.. 03/15 19:45
115F:推 littleshan:yoco,我有点懒了,可以不吐他槽吗? 03/15 19:46
116F:推 wowtiger:真正的大绝是 会写 C++ Compiler 才有资格批评 C++ 吧 03/15 21:17
117F:→ yoco315:我已经很有口德了 ._.a 因为是在这个版, 我收敛很多了 03/16 00:37
118F:推 discipile:可谓何到现在工程上的程式设计大多用C,而不用C++呢? 03/24 02:24
119F:推 ImOnLine:我总觉得看书就像瞎子摸象一样的。你看什麽书就被作者 04/13 15:50
120F:→ ImOnLine:引导,甚至可能被作者的错误观念骗。 04/13 15:52
121F:→ ImOnLine:尤其是历史这种东西,毕竟我们都是从书上得知c++的发展的 04/13 15:53
122F:→ ImOnLine:谁知c++是否真的不是从c extend出来的,就算是获不是又如 04/13 15:54
123F:→ ImOnLine:何?能改变我的生活吗? 04/13 15:54
124F:→ ImOnLine:而我看得c++书都说c++早期叫"c with classes",就是扩展 04/13 15:56
125F:→ ImOnLine:C的意思。至於classes的观念从何语言来,也许是从您说的 04/13 15:57
126F:→ ImOnLine:Simula与Algol但,确实是将c语言扩展,这应该没人会反对 04/13 15:58
127F:推 ImOnLine:从我看书得知,c++就是扩展c,至於您因为书上某句话而 04/13 16:02
128F:→ ImOnLine:认为c++并非扩充c。也许是彼此对书的字句解读的问题吧 04/13 16:03
129F:→ ImOnLine:从我看书得知,我还是认为c++是扩展c的。 04/13 16:04
130F:→ tinlans:楼上不要猜了,The Design and Evolution of C++ 弄来看吧 06/29 22:39
131F:推 o07608:朝圣这篇,这为啥会扔到轻松一下区阿...... 03/23 21:21