近日,Bloomberg宣布其开源的JavaScript编译器BuckleScript到达了1.0版本,前端之巅很荣幸地邀请了其作者张宏波,为大家分享它的意义和功能。
张宏波,前OCaml编译器核心作者,现BuckleScript作者。诱人的JS平台Bloomberg早在04年就开始在服务器端使用JS了,现在JS已经是其内部使用最多的程序语言之一,有着丰富的大规模开发部署JS的经验。而在开源世界,随着几大IT巨头对JS引擎和工具的大力投入,以及NodeJS的兴起,这几年,JS已经成为工业界炙手可热的程序语言。
不难发现现在的软件行业——从互联网行业到传统软件领域——JS平台,这个唯一的跨平台语言正在吞噬着越来越多的软件领域(因为移动的崛起,Java已经不再是一个跨平台语言了):
浏览器不再单单只是投放内容的一个平台,越来越多的应用程序开始通过浏览器直接部署,像BuckleScriptplayground这样的整个工业级别的编译器可以流畅地直接跑在浏览器上,这在5年前甚至都是不可想象的。
Google最近主推的ProgressiveWebAPP将会给浏览器带来更强大的API。而最新的WebAssembly标准将会使得JavaScript平台可以覆盖更多的领域:比如传统的数值计算领域。WASM相当于给JS提供了一个接入原生平台的FFI,JS作为这个平台的胶水语言毫无疑问有着最多的机会。
JS平台已经不再局限于浏览器,相反它已经开始反噬,开始入侵其他领域。最有名的是服务器端NodeJS,桌面端Electron,物联网IoT,移动端ReactNative等。
然而JS作为一个只花了两周时间开发的动态语言是很难承载大规模,高性能开发的。它最主要的痛点有两个:
程序没有类型,很难做维护和安全的重构。
程序性能过于依赖JS引擎的优化,性能很难预测,而且因为不同引擎性能变化较大。
工业界需要更快更好的JS编译器虽然JS平台很诱人,但是“动态语言难于构建大型程序”基本上已经是业界共识,一旦程序规模上来,维护起来基本上就是噩梦,在原来的Hack上添加新的Hack,没有人敢修改原来的代码。
在BuckleScript之前,业界比较成熟的具有工业强度的JS替代语言主要是微软的TypeScript,那么BuckleScript相比TypeScript主要有哪些优点呢?我们可以从以下几点来分析:
更多的平台拓展性
BuckleScript不是一个新的语言,它是把一个已经存在将近30年的语言OCaml编译成可读的JS。而OCaml本身对很多平台存在原生的后端支持。像golang一样,OCaml可以编译出汇编代码到iOS、Android、Windows、Linux、MacOS。而TypeScript只有JavaScript一个后端。
拥抱JavaScript并不代表我们就要抛弃原生平台,当我们需要更快更可靠的性能的时候,我们可以有更多的选择。比如,做工具链的时候,TypeScript的编译器同样也是用TypeScript写得可以跑在浏览器里,也可以跑在node上,但是它跑在node上得时候就比BuckleScript编译成汇编跑慢不止一个数量级。
更好的类型安全,更多的类型推断,更好的语言特性
TypeScript是一个JS的超集,它存在很多历史包袱。微软引入TypeScript更多的是作为一个工具来使用的比如IDE的代码补全,相对安全的代码重构。而这个类型的准确性从第一天开始就不是它的设计初衷,以至于Facebook自己设计了一个相对更准确地类型系统Flow。OCaml的类型系统是已经被形式化的证明过正确的。也就是说从理论上BuckleScript能够保证一旦编译通过是不会有运行时候类型错误的,而TypeScript却做不到这点。
TypeScript的类型推断很弱,基本上所有参数都需要显示的标注类型。不光是这点,像对函数式编程的支持,高阶类型系统GADT的支持几乎是没有。而OCaml本身是一个比Elm,PureScript还要强大的多的语言,它自身有一个非常高阶的modulesystem,是为数不多的对dependenttype提供支持的语言,polymorphicvariant。而且patternmatch的编译器也是优化过的。
程序优化,代码删除,闪电一样的编译速度
BuckleScript不只是一个编译器更是一个optimizing北京医院治疗白癜风费用海口最好的白癜风医院