如何看待 Dropbox 从 Go 转向 rust vs go

专访Elton:浅谈C++、Go的挑战者Rust
发表于 17:50|
作者钱曙光
摘要:系统级编程语言Rust 1.0发布之后,风起云涌,其和C++、Go的讨论风波从未停止,随之也有一大波人对Rust产生了极大的兴趣,CSDN为此采访了微信游戏开发组工程师、Rust资深使用者Elton,来深入探讨Rust。
钟宇腾(Elton,、),香港大学计算机系毕业,微信游戏开发组工程师。
CSDN:首先介绍下你自己及目前所从事的工作。
Elton:我是香港大学计算机系研究生毕业,本科在中山大学计算机系。目前正在微信游戏工作,岗位是后台开发。
我接触计算机也算是比较早的,记得当时家里的电脑跑的是DOS,我经常看着老爸在电脑里敲着各种命令,然后屏幕的字就刷刷刷出来,感觉非常好奇,现在想起来依然记得当初在电脑上敲下的第一个命令:dir,然后看着屏幕刷出来的白字。虽然一点都看不懂那是什么意思,但觉得非常好玩。
快升初中的时候,老爸给我买了一个在电脑上跑的学习软件,并要求我每天都要在上面去做题,于是当时就学会了怎么读软盘,然后在DOS上进入软盘然后执行那个软件,再换其它软盘来把题目读出来,再做。
初中的时候,家里的电脑由于被我自己弄坏了很多次,已经可以熟练安装Windows&98/2000/ME,在学校里面,也是经常到办公室帮老师重装系统。后来家里电脑再次升了个级,终于可以安装XP了,当时是自己到电脑城买的盗版光盘(当时并不知道这是盗版的),然后在家里装上,还能想起当时安装完XP进入界面后,一边感叹绚丽的界面,一边把各种功能都点了个遍。
最初接触编程也是在初中,当时学校要举办班级网页大赛,因为在老师那里名声在外,自然而然地代表班级参赛。下载了FrontPage和DreamWeaver,然后去书店买了两本书依葫芦画瓢,拖控件做出了个静态的网站。有时觉得直接拖不好看,于是就点进源代码去试,虽然不懂,但还是靠猜和无数的尝试,做出了自己满意的效果,在大赛中也获得不错的成绩(好像是第一名,但已经不记得了)。之后高中(同一个学校),又被拉去做班级网页大赛,这次就不光是做了个静态的,还在网上搜索到了不少的可以实现某些特殊效果的JavaScript或者是VBScript的脚本,虽然也是完全不懂,靠摸索修改各种参数,把它嵌入到自己的网站然后调试出自己想要的效果。记得当时为了这个网站,每天晚上自习回家,一直弄到12点之后,各种调试,乐在其中哈。
说说第一次接触Linux,那是高三的时候,一天一个同学跟我说,我在网上看到一个好漂亮的系统叫做Ubuntu,你要不要看一下?然后搜索发现了各种Ubuntu的漂亮的效果图,大多是Compiz弄出来的效果,然后很果断地,下载了Ubuntu&9.04的ISO,刻盘,安装,一气呵成。但是问题一下子就来了,想安装软件,完全不会!搜索只看到Ubuntu&Forum,进去发现很多人都在讲,在终端里输入&./configure,&make,&sudo&make&install就可以啦,然后我花了一个星期,才搞明白,终端原来是那个在菜单里找到的叫终端的一个软件(Gnome&2),然后再花了一个星期通过搜索搞明白了什么叫目录结构,学会了少数几个shell命令,终于从终端进入到了那个文件夹,然后输入了那三板斧。之后的一个月,就是一直利用搜索引擎解决各种遇到的问题,终于把那个软件装了上去,成功入门。
之后到了大学,如愿上了计算机系,系统地学习了各种计算机领域的知识。
CSDN:你的&Rust&之路是怎样的?
Elton:认识Rust是在大三的时候,我在网上(不记得是哪里了)有介绍Rust这一门新的编程语言,然后好奇就点进去官网看,当时版本好像是0.9dev吧,语法和现在可差远了。进Documentation读了两章发现这语言的设计有意思啊,指针虽然分了非常多种,还有个神奇的Lifetime的概念,认真读下来感觉和写C++程序的时候差不多,只不过这门语言想要在编译期就检测出大多数的错误,很有趣。于是向一个小伙伴介绍了这门语言,让他和我一起学习。学完基础之后,我就想做一个小项目来更好的理解这门语言,就选了做一个INI库(rust-ini)。这是我的第一个Rust项目,之后每一次Rust语法更新,因为强迫症的原因,就被迫读更新日志,然后根据更新修改项目让它可以在新的编译器下编译。
之后第二个项目就是shadowsocks-rust,因为GoAgent越来越不好用了,用了一些日子的VPN,就萌生了想自己写一个VPN,然后搭在linode上。当时混V2EX发现很多人都在聊ShadowSocks,花了一天把源代码读了一遍,感觉非常好实现,花了一个星期做出了初版,之后也是跟着Rust的版本一起升级,经历过几次大的变动,代码混乱不堪,最近有点时间,顺便利用了一下coroutine-rs这个协程库,把它重构成协程版。
CSDN:你在&GitHub&上组织和带领了多个项目,能不能详细说下经过?其中有没有什么有趣的事情?
Elton:在Github上大多都是自己的个人项目,说到带领的话,coroutine-rs应该算是一个。当时在Rust中文社区的群里面,发现Young在研究libgreen(Rust早期0.12dev版本官方实现的一个协程库,后来已废弃),自己也在做相关的东西,两人一拍即合,合作做出了coroutine-rs。
rust-ini&是我学习Rust时做的第一个项目,经历过好多次的改版,最近的一次改版是为了试一下Rust标准库的Cow(Copy-on-write)库,把整个项目改了。
jsonrpc-rs&是最近和最初一起学习的那位小伙伴一起合作的项目,项目的主要原因是为了探索一种好的RPC库的设计。
bson-rs&项目实现了一个BSON库,这个纯粹就是因为无聊,然后看到了BSON的Specification,花了一天写出来的。现在有几个团队想用我这个库去实现MongoDB的Rust&driver。
simplesched&和&eventedco&是基于coroutine-rs实现的调度器(Scheduler),包含各种Non-blocking&I/O的支持。实际上我是想做成像Go那样的Work-stealing&Scheduler,但是因为做了一个月发现做出来效率很差,就先退而求其次,放出了两个不同思路的简单的版本。
memcached-rs&这个也是一个周末,看了Memcached的几个Client实现之后,心血来潮,花了几天时间实现了一个Client库,最近在计划用Rust克隆一个Memcached,为了学习Memcached的设计。
其它的项目跟Rust关系不大,都是一些个人的兴趣项目,其中小部分是在学校的课程项目。
CSDN:你是何时、如何成为微信团队的一员?其中面试过程,你有什么心得体会可分享?
Elton:去年10月的时候面试微信团队的。腾讯的面试相信大家在网上都能了解一二。面试内容无非一些基础的函数实现,还有操作系统相关的一些知识的题目,问到的知识我在学习的过程中都有深入了解过,因此面试非常顺利地就通过了。
CSDN:能否谈一下,你毕业时为何选择到腾讯工作?毕竟家里人想要迁居香港且希望你在香港工作。
Elton:我曾经想过在香港工作,也面试了一家创业公司,组长非常看好我,老板也给也给出了很不错的薪资。但考虑过后我还是放弃了,回到深圳腾讯。主要是感觉香港的IT业没有深圳繁荣,虽然有不少的创业公司,但我个人还是希望先到大公司积累经验,以后再考虑创业公司闯荡。
Rust需要一个大公司带头做出一个成功的产品作为案例
CSDN:Rust&是一种怎样的语言?相比竞争对手&C/C++&几何?各自的特点是什么?
Elton:Rust是一门系统编程语言,系统编程语言说明它有直接操作硬件的能力,就像C/C++一样,但是它还有一个重要的特性,那就是安全。在C/C++里面,很容易会因为内存管理的问题而出现Segmentation&Fault,在Rust中,由于引入了所有权(Ownership)和生存期(Lifetime)的概念,实现了自动内存管理的同时,还避免了各种内存错误。但同时,也提供unsafe块和祼指针(Raw&Pointer),提供更多的自由度。
在Rust中,还支持高阶函数(闭包,Closure),C++11&之后也提供了Lambda来支持闭包,但在C中还没有。
模式匹配(Pattern&Match)和ADT(Algebraic&Data&Type),在C/C++中都没有提供。模式匹配和ADT在许多函数式编程语言中都作为标准来提供了。有了ADT,可以把许多操作都统一起来,并且利用模式匹配可以很方便地把其中的数据取出来。
默认情况下不可变,这在C/C++中是完全相反。默认不可变更有利于编译器优化,而且不可变对于写并发程序有不少的好处。
CSDN:Rust&学习中新人要注意哪些问题?
Elton:新人刚接触Rust,特别是没有接触过函数式编程语言的新人,首先可能会被模式匹配、跟C/C++/Java等完全不同的枚举类型,还有各种指针类型难住。
其次,继续学习下去会发现Trait&based&OO跟以前接触的OO完全不同。
再之,深入学习的时候,对象所有权还有生存期的概念看起来完全不知道在讲什么。
最后,上手实践的时候:天哪,编译器我到底写错什么了啊!你好好说话啊!!
我就是一步步这样过来的,当时也没有接触过函数式编程语言,后来才学习了Haskell才深入理解了Rust中的ADT和模式匹配。对于平时习惯高级语言的新人,我建议在学习的时候,不要试图把Rust的一些概念直接套入到自己习惯的语言中去,因为那是肯定不可能的,而且还会影响你理解。对于语法上的不理解,建议使用play.rust-lang.org来学习,看完之后实际操作一下,在例子上做一些小修改尝试让它跑起来,不明白的地方找个人一起交流(现实中找一个小伙伴一起学习是最好的办法)。
在理解对象所有权及生存期的时候,文档读起来非常晦涩,可能会让人产生非常大的挫败感。其实,建议先从例子开始一步步理解:
所有权讲的是Ownership,思考一下当前对象的Owner是谁?如果用了Borrowed&Pointer,那它被借给了谁?是可变的还是不可变的?
如果代码中有显式的Lifetime,如下例子
fn test&'a&(s: &'a str) -& &'a str {
}当我这样调用函数时
let hello = "hello";
let hello2 = test(hello);'a&是多少?因为&"hello"&的类型是&&'static&str,所以生存期是&'static,把它代入到函数声明,就会发现,'a&就是&'static。绝大多数情况生存期都可以这样一步步的推导出来,并不难。
Rust编译器还嫩,许多错误提示还做不到很智能,因此错误会非常晦涩。遇到一直编译不过的问题,可以先弄一个Minimal&Test&Case,确定错误可以重现之后,把它拿出来一起讨论,Rust中文社区的群是一个非常好的交流地点,另一个就是Rust官方IRC,那上面几乎是有求必应。CSDN:Rust&中有哪些坑?
Elton:简单来说,有以下这些:
&Rust不支持默认参数,也不支持可变长的参数;Lifetime不要乱写,有时可能一时编译可以过,但在另外的地方使用的时候会出现各自神奇的错误,错误提示会一直都在调用的地方,因为编译器相信你写的Lifetime是对的,它从不怀疑;Rust没有属性继承,所以只能用组合的方式;&标准库和第三方库还需要完善。
CSDN:你是否有一个比较系统的Rust资料来分享给你有兴趣的开发者?
Elton:实际上,我自己用得最多的Rust资料就是官方文档。每一周看一下http://this-week-in-rust.org,看看官方最近有什么进展,有什么让人惊喜的改进,或者是好的新项目可以使用或参与。
CSDN:Rust&如何才能吸引开发者?最能吸引哪个群体?
Elton:Rust最吸引的开发者群体相信就是C/C++开发者,同样是关注性能的系统编程,C/C++群体想要转到Rust的难度应该是最小的。而且Rust解决了C++的不少弊端。Mike:Rust对动态语言界的吸引力如何?&(Mike,唐刚,妈咪问问CEO和Rust使用者)Elton:动态语言普遍都带GC,而且比较少关注系统编程以及内存管理,对于Rust的强制编译期检查所有权和生存期,在学习时有可能会遇到不小的挫败感。但动态语言在项目变大之后,会变得越来越难以维护,于是近年又开始从动态类型的语言向静态类型语言迁移,比较有代表性的就是Go、HHVM,Python&3.5的Type&Hints。Mike:那Rust和Go各自优缺点是怎样的?Rust是不是会盖过Go?Elton:网上对于Rust和Go到底是不是竞争者有不小的争论,我认为Rust和Go在大多数领域并不是竞争者。Go是为了方便开发高并发的服务器,而Rust的目标是系统编程,关注内存安全、并发安全等。从目前来看,很难说Rust会盖过Go,Rust没有Go那么易上手,复杂的类型系统、所有权还有生存期的概念会难住不少编程新手,但真正用熟悉之后会发现Rust用起来比Go舒服太多。Rust更多会吸引一些C/C++擅长的领域,比如游戏开发、嵌入式开发等。Mike:Rust在游戏领域有没作为?此外,Rust在教育培训方面有没机会? Elton:游戏开发主要关注性能,一直都是C++的固有领土。Rust目前刚推出,性能已经接近C/C++,已经有团队在着手实现,项目虽然还在早期,但已有不少成果。在University&of&Virginia,有位教授开了一门本科的操作系统课,,从这个网页可以看到学生的反馈,大多数学生还是比较喜欢使用Rust作为教学语言的。Young:讲讲trait&system如何解决现有开发中的痛处?(Young,吴畏远,UESTC学生,数据工程师,Rust使用者。)Elton:Trait实际上就是定义了一些方法,与Java的Interface的不同点就是,Trait可以给方法提供默认实现。这看起来并没有什么特别的,但是Trait带来了一个显而易见的好处:避免了多继承和方法命名冲突,不同的Trait可以有完全相同的方法签名,它们可以同时被同一个struct实现,例如trait Foo {
fn who(&self);
trait Bar {
fn who(&self);
impl Foo for Dummy {
fn who(&self) {
println!(“Dummy Foo”);
impl Bar for Dummy {
fn who(&self) {
println!(“Dummy Bar”);
}从上面例子可以看到,Dummy实现了Foo和Bar,而Foo和Bar有一个命名签名完全一样的方法fn&who(&self),那么调用的时候可以这样let dummy = D
Foo::who(&dummy); // 调用Foo::who
Bar::who(&dummy); // 调用Bar::who这种在Rust中叫作UFCS(UniversalFunctional&Call&Syntax)。配合泛型使用,Trait可以实现很多非常方便的功能。比如在Rust里面,就用Send这个类型来约束一个struct是否可以安全地传递到另一个线程,而Sync可以表示一个struct是否可以安全地在不同的线程之间共享。另外,借助impl,可以为已有的类型实现自定义的Trait,比如trait Foo {
fn hello(&self);
impl Foo for i32 {
fn hello(&self) {
println!(“Hello from {}”, self);
}于是就可以这样&1.hello()&调用,然后输出&“Hello&from&1”。随着互联网发展,开发主要目标渐渐转移到移动和web,那么Rust能否很方便的进军Android/iOS开发呢?在WebAssembly的地盘是否能从c++那分一杯羹呢?起码在Android上,使用JNI直接调用Rust交叉编译得到的动态链接库,那是肯定没有问题的,目前也已经有人在做:。对于iOS,有人还给出了教程:。但这些例子只说明了是可行的,但实用性如何,得真正应用到生产环境中才能知道。我个人不做客户端方面的东西,所以我就不知道了。CSDN:我们知道国内的Rust应用情况极差,你能谈谈原因是是什么吗?国外有哪些比较好的应用案例?
Elton:实际上,国外也不见得有什么好的案例,日前刚在IRC上看到有Dropbox的员工在问Rust相关的事情,可能是要在项目中使用。Rust的1.0在今年才出,很少会有公司愿意冒险去做第一个吃螃蟹的人。Go&1.0是2012年推出的,火也是近一两年的事情。简而言之,Rust需要一个大公司带头做出一个成功的产品作为案例。
CSDN:Rust能站住脚么?
对&Rust&未来发展你如何看?
Elton:对Rust语言的未来非常看好,除了因为它是业界大佬Mozilla出品,还因为它准确击中了C/C++程序员的痛点,可以完美实现底层操作的同时,在编译时实现内存管理和错误检查,程序运行性能还不错,非常接近C/C++。但Rust的生态系统还需要完善,若能有其它大公司的参与,相关的可以提高生产力的库才能够完善。CSDN:对于推广Rust语言有什么好的建议?Elton:在编程界,Talk&is&cheap,&show&me&the&code是不变的真理。要想推广Rust,最好的办法就是使用Rust做一些好的库或项目。就像Docker之于Go,Rust的重量级应用在哪里?Servo?爱折腾的Elton
CSDN:你目前认为自己牛的地方在哪里?
Elton:我不认为自己很牛,在知乎以及其它平台看到的牛人太多,我觉得自己需要学习的东西太多。我觉得我自己的一个特点就是爱动手,而且保持着对新事物的好奇心。
CSDN:除了&Rust&是业余爱好之外,在其他方面情况是?还喜欢折腾什么?
Elton:我还喜欢玩其它各种新的语言还有工具,比如最近站在风口上的Nim语言,还有其它Geek最喜欢玩的Linux、Vim配置,为了改一个配置坐在电脑前一整天到深夜是常有的事。空闲时还会在Github上看一些关注的人Star的项目,点进去读读源码,读到精妙的设计跟小伙伴们分享一下。CSDN:在技术人员/程序员的工作学习中,你是否有什么好的工具?有什么心得和体会可分享?
Elton:以下仅是个人的一点小心得:
政治不正确地讲,我觉得先要有一台MacBook。程序员的工作大多都对着代码,Retina屏幕对于显示文字方面实在是无可挑剔。&双显式器,像写Rust的时候经常要查文档,切窗口效率太低了。&趁手的编辑器。编辑器最主要的好处就是简单,写程序有时候根本不想关注各种的配置方面的东西,一时灵感来时,几乎没有延迟地打开,一气呵成地写完,编译通过,提交。我用的是Sublime Text。
CSDN:你认为新人在选择语言学习时应该注意什么?
Elton:如果是一个新人想要入门,那么建议选最容易学习的语言,比如Python/Ruby,因为新手在学习的过程中,尽量地减少去关注语言本身或实现相关的细节会更容易获得成就感,也容易引起新手学习的兴趣。在入门过后,如果是想深入学习,那么建议往C/C++方向走,有利于理解程序底层实现相关的内容,之后可以考虑学习一下函数式编程语言,如Haskell/Lisp/OCaml等,可以转变思维方式,防止思维定势,推荐《七周七语言》这本书,通常学习几门小众语言,了解一下各种不同的编程范式。但如果只是想赶紧投入到工作中,那么就简单了,工作要学哪个就哪个。相关阅读:极客头条Rust社区:为进一步给Rust爱好者提供沟通、交流的平台,我们建立了一个微信群,你可以直接向Elton提问,此外,我们也会邀请业内的Rust大牛进群,给大家带来更多干货。微信扫描下面的二维码即可加入:欢迎读者举荐或自荐Rust方面的专家和相关的应用实战案例,CSDN会提供采访和相关的分享平台,和你一同探索Rust的世界。(有意请联系)
推荐阅读相关主题:
CSDN官方微信
扫描二维码,向CSDN吐槽
微信号:CSDNnews
相关热门文章你似乎来到了没有知识存在的荒原...
来源链接是否正确?用户、话题或问题是否存在?为什么 Go 语言如此不受待见?
在 Quora 上,有个问题是比较 D/Rust/Go/Nim 等语言的表现,几乎一致地认为 Go 是最搓的,Rust 备受好评。各位看看何解?他们有一个观点,能够直接操作硬件的才被定义为系统级语言,而另外定义是适用于 web 后端或者分布式。Go 由于其 gc 而被直接否定。
按投票排序
都已经流行成这样了还不受待见啊……这东西就是一个工程工具,各种好用,但是从设计角度讲各种粗糙,没必要过度高估。
在一家省分行用go每天处理二千万条数据入数据仓库做数据分析,后台用oci连oracle,前台web只用了gorilla的mux库,三个月来系统很稳定,数据处理速度及报表交互速度很快。做过一个与核心对接的交易查询系统,使用cgo与核心中间件对接,也很稳定,数据库mysql。还用go做了一个预算管理、一个服务器资源监控系统和一个基于activity的workflow,做完的感觉就是我今后很长时间还是会用go。以前做项目用过java,Python。Java的缺点是语法太啰嗦,虚拟机还得调优。Python不能充分利用多核,部署也麻烦。golang优点很明显:语法像Python一样灵活优雅,后期运维部署简单方便到让我感动(经过python部署折磨后),没有泛型之类的语法我也基本把上述系统的业务逻辑都完成了,我不是个语言控,语言不必大而全,复杂了我也玩儿不转,也不需要语法糖对别人炫耀(时间长了我也看不懂),对于我来说就是把系统业务逻辑快速完成,开发部署越简单越好,系统一定要稳定。golang满足了我一切要求,真的有它就go了。
Rust 和 Nim 确实好呀Rust 可以说是 D 语言二代目, 没有 D 里的一些经验主义设计, 而且更函数式, 作为 a better C++ 当之无愧. Pattern matching, Block, Generic 这些东西, Go 有么? 不好的地方是集成 feature 略贪心, 指针那么多类型是有道理但是学习者容易被吓跑.Nim 不是函数式的, 但 Nim 支持卫生宏, 可以做 AST 重写, 可以自定编译规则, 是静态语言中的黑客语言有木有! 自定编译规则甚至可以编译出比 C 代码还快的结果, 作为 a better C 当之无愧. 人家 GC 可以手动步进的啊, 想要什么 feature 自己加(list comprehension? 没问题), 加个 const 就可以做编译期计算了(想想 C++ 和 D 里复杂难以掌握的 template 和 static if 多蛋疼), 改写 AST 的 pattern language 也是简单易懂(想想 Java 的 annotation processing tool 怎么用的就蛋碎...), 更重要的一点: 没有那么多哲学骑着你禁止你怎么怎么做, Go 能么?人类思维有个巨大的缺点就是从众定势, 当然社区大了开发者多了语言会更容易成熟和变得实用, 但如果更多人懂得多了解学习, 理性比较而不是跟风, 现在的编程语言可以发展得更好.
Go除了goroutine之外,其他基本所有的东西都在倒退,只是有一个牛逼的爹而已最简单一点,一个static language不支持范型闹哪样??语法上标新立异太多,丑的不能直视查查历史看看Go设计了多久,Rust设计了多久,这差距太大了对比看看Rust的feature set,以及精良程度,完爆Go几十条街不同意很多人说的,Java在刚刚出现的时候绝对是非常先进的,Go刚出现的时候就没什么了不起的我和公司里面一个用Go的team稍微合作过一下,其中一个工程师的感受就是,Go在代码重用,工具链方面非常差,各种interface{}到处飞,goroutine用起来经常要debug几千个routine跑来跑去也非常崩溃,但也没办法,我们都习惯了,这么多代码已经写了,最开始从ruby转型选择Go那个哥们儿已经走了,留下一堆烂摊子
退一万步来说呢,golang挫又如何呢?现在有了Docker,为golang大大的续命了一下。我们有客户想要在zlinux使用Docker,然后发现没有这个平台的go编译器,于是我们就要开始想办法做go编译器(客户就是上帝这句话不是随便说说的)。而我最近也在看go,觉得它更吸引Python和Ruby的人是有道理的,虽然go其实是想吸引C++。然而事实上,Rust或许会更吸引C++的开发者一些。决定一个语言的流行度(或者说火不火)也往往不是语言本身,而是其它的。如Objective-C,我一直觉得语法很丑,但是之前它就是iOS开发的官方语言,你想要开发iOS的APP,你就要用它,iOS火它就火。而如果有一天Rust可以火起来,我相信也不是因为语言本身,而是有一个让它火起来的东西(servo?)至于D语言,虽然它一出来就说我要干掉C,我要干掉C++,然而和众多号称要干掉C和C++的语言一样,都是欢声笑语中打出GG,一切归于云烟。
绝大多数人说一个语言好不好的标准是这个语言功能多不多。那些说go不好的人理由也无非是它这功能也没有那功能也没有。然而这软件产品做加法容易,做减法难,进一步说那些自以为是的要这要那的,还沾沾自喜的,随便看过一本谭浩强的人都可以说出不少来。这些人往往喜欢炫技,纠结于技术细节,对工程或产品角度的问题往往缺少足够的认识。
人家问的是 Systems languages,不是 Languages!先看看标题,不要一来就站立场。Go 不管人家设计的时候有没有这样的定位,反正现在社区是没有的。而 Rust 本身就是在这种定位下设计的,社区也很重视。你在知乎上问 Julia 和 PHP 哪个更适合科学计算,PHP 还不是会被一致否定?尽管大家都知道 PHP 是世界上最好的语言,这条公理,但仍然不影响在科学计算的语境下否定最好的语言。人家问题的语境下 Go 就纯属打酱油的,术业有专攻而已。看看人家的第一句话,重点就在于什么是系统编程语言:First of all, it depends on what you mean by systems language. Rob Pike et al. have repurposed the term to mean distributed or web backend systems. I prefer the
which refers to operating and controlling hardware.当然一个没有模式匹配,ADT,没有泛型和宏,靠 if err != nil 来进行错误处理的,新的静态类型语言我是不想碰的啦。
less is more是什么?初看之下less is more不科学:如果less is more是真的我们为什么不用brainfuck?为什么不用iota and jot?再想想,如果less is more是错的,为什么语言之间不做得越复杂越好?less is more跟[编程语言都是工具一样],是一句[对的,奈何大部分人都不理解正确含义,并且误用]的言论(编程语言都是工具留作练习,如果有人没懂问题在那评论区留言),我们可以从多个角度看这个问题0:我们为什么不用brainfuck?1:为什么没有语言以"我们library没几个"为卖点?2:less掉的东西都去那了?事实上,基本上所有语言设计师都明白less is more这个道理,只不过采用情况不同而已-君不见C++17就在弄removal of trigraph?纵使一个语言复杂,会对用户带来什么后果?如果设计得好的话,也就是说,在有consistency的情况下,没有。当一个语言设计得很好,有一致性(Haskell可以算),学语言特性就完全可以一步一步来,学习阶梯可以很平滑,在这种情况下,复杂了有什么影响?反之,如果一些特性去掉了,会有什么后果?很简单:用户一是用很丑很糟糕的workaround一是不用。我讲一个故事:A语言的设计师B一直认为自己用不着的某功能C没有存在的必要,与是他就刻意不加入A里面。过几天,他发现了自己很需要的功能D,E,F,都加进语言里面,然而他万万没想到,加了C,[D;E;F]都可以很简单的写作库,他更没想到的是,他另外写的一个程序G因为没有C,所以写起来很麻烦,看来又得加一个H了。。。那末问题来了,学PLT那家大学强?哦不对,是加入C,还是不加入C更less is more呢?为了让各位尽量没有主观色彩的看这个问题,我刚刚没说A~H是什么,现在开谜底:A是goB是Rob PikeC是user defined genericDEF是array,map,sliceG是H是mapH是map(对于像Rob Pike一样没懂那里不优雅的,见))预期内的counter argument:go不需要这个:那末array,map,slice为什么又要generic化呢?再说是一个几页纸定义的Hinder Miler Type System加上接近线性速度的推导算法简结优雅呢还是现在这些再加上以后可能再增加的很多个东西简洁优雅呢?再说,如何确定这不是(制造问题的思路并不能用来解决问题,因为根本发现不了问题所在并且认为一切好好的)?如果去问问任何一个Java程序员,有九成会回答generic有用,其他有generic的语言大多如此,为什么go不需要?对go的槽点有很多,其他的见另外一个问题:为什么语言都没有无限制的加入新特性?1:consistency保留困难:特性之间会有冲突2:实现困难3:拖低编译器解释器速度当然这三点在go上都不能作为借口:HM系统早就存在了几十年了,并且很多语言都用得好好的,再说W算法复杂度接近线性。
世界上只有两种编程语言:没人用的 和 被人喷的╮(╯▽╰)╭
很早以前写个 Android app 玩,被 Java 的语法恶心的一直希望 Google 能支持别的语言做 Android 开发。 现在 Go 决定要支持 Android 开发了,我觉得...如果再想写 Android 我还是老老实实用 Java 吧...
只有最适合自己项目的语言 没有最好的语言, 看来我二逼了。。。。选个芯片还得选型呢。。。虽然很多情况下芯片没得选 但没得选不是说明已经选型好了吗不知道争论这些有什么意义。就好比XP再不比win8好, 不是虚拟机上已经完美找到它生存的意义吗? 随便一个不兼容的软件 ,开个低资源占用的XP虚拟机,完美得很。。。哎
哪个语言是最好的语言这个梗什么时候才能变成 我这个项目最适合用哪种语言的讨论啊。。。。你们就选个最好的语言 写一个最完美的代码呗,看你项目死不死。。。大神太多
晚辈匿了。。
JAVA也一致被程序员认为是最搓的,LISP备受好评
编译器/工具链也学互联网行业跟风拿用户当测试,简直一点素质没有。
单从语法上评价一门语言是片面的,语法是其次的东西,生态才是重要的。有些语言语法非常出色,但是就是没有人用。相反有些语言本身不是特别优雅,但是用的人却很多。Rust我不怎么看好,这门语言门槛太高了,不适合初学者,生态很难建立起来。
谢邀Go 是不错的语言,那是和以有的语言比。但是的确不如 Rust 啊。
你看看这几个语言里面谁最流行?有时候被人骂不一定是真的很烂,而是说明用的人多,发现的问题相对多一些。没人骂可能是没多少人用所以坑被踩得少。你想想以前C++和JAVA就明白了。
一粉顶十黑
丑,脑子进屎的包管理
用过Go最大的体会是,Go社区的风气不是很好,发布半成品成风。也许有人会说因为Go社区还年轻,但是Node社区也很年轻,虽然很多库功能很弱,但是完成了的功能都是比较完备的。感觉Go如果没有Google当爹根本不会有人用(地图炮是不是放的有点过...)。
盛名之下,其实难符。
已有帐号?
社交帐号登录
无法登录?
社交帐号登录}

我要回帖

更多关于 go rust c 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信