从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 ...
随机推荐
- DOM级别
DOM1 DOM1级由两个模块组成:DOM核心(DOM CORE)和DOM HTML.其中,DOM核心规定的是如何映射基于XML的文档结构,以便简化对文档中任意部分的访问和操作.DOM HTML模块则 ...
- svn 分支的创建及合并
http://blog.csdn.net/jixiuffff/article/details/5586858 http://zhidao.baidu.com/link?url=uiRk-4ZBkLPx ...
- 7z 一键压缩备份
该批处理已开源 开原地址: 点击进入 磁盘备份 工具有很多,如果你需要增量式备份的话,以下这些方法并不适合你.goodsync 可以了解一下. 以下方式仅适用于,懒人一键压缩备份. 对于我来说 定期的 ...
- 一、Linux发展史
一.Linux发展史及红帽认证 红帽授权培训合作伙伴 木兰宽松许可证 1. Linux系统发展史 1. Unix发展历程 上世纪六十年代贝尔实验室(Bell).麻省理工学院(MIT)以及通用电气(GE ...
- C语言根据公式Cnm= 算出从n个不同元素中取出m个元素(m≤n)的组合数。建议定义和调用函数fact(n)计算n!,其中n的类型是int,函数类型是double。
/* 开发者:慢蜗牛 开发时间:2020.5.28 程序功能:开发公式Cnm */ #include<stdio.h> long fact_1(int m); long fact_2(in ...
- 总结---Django部分
Django是走大而全的方向,它最出名的是其全自动化的管理后台:只需要使用起ORM,做简单的对象定义,它就能自动生成数据库结构.以及全功能的管理后台. Django内置的ORM跟框架内的其他模块耦合程 ...
- [QOJ1359] Setting Maps
题目链接 \(k=1\) 的时候显然是最小割.把一个点 \(u\) 拆成 两个点,中间连流量为 \(c_u\) 的边. 那么考虑扩展到 \(k\) 更大的情况.把上图的每个入点和出点都拆成 \(k\) ...
- ssm整合-项目异常处理方案
项目异常分类: 项目异常处理方案: 需要自定义异常处理 然后在处理器中加入 package com.itheima.controller; import com.itheima.exception.B ...
- shell 脚本中的 '-f' 和 '-d' 分别代表什么意思
shell脚本中,'-f' 和 '-d'是用于测试文件类型的条件表达式. 1.'-f'表达式: 表达式: '[ -f file ]' 描述: 判断给定路径是否是一个常规文件 (regular file ...
- 使用IDEA2022.3创建web工程~
为什么突然记录这么一篇博客呢? 以前都是用2019IDEA的,突然换成了IDEA2022懵逼了,所以记录一下~ 具体步骤 1.创建一个新的Project 2.注意选择BuildSystem 3.在当前 ...