zoukankan      html  css  js  c++  java
  • 我为什么选择rust

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

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

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

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

    对于符合上述要求,现今为止能很好作到“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


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

  • 相关阅读:
    sass学习(1)——了解sass
    ES6学习(2)——arrows箭头函数
    ES6学习(1)——如何通过babel将ES6转化成ES5
    过年后的小计划
    JavaScript,通过分析Array.prototype.push重新认识Array
    JavaScript如何判断参数为浮点型
    gulp之静态资源防缓存处理
    递归算法,JavaScript实现
    有趣的Node爬虫,数据导出成Excel
    Memcached、Redis、RabbitMQ
  • 原文地址:https://www.cnblogs.com/minlearn/p/13771543.html
Copyright © 2011-2022 走看看