从java到JavaScript(1),看Dart:对比Java/Go/Swift/Rust
关于 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,个人希望其一统大前端开发。
编程语言进化目前大概有三个阶段:
原始阶段,静态类型语言黄金时代。汇编/ C/C++之类的,重性能,因为那个年代的计算资源相当匮乏。因为硬件能力不足,软件开发人员需要认真管理各类资源,不然系统速度太慢。
这个阶段其实也诞生不少优秀的语言,比如lisp。可是出彩的还是C和C++。
发展阶段,动态类型语言黄金时代。大概是90年代开始,Pentium处理器的出现应该是代表计算机进入了一个新时代,摩尔定律光辉普照,硬件大爆发,瞬间满足了大部分软件的硬件需求,而随着软件规模不断扩大,快速完成高可读性的代码很重要。人力成本是公司最大的一部分。动态语言有效解决该类问题。花在维护上时间大于写新代码的时间,这样的模块都应该用静态语言来写。
这个年代涌现出了不少动态语言,比如Ruby、Python、Lua、JavaScript,当然也少不了Java。都是以人为本,提升生产效率。
动态语言比如PHP JavaScript 或者java 把业务做的差不多,需要重构了,需要高性能了。但是C++ Go swift等传统静态语言开发成本太高(阿里从php到java,京东从asp到java),于是需要新的静态类型语言。
跃进阶段,静态类型语言的新黄金时代。也就是2010年以后,尤其是智能手机、云计算等出现,动态类型语言不满足人民群众日益增长的性能需求,同时暴露了对类型过于宽松而造成的可维护性,可调试性下降。因为规模越来越大的同时,对安全的要求也越来越高了。也就是说,现代对编程语言的需求是:安全和高效率(性能和开发速度),所以就涌现出Golang、Rust、Swift这种强类型静态语言。
Golang的侧重点在于工程化和并发,这也和摩尔定律在CPU上失效进入多核时代有关系。
Rust主打安全和高效(性能+开发速度)。
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
从java到JavaScript(1),看Dart:对比Java/Go/Swift/Rust的更多相关文章
- WebView上实现Java与JavaScript交互
在安卓开发上,考虑到开发效率和界面更新,有时使用WebView结合web页面技术,可以快速迭代地开发移动应用.WebView加载资源的速度并不慢,但是如果资源多了,就很慢.图片.css.js.html ...
- protobuf基于java和javascript的使用
目录 ProtoBuf介绍 整理下java和JavaScript的例子 demo测试 java作为服务端+客户端测试 客户端前端调用示例 项目地址 参考 ProtoBuf介绍 ProtoBuf 是go ...
- paip.java 以及JavaScript (js) 的关系以及区别
paip.java 以及JavaScript (js) 的关系以及区别 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http:// ...
- 30个深度学习库:按Python、C++、Java、JavaScript、R等10种语言分类
30个深度学习库:按Python.C++.Java.JavaScript.R等10种语言分类 包括 Python.C++.Java.JavaScript.R.Haskell等在内的一系列编程语言的深度 ...
- 成为Java顶尖高手要看的11本书
成为Java顶尖高手要看的11本书 学习的最好途径就是看书",这是我自己学习并且小有了一定的积累之后的第一体会.个人认为看书有两点好处: 1.能出版出来的书一定是经过反复的思考.雕琢和审核的 ...
- Nashorn 在JDK 8中融合Java与JavaScript之力
从JDK 6开始,Java就已经捆绑了JavaScript引擎,该引擎基于Mozilla的Rhino.该特性允许开发人员将JavaScript代码嵌入到Java中,甚至从嵌入的JavaScript中调 ...
- Android 中Java和JavaScript交互入门
如何实现JavaScript 和java 交互 实现Java和js交互十分便捷.通常只需要以下几步. WebView开启JavaScript脚本执行 WebView设置供JavaScript调用的交互 ...
- 序列化之protobuf与avro对比(Java)
最近在做socket通信中用到了关于序列化工具选型的问题,在调研过程中开始趋向于用protobuf,可以省去了编解码的过程.能够实现快速开发,且只需要维护一份协议文件即可. 但是调研过程中发现了pro ...
- Protocol Buffer序列化对比Java序列化.
初识 Protocol Buff是谷歌推出的一种序列化协议. 而Java序列化协议也是一种协议. 两者的目的是, 将对象序列化成字节数组, 或者说是二进制数据, 那么他们之间有什么差异呢. proto ...
- Jerry的ABAP, Java和JavaScript乱炖
写这个系列的初衷是SAP Chengdu office有越来越多的应届毕业生加入,这些新同事通过在大学的专业学习,具备了Java和JavaScript背景,但是进入SAP之后大家觉得ABAP没有Jav ...
随机推荐
- C#winform软件实现一次编译,跨平台windows和linux兼容运行,兼容Visual Studio原生界面Form表单开发
一.背景: 微软的.net core开发工具,目前来看,winform界面软件还没有打算要支持linux系统下运行的意思,要想让c#桌面软件在linux系统上运行,开发起来还比较麻烦.微软只让c#的控 ...
- 红瞳瞳CRUD Avue各参数作用
常用的两个avue文档: avue 开发文档: https://www.bookstack.cn/read/avue-2.x/3c22e1c01099c1f1.md avue开发指南:https: ...
- Qt 迭代器
目录 (一) java风格迭代器 1. QListIterator类 1. 初始化 2. findNext() 3. findPrevious() 4. hasNext() 5. hasPreviou ...
- 从这里开始,跟我一起搞懂 MySQL!
提前申明:<MySQL 基础实战>系列是学习极客时间林晓斌的<MySQL实战45讲>的整理和总结,希望大家仅做为学习使用! 架构示意图 Server 层:包括连接器.查询缓存. ...
- 题解 P7325
前言 数学符号约定 \(a,b,p\):表示任意自然数. \(F_x\):表示广义斐波那契数列的第 \(x\) 项. \(f_x\):表示普通斐波那契数列的第 \(x\) 项. 如非特殊说明,将会按照 ...
- Meissel–Lehmer 算法
前言 推荐先行阅读我的blog文章----Min_25 筛 什么是Meissel–Lehmer 算法 Meissel-Lehmer 算法是一种基于 \(ϕ\) 函数的的快速计算前缀质数个数(当然也可以 ...
- 在ASP.NET Core 中使用 .NET Aspire 消息传递组件
前言 云原生应用程序通常需要可扩展的消息传递解决方案,以提供消息队列.主题和订阅等功能..NET Aspire 组件简化了连接到各种消息传递提供程序(例如 Azure 服务总线)的过程.在本教程中,小 ...
- 三分钟使用github的技巧
一.GitHub搜索技巧--找开发者 搜索条件 备注 location: location:china,匹配用户填写的地址在china language: language:javascript,匹配 ...
- STM32外设:定时器TIM
主要外设: TIM:Timer 定时器 TIM中的基本电路 定时器 计数器的基本功能 复位:计数器值=初值.产生一个输出脉冲.产生更新事件(UEV)脉冲.更新中断标志UIF=1 计数:计数器值递增或递 ...
- STA分析-复制
1 静态时序分析(Static Timing Analysis)静态时序分析(Static Timing Analysis):静态执行对于数字设计时序的分析,不依赖于施加在输入端口上的激励,验证设计是 ...