Discuss

Whyrustlang

minlearn 仲裁员
板块:通用举报

我为什么选择rust

本文关键字:allinone编程语言,个人是否真的可能学好多门编程语言

我们在前面《编程语言选型通史:快速整合产生的断层》提到,我们需要一门"简单,oneforall"显得不那么“断层”的语言来工作和学习,以积累自己的codebase和开发经验而无需推倒重来或切换,---- 这个问题之所以重要和紧迫,如上文所讲,是因为编程语言一直处在开发和学习的中心,占据一个程序员的大部分时间和心智精力,语言选型必须先于其它进行。而现实情况是,技术总在演变,而融合正处在初级阶段,人们在学习和工作中总涉及到使用多门语言的情景,产生的断层和学习成本巨大(见《qtcling - 一种更好的C++和标准库》和《编程语言选型之技法融合,与领域融合的那些套路》)

"程序员总是需要不停学习",。这个时候,我们希望获得一种简单,但allinone的语言和一劳永逸的开发领域研究对象。对于出现的新开发,也可以以自然不虐心的方式融入,共享同一套生态,---- 俗语,用一种语言解决所有问题。这个问题放在10年前是不可能讨论的,但现在可以了。

“任何编程语言都一样麻烦”,软件无银弹,排除这些同质部分。来设想一下,对这种语言最基本的要求,首先是要保证简单,避免CPP那种越做越复杂带来的坑。不要求它有对低阶语言有很好的源码兼容性,但至少要能接上现今二大生态(naitve/web)。语言写法上的限制和自由是一对矛盾,这个时候我们宁愿入门前曲线陡峭,入门后一马平川,除此之外,它还应绝对安全(非必要不写unsafe),是运行期免错的语言。

对于符合上述要求,降低语言本身的难度和保持语言本身和语言规范的稳定,函数式曾经是最佳的选择:

为什么说过程式和OO后面的编程教育是畸形的:对于编程语言,函数式几乎是另一种独立于我们从c/cpp等司空见惯接确到的那些编程教育中获取到的语言印象而我们却丝毫没有认知过的异类,但实际上函数式语言的历史比过程式更古老,也更先进。 而也正是过程式,使得我们没有机会或少有机会,去对语言的函数机制或函数语言作很深的理解。但实际上,如果一开始学过或了解过函数语言,你就会知道好多现在的语言,js,py,go,它们当中的函数式原来居然有这么亲和。 函数机制,是一种三位一体的元概念,它跨越数学(lisp表达式),语言实现(函数语言天然带并发,因为它没有io,函数语言可以在编译期修改自己,可以直接在ast上写程序,函数语言是语言扩展自身的绝佳场所,有不少关于类修饰,宏和元语言的内置支持),和程序编程。如果带着这些去了解现在的语言js,py,go,就会觉得它们so easy 你所找到的cpp中所有从过程式中要涵盖的所谓范式,其实在函数语言那个年代,都被包含过一次,而且是“元,一次性”,以有机方式和可定制方言系统的方式解决的,,,现在的cpp,能轻易有方言系统吗? 它是可再发行的语言方言系统的典范。像linux一样可以组合,重发行。它是程序语言学习的最佳最短捷径(比如从学函数式语言学通用语言设计再到学具体语言js)。只不过,它较难门槛较高。 (稍后你会看到rust的语言机制与os实现居然也是二位一体的)

再来看命令式:

对于符合上述要求,现今为止能很好作到“allinone”写法的语言和跨embeded/native/web/mobile(甚至web前端)开发的语言。Dlang/go/rust是唯三的选型对象,这其中,rust是最全面的。从语言演变历史中那些坑中综合排查,这点上,因为rust出现得晚,取长补短,rust没有任何包袱。它是最不虐心的。rust源于cyclone的部分概念,虽然说这些cpp的新版本也能做到,但cpp应该改无可改面目全非了,不如一门新语言来得更让人易接受。

具体来看rust的优缺点:

它有:

1,它涵盖toolchain即appdev领域,是真正的通用语言,着眼现在面向未来

