免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 19620 | 回复: 71
打印 上一主题 下一主题

C++ 这孩子 是不是误入歧途了? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-11-29 16:32 |只看该作者 |倒序浏览
好久不发帖, 给各位新老朋友打个招呼先

c++ 11 的发布,加入了一坨新功能,越来越难掌握了,大家觉得前景如何?
还有,目前GCC 能够支持多少 C++ 11 的新特征?

恭请 ownwaterloop 老弟来吐槽!

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
2 [报告]
发表于 2011-11-29 16:46 |只看该作者
你觉得哪个特性是没必要加入的?

论坛徽章:
0
3 [报告]
发表于 2011-11-29 17:38 |只看该作者
不一定要用,但学习总没错的

论坛徽章:
0
4 [报告]
发表于 2011-11-29 18:34 |只看该作者
c++ out

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
5 [报告]
发表于 2011-11-29 19:58 |只看该作者
本帖最后由 OwnWaterloo 于 2011-11-29 20:05 编辑

回复 1# windyrobin

这贴应该是网络问题……  不是重复发帖,而是只有一半内容是什么原因……
完整的见下一楼……



------ ------ 分割线 ------ ------

好嘛……  又被人想念了……


>> 还有,目前GCC 能够支持多少 C++ 11 的新特征?
其实我也没怎么关注……
对C++11编译器进展,论坛里的"幻の上帝"比较关注,他可是有gcc4.7在玩呢……

给两个链接
http://wiki.apache.org/stdcxx/C++0xCompilerSupport
http://gcc.gnu.org/projects/cxx0x.html


>> c++ 11 的发布,加入了一坨新功能,越来越难掌握了
关于一坨新功能越来越难掌握……

我的感觉(应该也是真正的C++程序员的感觉)是期待这些功能N久了……
并不是单纯的在被动接受这些知识。
而是在C++03中发现许多地方

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
6 [报告]
发表于 2011-11-29 20:03 |只看该作者
回复 1# windyrobin

回复 1# windyrobin

好嘛……  又被人想念了……


>> 还有,目前GCC 能够支持多少 C++ 11 的新特征?
其实我也没怎么关注……
对C++11编译器进展,论坛里的"幻の上帝"比较关注,他可是有gcc4.7在玩呢……

给两个链接
http://wiki.apache.org/stdcxx/C++0xCompilerSupport
http://gcc.gnu.org/projects/cxx0x.html


>> c++ 11 的发布,加入了一坨新功能,越来越难掌握了
关于一坨新功能越来越难掌握……

我的感觉(应该也是真正的C++程序员的感觉)是期待这些功能N久了……
并不是单纯的在被动接受这些知识。
而是在C++03中发现许多地方因为功能还不够强大,导致代码写起来很操蛋。
在这个过程中,对这些操蛋的地方应该怎样改进已经有了一些想法,只是等着标准最终敲定一个方案以及编译器实现而已。
你说的那一坨功能中的大部分, 我真的要学也就几分钟的时间搞定。
这些功能大致轮廓早在心里有数, 需要学的就只是一些细节上标准到底是如何规定的而已。


>> 大家觉得前景如何?
关于前景……  我觉得不怎么样, 估计会越来越小众。

首先, 程序员肯定是需要通过编程解决一些问题的。

其次, 解决问题可以有很多方法。
一些程序员止步于找到一种方法; 而另一些程序员除了解决特定问题外还对解决该问题的其他可能与不可能的方法感兴趣。

比如, 我记得以前与你讨论过一个如何在程序中嵌入一段html的问题?
我给出的方法是用 objcopy 将 html 做成一个 object 文件, 暴露 xxx_begin, xxx_end 符号, 然后与其他 object 链接。
你给出的方法是写一个c程序, 该程序将一个文件的内容(比如 "123" ) 转换为一个c文件:
char content[] = { 0x31, 0x32, 0x33 };
size_t length = 3;
我觉得你的方法在绝大多数情况下更好。
那个c程序很容易写, 将它作为工程的一部分即可, 这样不需要依赖objcopy这东西, 不需要依赖 object 文件格式 —— 转为c代码, 让编译器操心去。

