【转载】游戏并发编程的讨论 & Nodejs并发性讨论 & 语法糖术语

知乎上这篇文章对于游戏后端、性能并发、nodejs及scala等语言的讨论,很好,值得好好看。

https://www.zhihu.com/question/21971645

经常了解一些牛逼技术人员的分享,比闭门造车或者停留在陈旧技术固步自封,要好多了。

下面是一些摘录:

用C++开发,1000并发是基本。
C++的优点是与硬件近,所以处理图形时速度快很多,
如果是处理业务,其实主要是看选用的算法的时间复杂度。

各语言之间的执行效率差别没那么大,同样用过C++跟JAVA,相比较的话JAVA的学习曲线更低,开发效率更高,更推荐用JAVA来做服务器。
当然其它语言像GO,ERLANG,PHP做服务器的也蛮多的。
因为让OS处理程序逻辑切换得反复陷入内核,有的人觉得这样太慢,做了一些处于user space的线程,进程内自己控制多个逻辑流。
因为语言描述能力的限制,在C/C++上面写还有用这种东西都太麻烦。于是产生了erlang, go, lua里面的coroutine语法糖。
注意这一点,每次我会运行一个任务,直到它完成或者是发生i\o调用都不会主动切换至其他的程序流。
那么如果这一个任务里面涉及过于大量的计算,那么整个地图进程都会被block在这里。 而正因为node.js是异步的,所以需要不断的写回调监听i\o完成的信号。单个任务的逻辑流会多次的被打断。
当任务变得相当复杂的时候,即有所谓的callbak hell,会带给调试开发非常大的麻烦。
1. 异步
你提到scala,nodejs,它们的开发模式是异步的。c++也可以写成异步的,近三年内,我写了不下20w行,超过50个c++做的异步服务器,其中还包括存储。
你的取舍应该是你的团队和项目复杂度,在使用c++之后,还能否快速迭代。如果复杂度太高,我也建议使用go语言 2. 还是异步 nodejs是函数式的异步,协程是同步的代码,执行流程却是异步的。go和lua,erlang都是原生支持它,c++也可以,还是团队能力和复杂度的取舍。
go也是系统级的语言,能和c代码互调,能力区间很大 3. 性能取舍 scala是跑在jvm上面的,性能你懂。nodejs是js代码,运行之前先编译,性能会比前者好一些,使用体验来看,性能和c++还是有距离。
一些它没提供接口的系统能力,你就用不到了,束手束脚。c++啥都能做,就是复杂些。 就你提到的两个c++的复杂的地方,nodejs和scala上也不见得简单。有朋友写了一个nodejs svr,有内存占用的问题,相当于内存泄漏,只能定时重启解决。
对象的生命周期问题,不是高手,也搞不定 4. 还是性能取舍 c++是快。但是国内的绝大多数程序员写的程序慢,更多的,是自己糟糕的code能力搞出来的。使用c++语言,高手换java做同样的事情也能比它快很多。
所以,核心问题还是你们开发团队的人,他们的团队合作以及单兵作战的能力。
论个人实力,国内的程序员,能赶上google平均水平的非常少,思考问题的方式,自然要作调整。要更关注团队本身在语言上的适应度,而不是只论语言本身能否做某件事情。

语法糖:

语法糖(Syntactic sugar),也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。

举个例子:在C语言里用a[i]表示*(a+i),用a[i][j]表示*(*(a+i*数组a第二维的长度)+j),由此可见语法糖不是“现代语言”独有,这种写法简洁明了,容易被人理解。

比如Erlang, Go, Lua里面的Coroutine。