看了下日志,这是2014年的问题,现在是2021年,正好我们回头看,这7年以来,编译器都发生了什么变化
我看了一下其他回答,感觉很多人的预言显然都说错了
比如动态类型语言,脚本,从最近几年的发展趋势上看,脚本正在逐步淡出主流视野,也就是,脚本真的很难继续优化下去了
一个典型案例就是flutter team,eric的访谈,里面就有说到,为什么会有flutter呢?flutter team最早是做web的,他们那一群人,就是想办法去优化web上那一坨东西,比如html,js那些东东,最后实在是优化不动了,想了想,算了吧,别搞了,从头设计,把web上那一堆东西全部丢掉,从编程语言开始做编译器,然后让编程语言针对需求目标做改动,然后把东西做出来,测试了一下,哇哦,发现比web上那一堆东西啊,快了21倍,于是就有了flutter
那这说明什么呢?恰好说明了动态类型语言发展的困难,在编译这一层面上,理论上说,动态类型语言,能不能编译成机器码?
理论上可以
但实际上呢?
谷歌搞这个都搞砸了,所以我不太相信有什么企业还能继续搞下去,我对此看法极为悲观,我认为10-20年内,不可能有这种东西出现,甚至可能永远都不会有动态类型语言编译成机器码的编译器出现
尤其是javascript和python等老一辈脚本语言
而且你看,谷歌后来为了flutter,能够编译成机器码,对编程语言dart做了哪些改动?
dart最早是设计出来做成一个更好的js用的,dart最开始可以编译成js,但是flutter之后,dart从1.0升级到2.0的时候,dart就从原来的动态类型(也就是类似js)改成了静态类型(类似java),我相信谷歌曾经尝试过,把动态类型语言,也就是js那些,给编译成机器码,也就是对js等语言做aot处理,但是他们失败了,就是eric在访谈中暗示的那样,他们搞砸了,所以他们干脆就放弃了动态类型语言,转而改为静态类型语言,并将其编译成机器码,于是就有了flutter
所以从谷歌的经历上看,对于动态类型语言,尤其是javascript,python等脚本语言而言,能做到jit和足够好的gc,就是它们的极限了,如果想进一步编译成机器码,也就是aot的话,需要改成静态类型,否则,你多半要搞砸,因为eric他们都搞砸了,我不认为你比他们技术实力更强
然后我们再来看其它的编译器,因为谷歌搞砸了,没准其它的能搞成呢?
多语言的编译器呢?比如graal
嗯,很不幸,一样没戏,graal的aot功能,目前也只针对能够编译成字节码的语言,比如java,而且对动态功能,比如反射,有很多限制,你要手动配置哪些类用到了反射,所以主要还是针对静态类型语言,比如java,kotlin,scala等等,那graal的多语言功能,虽然包括了脚本,比如js,py,rb那些,但是这个编译,并不是将这些脚本编译成机器码,而是说,把java等可以做aot也就是编译成机器码的语言,在编译成机器码之后,还可以继续调用脚本语言,仅此而已,所以脚本通过graal依旧无法编译成机器码,dead end
唯一的好消息就是llvm证明了,动态类型语言和静态类型语言,都可以使用同一个编译器后端,也就是理论上,可以将脚本(js,py)编译成机器码,但实际上,至少在目前看,没有任何一个,能够将主流脚本,不管是js,py还是rb那些,编译成机器码的编译器出现
这些脚本的主要运行时,多数都还是把原先解释执行,给做成类似java传统上那种jit,也就是即时编译执行的模式,当然性能上比起解释执行,那是要快不少,你可以想一下node.js vs ruby的ror,但这也已经是目前应用的极限了,想要进一步编译成机器码,目前看,还没有可能
说完了脚本,我们说一下最近十年,真正出现的趋势
那就是aot,也就是把静态类型语言编译成机器码
目前正在做这个的语言有:dart/flutter,java,kotlin,scala,swift
这些语言都是先有jit,然后现在开始做aot,除了swift是从aot开始,然后现在做jit(sidecar)
但是不管是先做aot再做jit,还是先做jit再做aot,总之这些语言,都在朝着同时支持jit和aot两种运行模式的方向上前进,其实还有第三种,也就是解释执行,那这些语言又双叒叕都提供了repl,也就是命令行交互界面,用户直接直接通过repl解释执行源码,jshell之类的,所以其实脚本的运行模式,这些语言也都有,但是反过来,脚本就基本上做不到aot,jit都很少,也就是pypy和node等少数脚本做到了jit,aot一个没做出来
然后正面回答问题:最近十年,关键的技术进步,应该是aot
这么多语言,这么多公司都在做aot,足见其魅力,应用面上,除了客户端普遍要求aot以外,服务器端,比如jvm上一大堆框架,都在朝着兼容aot的graal编译器狂奔而去,比如vert.x,micronaut,helidon,以及更上层的quarkus,spring等
而这些语言在编写上的难度,都普遍低于c++等语言,所以假以时日,这些语言逐渐成熟之后,用这些语言来替代现有的c++应用场景,应该是很正常的事,java就在干这事,graal就是java写的,然后用graal来替代openjdk里面的c1/c2编译器,这就是自举嘛,然后swift的自举估计还需要时间,因为swift自身语法什么,还没太稳定,还在一点一点新增当中,比如5.5要推出的async/await和actor类型,当这些都稳定了之后,可能就会跟java一样,去自举了
总结:aot,yyds
本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度,google,bing,sogou 等
© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有