• home > webfront > AppDev > Dart >

    从java到JavaScript(1),看Dart:对比Java/Go/Swift/Rust

    Author:zhoulujun Date:

    动态类型语言不满足人民群众日益增长的性能需求,同时暴露了对类型过于宽松而造成的可维护性,可调试性下降。Dart作为新时代的语言,支持JIT与AOT的新人,个人觉得还是好好琢磨下,笔记可能是未来web王者

    关于 JIT与AOT,之前整理过《JIT-动态编译与AOT-静态编译:java/ java/ JavaScript/Dart乱谈》,一文不足以概括dart。

    从编程语言生态看Dart

    大多数主流编程语言是上个世纪开发的:七十年代(如C)、八十年代(如C++)、九十年代(如Java、Python、JavaScript)。这些语言在设计上并没有考虑现代软件开发生态系统:多核CPU、GPU、快速的互联网、移动设备、容器和云等。尽管许多语言中的许多功能都已进行一些改进,如并发等,而且在不断调整自己以适应时代,但它们依然保留了向后兼容性,无法抛弃那些过时的旧功能。

    在这方面,Python就做得很好(某种意义上也未必是好事),Python2和Python3两者之间有明确的分界线。很多语言常常会为解决同一个问题提供十余种的方法,同时又没有顾及到开发人员的感受。

    从表面上来看,“有人不喜欢花括号,开发了Python;有人在一个周末设计了出了JavaScript;有人因为上班太无聊,于是发明了C语言”。关于编程语言的八卦轶事很多,但归根结底,一个编程语言的诞生一定是需求的推动。

    从面向机器的语言、面向过程的语言到面向对象的语言,编程语言的历史也经历了由繁到简。

    从汇编 到C/C++ ,然后到Java,衍生的JavaScript,Dart,个人希望其一统大前端开发。

    编程语言进化目前大概有三个阶段:

    1. 原始阶段,静态类型语言黄金时代。汇编/ C/C++之类的,重性能,因为那个年代的计算资源相当匮乏因为硬件能力不足,软件开发人员需要认真管理各类资源,不然系统速度太慢

      这个阶段其实也诞生不少优秀的语言,比如lisp。可是出彩的还是C和C++。

    2. 发展阶段,动态类型语言黄金时代。大概是90年代开始,Pentium处理器的出现应该是代表计算机进入了一个新时代,摩尔定律光辉普照,硬件大爆发,瞬间满足了大部分软件的硬件需求,而随着软件规模不断扩大,快速完成高可读性的代码很重要。人力成本是公司最大的一部分。动态语言有效解决该类问题。花在维护上时间大于写新代码的时间,这样的模块都应该用静态语言来写。

      这个年代涌现出了不少动态语言,比如Ruby、Python、Lua、JavaScript,当然也少不了Java。都是以人为本,提升生产效率

      动态语言比如PHP JavaScript 或者java 把业务做的差不多,需要重构了,需要高性能了。但是C++ Go swift等传统静态语言开发成本太高(阿里从php到java,京东从asp到java),于是需要新的静态类型语言。

    3. 跃进阶段,静态类型语言的新黄金时代。也就是2010年以后,尤其是智能手机、云计算等出现,动态类型语言不满足人民群众日益增长的性能需求,同时暴露了对类型过于宽松而造成的可维护性,可调试性下降因为规模越来越大的同时,对安全的要求也越来越高了。也就是说,现代对编程语言的需求是安全和高效率(性能和开发速度),所以就涌现出Golang、Rust、Swift这种强类型静态语言。

      1. Golang的侧重点在于工程化和并发,这也和摩尔定律在CPU上失效进入多核时代有关系。

      2. Rust主打安全和高效(性能+开发速度)。

      3. Swift诞生之初目的很明确了,就是为了替代ObjectiveC,而且也从Rust中取经,也比较注重安全和性能。所以强类型+静态就成为了一种主流选择。(突然感觉D语言有点生不逢时 )

    静态类型语言开始总结经验,学习动态类型语言的有点,很多人都提到了类型自动推导,智能指针,内存静态检查等智能功能。同时,不断改进原有能力,如concept,traits等提升模板可维护性。

    动态类型语言也在革新,但估摸着,在性能和可维护性双重优势的情况下,静态类型语言会更强势一些。

    强类型+静态+严格约束

    弱类型的问题大家已经说的很多了,从Javascript到C都有同样的问题,重载都能被搞出来不少幺蛾子。做新语言大概会第一时间绕开这个坑,弱类型带来的好处实在有限

    至于动态或者静态就是取舍问题了,个人认为( 赵磊),靠程序员之间的文档协定来搞定一个大型应用是一个非常挑战的事情,还不如把行为和类型联系起来,通过类型检查来约束行为。人总是有点惰性的,如果照着文档的约定不好实现,很有可能就会偷懒的违背约定,后面的维护就会困难重重。而违反接口层面的规定会直接在编译过程失败。

    严格约束带来的好处就在于可以对未知的部分做很多合理假设,通过接口可以确认更多的信息,比如入参会不会被修改、调用会不会产生IO,不至于让开发者调用一下接口还要看看具体实现。

    严格约束也会限制程序的写法,灵活性会受限。所以这几年涌现出来的新语言也是在找这个平衡,很多静态类型的语言也不用显式地声明对象类型,一些动态语言也在加类型约束。


    过完年再整理下………………

    参考内容:

    C、C++、Java到Python,编程入门学习什么语言好? https://zhuanlan.zhihu.com/p/159606997

    现代编程语言大PK,2020年作为程序员的你应该了解这7门编程语言 https://zhuanlan.zhihu.com/p/112949238

    为什么 2010 年前后诞生的语言(如 Golang, Rust, Swift)都是强类型 + 静态? - 张汉东的回答 - 知乎 https://www.zhihu.com/question/31100089/answer/216088206

    为什么 2010 年前后诞生的语言(如 Golang, Rust, Swift)都是强类型 + 静态? - 赵磊的回答 - 知乎 https://www.zhihu.com/question/31100089/answer/216345665

    为什么 2010 年前后诞生的语言(如 Golang, Rust, Swift)都是强类型 + 静态? - 不中的回答 - 知乎 https://www.zhihu.com/question/31100089/answer/59549237


    转载本站文章《从java到JavaScript(1),看Dart:对比Java/Go/Swift/Rust》,
    请注明出处:https://www.zhoulujun.cn/html/webfront/AppDev/Dart/8514.html