但在其他一些语言中, 这是语言的功能之一, 而不是什么trick 。
(set 'content (eval-when-compile (read-file "content.html")))
比如这篇文章: 《让 lua 编译时计算》  http://blog.codingnow.com/2008/0 ... ulation_in_lua.html
评论里就有人吐槽了
原来 lua 里这些都算是奇技淫巧啊?Common Lisp 廿年前就有宏了,其中一种用途就是编译期计算,详见 Pual Graham 《On Lisp》的第 13 章。


C++, 以及基本上所有语言(肯定也包括C) 都在往"提供更好的解决问题的机制" 上努力。
只是,如上面所说, 一些程序员只想解决特定问题而已, 他们不关心这个。 比如上面那个 html 的问题, 也可以这样:
char content[] = "<p>hello world</p>";
肯定有部分程序员对这个方案感到满意, 甚至对更复杂的文档也会这样手工地 copy paste, 手工地将 " 修改为 \" 。


而我觉得C++11努力的方向肯定是没错的。
只是因为一些历史原因(比如要源代码兼容C)增加了不必要的复杂性。
比如 http://en.wikipedia.org/wiki/C%2 ... ive_function_syntax
如果是一门新的语言, 就仅仅需要一种function syntax, 即新引入的那种就行了。

但新设计一门语言在实践上有很多问题。
幻の上帝就认为发明一门新的语言解决C++的这些种种问题不难, 但要达到可靠的质量, 需要太多的精力。


最后, 为什么说了这么多, 却不看好前景。
上面是从语言/理论的角度,  而从程序员/实践的角度来说, 记得以前论坛里某位同学提到了一个词, 叫做"工业强度" 还是什么来着。
简单直白的说就是, 语言功能强大的同时肯定会更复杂, 即使新设计语言也是如此; 而复杂就会带来一个问题: 找不到足够多的合格的程序员

如果只从语言设计方面来说, JS是一门糟糕到不行的语言, sgml/html/xml 更是 lisp 的逆发明
但为什么它们这么流行? 甚至JS还要搞什么 server side?
因为公司招js/html 的程序员比招 lisp 程序员容易太多太多……
公司当然不希望自己由一小部分程序员说了算, 当然希望程序员是可替换的零件:等着上岗的多着呢,你还敢对自己的待遇不满意吗?

综上, 所以我估计C++的应用范围会越来越小众 —— 对大多数人而言, 这就是前景不好的意思。
我自己到觉得没什么, 流行没好货, 小众就小众, 走自己的路, 让他人sb去好了。

论坛徽章:
0
7 [报告]
发表于 2011-11-29 21:15 |只看该作者
老弟记性真好...


你说的 “工业强度” ,不知是否是曹力的这篇文章 http://shiningray.cn/node-js-coroutine.html
的确,单纯从语言特征上,我一直都认为lua 比 js 更适合做后端开发的,但我却不看好lua 在后端的市场
而且我现在在nodejs 颇有点小造诣...

的确,c++ 03 是在太老了,很多大中型的c++ 项目,往往都会实现自己的 模板库/基础库,如 webkit /chromium  

所以,我认同这一点,即C++ 11 的很多特征是众人期待已久的,
C++ 会变得越来越小众也是毋庸置疑的事实...

论坛徽章:
0
8 [报告]
发表于 2011-11-29 21:24 |只看该作者
C++变得小众说明了C++用的人越来越少了?

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
9 [报告]
发表于 2011-11-29 23:16 |只看该作者
回复 7# windyrobin

应该是我记错了, 不是从论坛而是从这篇文章听到的这个词。
这个人我不了解……  但他的blog我是有订的, 只是他越来越多的文章都是关于js了……



我也只是从语言角度上批评js很烂。
烂不等于不能解决问题, 比如C的声明也很烂……

甚至烂语言对某些问题解决起来还很顺……
比如我有两个wav, 怀疑它们是从同一个wav上截取的, 但时间差了一点, 想找出重叠部分。
最初想法是将每个simple读取出来, 之后就全是熟悉的工具: base64转换为text 然后 diff 比较, 可行!
然后感觉自己研究wav格式麻烦, 就在python里找了找, 结果 wav 读取, base64, diff, 最后计算md5 在标准库里全都有……
于是几行代码就搞定了……  如果用C/C++ ……  哼哼…… 大家都懂的……



然而一旦脱离定位, 比如python的"胶水", 那就有可能写得让人两眼泪汪汪……
比如js

  1. function counter(start) {
  2.   return function() { start = start+1; return start; };
  3. }
复制代码
而python里面想要兼容性好 —— 即,不支持nonlocal的python版本里

  1. def counter(start) :
  2.   container = [start]
  3.   def inc() :
  4.     container[0] = container[0]+1
  5.     return container[0]
  6.   return inc
复制代码
python丰富的标准库(相比lua一个光杆)让人口水直流, 但上面的代码真的让人欲哭无泪……



再说 lua vs js。 我说js烂就是拿lua作对比的。
比如它们都有同一的数据结构: table。 哦, js称之为 "object" 。
其实叫个什么都无所谓, 关键是一旦叫object, 就容易陷入岐途。

一个岐途就是将某个参数, this, 当作隐式参数, 并十分特殊的处理, 于是js里面有4种函数调用方式C++都不敢这么复杂啊……
普通调用: f(args...) 给this传入啥? global还是window来着?
方法调用: x.f(args...) 传入x
间接调用: x.f.call(y,args...) 传入y
创建调用: new f(args...)  这个与那个所谓的 prototype(又是一个烂货) 有关了

每次我遇到写js的人都会问一个问题……
Array.prototype.indexOf.call(n.parent.childNodes,n);
语言本身能不能提供一种不那么坑爹的写法?
而且indexOf还不是所有浏览器支持, 即使支持了n.parent.childNodes还是一个hosted object, 还不一定有效, 实际情况就是ff与chrome都没效……
就这水平也好意思说自己functional吗?

lua有且只有一种函数调用。 f(args...)。
如果需要像js那样将一个table塞满一堆函数, 也可以 x.f(args...)。
如果这些函数又恰好以该table为第1个参数, x.f(x,args...) 或者等效的 x:f(args...)。


t["x"] 与 t.x 等效, 这是js于lua另一个很类似的地方。
但将t称为object而不是table, 将x称为property而不是key会陷入的另一个岐途就是这table只能以string作key。。。
a[0] = 12;
a["0"] = 26;
alert(a[0]); // a[0] 被改了……


还有 function scope... scope这种重要但确实是非常基础的东西, 居然是评价一个人js水平的关键(一个stackoverflow的帖子这么说的)……
居然将变量设计为function scope, 这不诚心让程序员写bug代码吗?  设计者以及ECMA那些家伙, 长的是猪脑袋啊?



最后, 那篇文章还提到coroutine ……  好嘛, 又是一个槽点……
那篇文章我没仔细看, 而且他也不是详细介绍coroutine的。  我看的是一个老外的一篇, 以及firefox的什么什么链接。
js, ecmascript 1.7 提供的那个东西是类似python那样的generator; 算不上coroutine, 差远了。

问题出在将含有yield的函数f, 嵌入到另一个函数g中时的行为。
js1.7确切情况我不知道, 曹那篇文章也没有写。 但如果老外那篇文章以及ff非虚, g中对f的调用就会产生一个generator, 然后丢弃
yield 只能传递仅仅一层, 只能当作geneator 用。

而lua提供的coroutine是真正的协作线程。
t = coroutine.create(f) -- 创建一个协作线程
r = coroutine.resume(t, args...) -- 首次调用为该线程传递启动参数
f的调用会产生一个调用链, 如果这个调用链上存在yield, r 就会得到 yield的值, 而下次 resume就会给yield处提供一个值, 并继续执行。
直到f调用产生的整个调用链都没有 yield, r 就是 f 的返回值, 相当于 r = f(args...)

python设计成这样我表示理解, 因为python的yield本来就是从geneator演化来的:
手动实现一个class, 有next方法, 会抛出 StopIteration异常。。。 就可以用作 for i in g :
然后提供yield语句(之后才改为表达式), 可以更方便的实现这样的class。
然后提供next, 让外部可以给yield传递信息。
但没办法继续改了, 因为创建协作线程与resume是隐式且不可分的, f()。

python是一种自下而上: 我需要for i in g: , 我需要这个 g写起来容易, 我需要给geneator传递信息 。。。
而lua是自上而下的, 我需要coroutine, 然后python那些乱七八糟的全都有了, python没有的也有了。

但有了python与lua作为前车之鉴, js还选择generator就不可理解了……
老外那篇文章提到了这3种语言, 最后表示: js里应该提供geneator而不是coroutine。
而理由大致就类似于: 我们需要计算的数目小, 所以应该使用罗马数字。



综上, 都可以说明我前面提到的, 流行没好货, 越是参与的人多, 越是不能集思广益, 越是会将平均智商扯低……
C++沦为小众语言其实是它脱离流俗的标志

论坛徽章:
0
10 [报告]
发表于 2011-11-29 23:33 |只看该作者
回复 9# OwnWaterloo


    滑姐——我准备在之前那一楼拜一拜你的,结果被其他事情打断了,也就算了——现在,我准备拜你为滑铁卢大神,你就是俺心中的神啊。

本人观点:只要C++还兼容C,那就绝对不会衰落,因为来喷C++的多半都会C++,而且多半都是、或者曾经是、或者将来也可能还是C++的用户。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP