我写了一个TypeScript虚拟机:Tser。Github地址:tser-project/tser。使用$brewtaptser-project/tser&&brewinstalltser安装;$tser./input.ts;为什么要创建Tser?TypeScript(TS)是一个伟大的发明,它让我们在复用JS生态的同时,拥有静态类型语言的开发体验。TS本质上是一种预编译语言,编译成JS,然后由JS虚拟机执行。由于强依赖JS,所以无法摆脱JS的一些顽固问题,比如执行效率。TS本身是一种静态类型语言,有明确的数据类型标识,但是转换成JS后类型标识丢失了;如果我们能够直接执行TS程序,而不是先转义为JS再执行,这些数据类型标记可以为程序带来很大的性能提升。下面看一组性能对比数据,只对比fib(42)在各个虚拟机或语言中的性能(这个不能作为性能评价标准;测试条件:同设备同状态,编译过程未使用任何优化)。耗时语言虚拟机执行(ms)TypeScriptdeno4150JavaScriptv8/node3859TypeScriptTser2035C++--2106TS技术发展迅速,业界越来越多的项目使用TS开发和重构;抛开TS技术的发展来看,它的终点会在哪里?它会一直使用预编译语言吗?当TS生态发展越来越健全,是否还需要完全依赖JS生态?业界会创建一个真正的TS虚拟机(Deno不是)吗?如果业界有稳定、高性能的TS虚拟机,对TS生态来说是不是一件好事,会不会把TS推向一个新的高度?这些问题我想了很久。TS应该不能取代JS的生态,但在某些领域,TS可以独立于JS的生态而存在;TS虚拟机是独立的TS生态的基石,让TS在这些领域拥有明显优于JS的运行时性能,并在这些领域带来真正的商业利益。Tser可以做什么?Tser编译性能相对较低,但运行时性能较高,更适合后台独立服务、serverless等场景。如果语法支持完善,现有的大部分用TS编写的后台服务都可以运行,这些服务可以获得很大的性能提升。Tser目前能做的东西很少,因为语法支持还不完善,只能支持一些简单脚本的执行,比如应该可以支持一些简单的云函数场景。Tser技术原理Tser的前端依赖于Antlr生成的语法解析器,进而生成并遍历语法树;后端依赖LLVM构建,将TS代码编译成LLVMIR,使用其JIT引擎立即执行IR。业界同类产品:AssemblyScript、StaticScriptTser语法支持变量,支持varletconst,var和let一样。Basictypetypebyte(in64bit)支持boolean1??number4??同int32int324??int648??float4??double8??string--??不支持operatoroperatorsupport+-*/%??++--??+=-=*=/=%=??<><=>=??=====!=!==??===目前没有区别==&&‖??!???:??()??.??逻辑控制语句支持ifelse??whiledowhile??for??switch??continue??break??函数支持大部分函数,??目前不支持函数嵌套、闭包和函数参数。Class类支持继承、多态、类组合、静态属性和静态方法、方法重载;以类似于虚拟表的方式支持类继承和多态性,多态性支持方法和属性。内置对象目前内置对象支持很低,仅供测试。内置对象方法consoledebugloginfowarnerrorDatenow目前不支持模块内置对象、EventLoop、GC等,贡献TserTser是个浩大的工程,自己一个人做起来难度很大。Tser现在还是个宝贝,希望能起到吸纳新意的作用,聚集一些有能力的人一起建设。闪点列表,一个不同的浮动列表软件。
