1一切从JavaScript开始。经过多年的打拼,这位昔日的屌丝成功逆袭,成为了前端之王。在这场斗争的路上,Applet、Flash、Silverlight等无数炙手可热的技术都成为了冤魂。Java常感叹:“可惜我的Applet,不然前后端编程都用Java,程序员也不用那么辛苦了。”JavaScript对这种说法嗤之以鼻:“技术被厂商锁定,内容无法被搜索引擎搜索到,程序员把你当地狱。”话虽如此,JavaScript对自己的理解也很深刻,优点就是看起来简单,写个简单的程序就容易上手,暴露了。一是语法设计,作用域怪异,类型转换混乱,蹩脚'面向对象',已经引起了很多语言的蔑视,另外一个就是性能,浏览器端的解释和执行到底能跑多快?2.对于第一个问题,JavaScript想了很多办法不断改进,但是新版本要考虑向后兼容,兼容之前乱七八糟的设计,这不能不说是一个巨大的负担。人类想,既然这么难改,能不能另辟蹊径,把它当作一个“低级”语言?JavaScript不愿意,但还是有人做。微软做了TypeScript,JeremyAshkenas发明了CoffeeScript,他们要么支持静态类型,要么语法更优雅漂亮。运行时,可以转换立即将它们插入JavaScript。JavaScript发现自己是浏览器中的“汇编语言”!但是作为前端之王,JavaScript积累了大量的类库和工具链。完全用一种新的语言重写是非常困难的,程序员的惰性也很大。大啊,没有很强的理由,没人想学一门新的语言,JavaScript可以用来凑合,ECMAScript不是一直在进化吗?更重要的是,**Script最终还是会运行在JavaScript中,而且速度还是上不去。3Node.js的诞生帮助JavaScript侵入了后端开发的领地,这让Java很头疼。这不是说JavaScript性能不好吗?!秘密就在于Google的V8引擎,它有一个JIT技术,可以把一些HotJS代码翻译成本地机器码执行。性能没有提高吗?但这项技术并不是万灵药。由于JavaScript的动态特性,即使像V8这样强大的引擎也会遇到麻烦。人们经常举这样一个例子:functionadd(x,y){returnx+y;}如果用add(1,2)调用,V8的JIT知道这个参数是int类型,就会把这个函数编译成localcode,参数为int类型。由于变成了机器码,所以执行起来非常快。然后人家用add("hello","world")调用,V8发现之前编译好的int类型的native代码不能用了,得重新编译成string参数,速度一下子降了下来。向下。JavaScript有点疑惑:这个性能真的有那么重要吗?我现在的速度对前端编程来说绰绰有余吗?大不了我不想在服务器端开发!人的欲望是无止境的,在浏览器中不仅仅做简单的计算,他们还想用大型设计软件,用虚拟现实,玩游戏……计算量是JS无法处理的。4JavaScript性能被压榨到极致,这条路走到了尽头。前面有一座高山,要想翻过它,就必须发明新的工具。微软、谷歌、苹果等大咖召开多方会议,各方就关心的问题深入交换意见,对各方多年来的努力表示赞赏和赞扬。大家一致表示:JavaScript长期看不顺眼,必须想办法把它“干掉”。为了达成最大的共识,会谈并没有定义一种新的运行在浏览器中的高级语言。相反,大佬们为Web时代定义了一套汇编语言。其他语言,不管你是C++、C、Rust、Java,只要能编译成这个webassembly,就可以在浏览器中执行。(注:Webassembly其实就是WebAssembly的技术)这个Webassembly的思路很有意思。它本质上是一组需要被虚拟机执行的字节码,当然是静态类型的。例如:编译计算阶乘的函数后,字节码会是这样的:(点击放大,来源:https://www.slideshare.net/jayphelps/webassembly-demystified)Java看到这个解法,立马哭了晕倒在厕所里!这与我自己的Java字节码非常相似!看这个i32.sub,i32.mul,一个减法一个乘法,但是后面没有操作数,而且操作数必须存入栈,所以这一定是栈式虚拟机!如果我知道这一点,为什么我要使用我的Java字节码、我的JVM和我的Applet?用我的小程序多好啊!转了一圈,又回到了原点!这位IT大佬的政治斗争真是TNND。JavaScript看到这个方案的时候也吃了一惊。后台那些老家伙铁了心要弄死我,他们要对我进行珍珠港袭击!或者我也编成这个“网编”,和他们平起平坐。台湾比赛?但是我是动态语言,类型需要在运行时确定,所以没法提前编译。然而,用C/C++这样的“低级”语言写前端代码,操纵DOM,CSS,是不是又臭又长,是不是很好笑?!诚然,这个Webassembly是杀不死JavaScript的,语言需要配合。Webassembly主要解决性能问题。C/C++可以编写高性能的“Web程序集”,实现图像/视频编辑、游戏、流媒体、虚拟现实、CAD软件、可视化、仿真等代码库,然后让JavaScript调用即可,随心所欲.JavaScript依然是前端之王,不可替代。【本文为专栏作家“刘欣”原创稿件,转载请通过作者微信获取授权公众号coderising】点此查看该作者更多好文
