对C++语言的功能取舍的一点想法

jiandingzhe 2014-05-18 07:16:52
C++的一个基本设计,就是在引入高级抽象的同时,尽量在编译期把东西定下来,运行的时候不带任何代价裸奔。所以C++默认不开RTTI,也没有反射机制。
我做了一些玩意之后,感觉这个设计有点不上不下:复杂的项目,几乎肯定需要信号回调、反射、类型识别这些东西。而简单到不需要前述设施的项目,其实用struct裸奔也差不多能搞定。
看Qt架构和Gobject架构,都做出了大量语言扩展:Qt自己定义了关键字,仍然采用C++语言,然后用代码生成器产生实际编译的C++代码。Gtk用一堆恶心的宏做到了类似的事情。前些年估计是受不了恶心了,也搞了个vala,从自定的vala语言生成C代码。
所以,C++和C从功能角度上讲,(不考虑用户粘性)应当重新划分成两个新语言:一个是有模板的C,另一个是有类型meta、信号回调、引用计数的高级语言。
...全文
690 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
原点丹枫 2014-05-22
  • 打赏
  • 举报
回复
用java呗
康斯坦汀 2014-05-22
  • 打赏
  • 举报
回复
没有完美的编程语言,至少现在没有。
unituniverse2 2014-05-22
  • 打赏
  • 举报
回复
C#没有指针、也不支持 点号运算符 的重载
unituniverse2 2014-05-22
  • 打赏
  • 举报
回复
引用 32 楼 zhangwuji154 的回复:
既然楼主聊到取舍,我就说一点吧.之前一个C#程序员跟我说过,C++有一点很烦,比如调用类成员函数: 一般的,用. 指针用-> 静态函数,用:: 指针不谈,就说静态的,别的语言也是用 . 就让编译器去识别呗,不用程序员去关心.我觉得好像说得有些道理.
这方案在涉及到了运算符重载后行不通,C#没有指针、也不支持重载运算符重载。->操作符在C++里面支持重载而.操作符则不支持 各种智能指针里面有一堆这样的东西。
翅膀又硬了 2014-05-21
  • 打赏
  • 举报
回复
不明觉厉......
zhangwuji154 2014-05-21
  • 打赏
  • 举报
回复
既然楼主聊到取舍,我就说一点吧.之前一个C#程序员跟我说过,C++有一点很烦,比如调用类成员函数: 一般的,用. 指针用-> 静态函数,用:: 指针不谈,就说静态的,别的语言也是用 . 就让编译器去识别呗,不用程序员去关心.我觉得好像说得有些道理.
zhangwuji154 2014-05-21
  • 打赏
  • 举报
回复
引用 15 楼 supermegaboy 的回复:
[quote=引用 10 楼 zhangwuji154 的回复:] 最近想用到类似typeof()的函数,确实不能判断类型有点麻烦啊.
c++11已经有decltype了。[/quote] 高
shiter 2014-05-20
  • 打赏
  • 举报
回复
上代码!!!!哈哈哈
jiandingzhe 2014-05-20
  • 打赏
  • 举报
回复
引用 23 楼 yihengwang 的回复:
C++的复杂性让人心生畏惧,但其发展成今天的复杂肯定有原因与需求的
我的观点是它不够复杂。
FrankHB1989 2014-05-20
  • 打赏
  • 举报
回复
嘛,C++模板当然不全是参数化类型,也有关于类型推断(比起Haskell还是太水了)以及非类型参数结合起来的重写系统(比起Lisp宏还是水货)。虽然综合起来可用性不弱(比其它C-like的都强),但是用到啥就觉得啥鸡肋的体验实在太不爽了。 鸡肋倒也罢了,最大的不爽还是冗余。显式类型导致冗余被类型推断和C++11的auto/decltype解决了一部分,用起来还是各种坑(auto基于模板推导规则,decltype因为类型系统包括value category的麻烦有自己的特殊规则)。另外明明表示“我想要一个不可变的int”这一个基本的idea,就因为大部分用户都稀里糊涂的phase不同(通俗点说就是编译时v.运行时),我就可能得人肉改写成至少两种写法(应该选择哪种写法这种事情本来编译器应该知道得更清楚),比如: const int i = 42; typedef std::integral_constant<int, 42> i; 最麻烦的是这两者之间没法完全互相替代。C++11有了constepxr也只是好了一点,对实现的限制太弱了,而且现有的实现还是存在。 还有就是不限于C++,所有静态类型语言都可以存在的问题:不恰当地使用显式类型。合理auto/decltype以及其它一些语言的var本来是好事,偏偏某些死脑筋就是不开窍,无谓增加重构工作量。如果只说不必要还可以忍的话,使用错误就是纯属添乱了。我是不能理解扔掉无符号数的Java偏执狂是怎么想的——但是在能用size_t静态验证的地方非要用int让用户多事是什么情况?能用引用的非得用指针的是什么情况?就C艹的ABI来说这就是坨杯具,一旦公开的接口做错就用户就没法在下游修改了最多只能另外包一层(过程间优化可能有另一坨杯具)。还有不懂异常哪里不能用懂不懂就污染结果值域之类的奇葩……总之抵制蠢货的成本太大了。
FrankHB1989 2014-05-20
  • 打赏
  • 举报
