dart这个语言最关键的地方其实是两个:1.相似性;2.dart2JS。
相似性:
google搞的这个dart你会发现如果有java,c#,javascript背景的开发人员,那么这个语言几乎是0学习负担,直接拿来就能用,做项目。里面有很多好的特性都是你非常熟悉的,语法难度(目前)介于java和c#之间,可选类型的动态语言,弥补动态语言tooling,静态分析上的短板(尽管这个可选类型争议很大,尤其是纯粹从设计语言上的角度上去看)。
dart2JS:
dart vm将来会内置到chrome中,但其他浏览器可能不会支持它,所以dart2JS就显得很重要,这样dart写的程序可以在所有浏览器上执行,至于性能和体积等等问题这个变成了编译器优化的部分了,纯粹的技术上问题,没有什么不可逾越的障碍了(例如让其他浏览器接受dart vm这种非技术性障碍,这个很难逾越),只需要时间去完善。最终有点类似于手写汇编和编译器生成的汇编哪个效率高的问题。
有了语法上的高度相似性和dart2JS,那么dart失败与成功其实不是那么重要了,因为google最终的目的不是让大家都一定要去使用它的语言,而是要让web进化的更快一些,或者说有一个比现在更好的javascript快点的到来,这才是它最想要的结果,类似于它的什么高速光纤等等,都是这个套路,让你更加依赖web,因为web是它盈利的关键入口。
2011年google内部有邮件说明过为啥要做这个语言?他们有2套方案会一直并行的去做下去:
1.v8团队继续优化js引擎,一起参与进化javascript语言;
2.发明一个新的语言(dart),最终替代JS。
方案1风险小但进展太慢它等不及,方案2风险大但回报也大。最终他们决定同时执行两套方案。
而dart的开发者大部分就是v8,chromium的团队人马,dart中很多新东西都和v8有关联,dart一些新的特性未来可能也会被ecmascript 接受成为未来js的新标准,所以最终无非就是两个结果:要么dart失败了,但dart里很多好的东西都被js吸收了,js焕然一新;要么dart成功了,代替掉了js。无论是哪种结果,web的进化进程都被加快了,这个就是google的真正目的(有点像它做android但却不直接通过这个系统本身来赚钱)。
所以说:这个语言在设计中【保持相似性】和【dart2js】是很关键的两个方面。那么你觉得它能否代替掉JS对你影响大么?也不会出现什么你学了很久的东西未来某天发现没用武之地了这种情况,所以该用js的继续接着用,想尝试dart的也别担心别的浏览器跑不了,也不用担心要从头开始学一门新的语言的负担,因为它里面大部分东西都是你早都掌握了的。
单从运行速度两个语言都很优秀,但运行速度不是我们唯一追求的指标,就像汇编语言写的程序运行速度很快,但我们绝大多场合都不会采用它。背后更重要的还有这门语言对应的生态。
比如企业要用人的时候能不能快速招到会使用它的人? 对求职者来说,我学习这门语言能不能带来更多的工作机会?用这个语言开发应用的时候遇到问题的时候能不能快速找到资料并得以解决?
go语言历史长、生态好、运行速度快,在服务端上面有所作为,比如为比特币、莱特币开发的闪电网络就是用go写的。 语法上和类C语言有很大不同。
Dart是新出的语言,配合flutter是很好的客户端开发语言。 语法没那么奇怪, 因为新所以生态自然是跟不上的。
Dart能不能用在服务端? 我个人觉得是可以, 毕竟可以Dart是可以转成javascript的,运行在Nodejs下, 借助于NodeJs生态,dart也可以做很多事情。
不知道你们有没有注意到,现在有很多新语言都支持翻译成Javascript。比如新的dart、kotlin, 还有ts是直接针对javascript语法加强而获得成功。
话说得再多, 不如自己亲自去体验一下。 jsrun上面支持30多种语言的在线运行环境, 先体验再做决定你到底要学哪一门语言。
http://dart.jsrun.net
http://go.jsrun.net
说道抽象类abstract,就不得不说一下external关键字,external关键字估计用到人很少,在看源码的时侯经常可以看到,如下:
external只声明方法,声明的方法需要由外部去实现 ,通常是由底层sdk根据不同平台(vm、web等)实现;若外部没实现,则会返回null;
external声明的方法,通过@patch注解实现 , 结构如上 ;
比如Object里各种external声明方法的 实现如下 :
移动端external声明方法实现在vm目录下:
web端external声明方法实现在js_runtime目录下:
external方法的实现文件一般命名为xxx_patch.dart,如在vm/lib目录下,可以看到各种xxx_patch.dart文件:
可以在终端通过grep搜索命令找到对应类里external方法实现的xxx_patch.dart文件:
以查找Object类里external方法的实现为例:
1、Object类定义如下:
可以看到Object类里有很多方法都是用external声明
2、在flutter sdk目录/bin/cache/dart-sdk/lib/_internal目录下,执行查找class Object命令:
由此可知:web端Object实现文件是./js_runtime/lib/core_patch.dart
移动端Object实现文件是./vm/lib/object_patch.dart
打开web端Object实现文件./js_runtime/lib/core_patch.dart,如下:
打开移动端Object实现文件./vm/lib/object_patch.dart,如下:
可以看到Object里各种external声明方法对应的@patch注解实现方法