它支持跨embeded/native/web/mobile(甚至web前端)开发,而其它不少语言也宣称它们通用,但总是存在大量的坑(比如人们不常用php-cli,仅用php-cgi)。rust没有这些包袱,是真正的通用语言,即又具备动态和脚本语言的写法和效率,而且又以一种自然科学不虐心的方式进行。而且它的微运行时能嵌入browser,着眼未来wasm技术。它也能被很好用于未来的AI,因为安全和效率比py高。

2,它涵盖现在的主要语言体系,聪明地定位于安全的编译型语言。

如在静态语言中谋求动态,如let,又将以前仅运行期能做的。用模板和泛型可以完全弄到编译期,如整套的编译期内省。达到了现在流行的静态/动态/语言脚本语言都能拥有的效果,支持脚本语言的逻辑热更。上面谈到,它是强编译期安全性的,能保证运行期免错(解决了c增强系如CPP的痛点:内存泄漏和数据竞态)。 其实运行期与编译期只有二个期的不同(对导致语言灵活和动态性差别没有本质联系)。不一定语言的动态性就一定要体现在运行期。编译期可以让语言达到足够的动态性,这就是动态编译。

3,它涵盖了所有语言技术,建立了所有语言的多范式超集,具备了流行的开发支持,

见《编程语言选型之技法融合,与领域融合的那些套路》,现在所有的语言,基本不是函数式(这类语言的代表就是lisp,haskell)就是过程和OO式(cpp,java)或者它们的综合(py,js,go,rust),都可归为这二种流派。其实现都是对他们的简化与修正。而rust对这二种流派都有全面吸收和支持。

4,它不复杂,为了融合和发展,它另辟创新,解决了C增强系的痛点,而没有提出过多的新概念,甚至没有GC

拿cpp与rust这些“增强C系语言”对比,我们要忽略cpp对c的源码兼容是c的增强(严格来说,cpp应该向它的祖先cfront靠拢以增强C。)这层极具混淆性的意义来说,把cpp与c看成是一高阶一低阶的不同语言,这样我们就能方便地拿出两者都提出一门高于c的新语言的起点性工作开始对比:它们都保留指针和控制底层的能力,但rust有引用和借用,类型所有权,,极其聪明地(虽然有些强制和面向契约)规避了cpp的坑,同样没有GC,同样用raii却避免了CPP的内存不安全。

与dlang/go这样的“简化C系/cpp语言类”比较,达到同样的效果却而避免给语言增加gc这样的乱入式大部头。一门语言集不集成GC,这是影响到语言本质的问题,比如go集成GC,其运行时会比rust大好几个数量级,rust极小运行时。这对嵌入硬件平台和嵌入WEB浏览器极为关键。它对glibc这样的东西几乎无依赖。。

对语言的学习,从对比它们的类型系统,作用域,支持的高级数据结构,异常,。。。。这些层面,基本一个认真学过几门流行语言的人都可以在10小时之内了解完。(引用,借用,其实并没有给rust新增加多少东西,其它都是向简集成)

5,它兼顾了现在,也能接入既有多种生态和未来扩展方向:

它能生成对c的转译结果(接上了系统实现和系统开发生态),以及对js的转译结果(接上了web前后端生态),而现在转译式开发是很流行的。place rust on top of c and js(比如 c,js作为低阶语言仅具备基本的过程和函数,oo和高级函数语法放在高阶语言rust层),这是很well arranged的。

对于未来,它也有考虑,如wasm,如virtual appliance,见《云APP,virtual appliance:unikernel与微运行时的绝配,统一本地/分布式语言与开发设想》,未来应该是libos,unikernel,Fuchsia os这类可编程可devops可嵌入可物联的内核的天下。

它没有下面这些,但不重要

(一个事物的优点的这个说法,正是它缺点的某些方面,在一定的可讨论范围内,任何选型都是一对矛盾):

它没有对C的源码兼容支持它没有GC。这刚好成全4,5

它没有过于简单的语法。但其实这是个仁者见仁智者见智的问题。(引用,借用,这些是rust最本质的创新)

它没有显式的语言层DSL支持,但它内外部已集成足够可用的东西。见3,5

它没有统一后端,但有 C ABI 二进制兼容对外interoperability能力也好。,也没有类elm的interoperability to js,见5


(此处不设回复,扫码到微信参与留言,或直接点击到原文)

minlearn.org,tg: minlearn_1keydd,本人长期接有偿付费dd。不会D的,和要定制镜像的都可以t我