回复
C++最要命的问题,如果不算ABI兼容性(这个严格来说是实现问题C++也管不着),就是基本设计过于复杂(根本原因之一是兼容C,顺便继承了C的一些垃圾设计),无论如何标准化都难以去除导致未来会越来越复杂,BS想要的teachability最后会变成空话。 类型系统整体冗余严重。参数化类型(模板)并不被作为类型对待而具有大量特殊规则。部分兼容B和C的值类别(value category)和引用类型功能部分重复,两边都有一堆特殊规则。函数类型鸡肋。尽管去除了C的compatible type,兼容C的内建标准转换导致类型分派无谓复杂。综合来说的效果嘛……除了一堆自以为是的小白,看看Clause 13搞了多少conversion category吧。虽然concept差不多是非加不可了,以后搞不好会更乱。 部分兼容C(虽说如此,wording上完全搞了另一套)的基本类型抽象混乱,语义上一点都不基本。需要二进制兼容的时候一样还得指望实现封装。 语法混乱,看起来BS还是谁一开始就没当回事。C的语法本来就不是context free的还有中缀声明符(和抽象声明符部分重复)之类的渣,C++为了兼容C也没敢扔掉。C++11还是加了考虑了几十年的-> notation,但是旧的不去,结果就是两种都有,更乱。加上<>于是更是著名奇葩了。当然,C已经够麻烦了——就算混乱程度只是跟C一样也没法指望什么同像性。这些理由导致静态元编程的本质上复杂性。就算不考虑整体上、理论上的麻烦,实际上也有一些大概能独立C的原创垃圾,比如new,以及placement new和显式析构调用不对应的反直觉设计。 ……垃圾之处太多了,一坨屎嘛。按下不表。只是比起其它大部分语言(和实现)把屎弄得到处乱飞来说相对容易接受。
mujiok2003 2014-05-20
  • 打赏
  • 举报
回复
性能和抽象能力始终是C++的追求。
FrankHB1989 2014-05-20
  • 打赏
  • 举报
回复
谁告诉你C++“默认不开RTTI”的。就是freestanding implementation都得支持RTTI。别把一些半吊子实现当语言要求。 运行时类型识别早就内建了,在此基础上实现运行时反射没多少难度,问题是接口统一性特别是ABI的问题,根本没办法改嘛。 编译时反射WG21有一个SG在研究。不过C艹本来就挺乱的,需求得过滤一下,也别指望近期有多少进展。 信号回调、引用计数之类用库实现起来明显比语言实现优越得多。现代C++完全没有像Qt这样定义关键字的必要。
乐百川 2014-05-19
  • 打赏
  • 举报
回复
我觉得C++挺好的呀,除了多继承和多态性不太会用以外…… 我正看得一本讲提高C++效率的书上面说有时候为了提高性能需要对这些东西取舍,我表示很蛋疼……
飞天御剑流 2014-05-19
  • 打赏
  • 举报
回复
引用 10 楼 zhangwuji154 的回复:
最近想用到类似typeof()的函数,确实不能判断类型有点麻烦啊.
c++11已经有decltype了。
飞天御剑流 2014-05-19
  • 打赏
  • 举报
回复
引用 4 楼 unituniverse2 的回复:
我觉得编译期间查错防错能力才是C++需要重点改进的地方(几乎所有的“高手”,包括制定标准的人都一直试图回避这个问题),可以说现今1/3的问题都与此有关,很多人、公司回避用C++也与此有关。 我觉得重点根本不在于对C++了解度的问题,要知道写某份代码的人和看代码的人感觉是不一样的,你不可能要求看的人完全顺应作者的想法,而结果是只要有一丁点偏差,可能就会导致各种错误。C++的理念本身都有些自相矛盾,加入很多特性的目的是为了便于封装和隐藏细节,可是另一方面如果人们真的对实现细节不甚了解,很可能写出的东西根本无法正常工作(而换做是其他语言的话,仅仅是效率低下之类的问题)。很多东西都可以改进,只要保证几个大原则不变就可以了。
想通了为什么assert只存在于debug,为什么在release中要去掉,就想通了这个问题。
赵4老师 2014-05-19
  • 打赏
  • 举报
回复
面向对象只是一种编程思想。 再抽象的编程语言,最后不都变成汇编代码了吗?我们完全可以说汇编语言是面向对象、脚本化、动态化、泛函化、并行化、分布化的语言。
赵4老师 2014-05-19
  • 打赏
  • 举报
回复
做个可能不太恰当的比喻: 人想让狗帮忙逮只兔子,可是人说话狗听不懂,于是人发明了一种介乎人言和狗语之间的语言,即口令。 人想让电脑帮忙做计算,可是人话电脑听不懂,于是人发明了一种介乎人言和汇编机器码之间的语言,即C语言。 人对狗的口令得让人容易学、也得让狗容易懂。 C语言同样得让人容易学、也得让电脑容易懂。 相比之下C++、Java就是人学得费劲、电脑也经常闹不懂。
zhangwuji154 2014-05-19
  • 打赏
  • 举报
回复
引用 9 楼 unituniverse2 的回复:
[quote=引用 8 楼 buyong 的回复:] 真用了C#和java的人,在做某些项目,某些需求,某些算法时,是不是也在想指针?
习惯了没有就会觉得是多余的东西[/quote] java最不爽是太占内存,开俩eclipse就卡得不行了.
zhangwuji154 2014-05-19
  • 打赏
  • 举报
回复
最近想用到类似typeof()的函数,确实不能判断类型有点麻烦啊.
加载更多回复(17)

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