我写了一个TypeScript虚拟机: Tser。
Github地址:tser-project/tser。

装置应用

$ brew tap tser-project/tser && brew install tser;$ tser ./input.ts;

为什么要发明Tser?

TypeScript(TS)是一个平凡的创造,让咱们在复用JS生态的同时领有了动态类型语言的开发体验。
TS实质是一门预编译语言,编译到JS后再应用JS虚拟机执行,因为强依赖于JS,也因而无奈解脱JS的一些顽疾,比方执行效率。而TS自身是动态类型语言,领有确定的数据类型标记,只是在本义为JS时失落了类型标记;如果咱们能间接执行TS程序,而不是先本义为JS再执行,这些数据类型标记能够为程序带来很大的性能晋升。

咱们来看一组性能比照数据,仅比照fib(42)在各个虚拟机或语言中的性能体现(并不能齐全依此来作为性能评估规范;测试条件:同一设施同一状态,编译过程均未应用任何优化)。

语言虚拟机执行耗时(ms)
TypeScriptdeno4150
JavaScriptv8 / node3859
TypeScriptTser2035
C++--2106

TS技术倒退很快,业界曾经有越来越多的我的项目应用TS开发和重构;抛开眼下去看TS技术的倒退,它的起点会在哪里?会始终停留在一个预编译语言上吗?当TS生态倒退越来越健全,是不是还有必要齐全依靠于JS的生态?业界会不会诞生一个真正的TS虚拟机(Deno并不是)?如果业界有一个稳固且高性能的TS虚拟机,对TS生态是不是一件坏事,会不会将TS推向一个新的高度?

这些问题思考了很久。

<u>TS应该无奈取代JS的生态,然而在某些畛域,TS能够脱离JS生态而独立存在;TS虚拟机是独立TS生态的基石,能够让TS在这些畛域有显著优于JS的运行时体现,并为这些畛域带来理论的业务收益。</u>

Tser能做什么?

Tser编译性能绝对不高而运行时性能高,更适宜独立后盾服务、Serverless等场景。如果语法反对欠缺,能够运行绝大部分现有的应用TS编写的后盾服务时,这些服务能够因而取得很大的性能晋升。

Tser目前能做的事件还非常少,因为语法反对很不欠缺,仅能反对一些简略脚本的执行,比方应该可能反对一些简略的云函数场景。

Tser技术原理

Tser前端依靠于Antlr来生成的语法解析器,而后进行语法树的生成与遍历;后端依靠于LLVM建设,将TS代码编译为LLVM IR,并应用其JIT引擎立刻执行IR。

业界雷同产品: AssemblyScript、StaticScript

Tser语法反对

变量

反对var let const, varlet雷同。

根底类型

类型字节 (in 64bit)反对
boolean1✔️
number4✔️ 同int32
int324✔️
int648✔️
float4✔️
double8✔️
string--✔️ 暂不反对运算

运算符

运算符反对
+ - * / %✔️
++ --✔️
+= -= *= /= %=✔️
< > <= >=✔️
== === != !==✔️ =====目前没有区别
&& ``✔️
!✔️
? :✔️
()✔️
.✔️

逻辑管制语句

语句反对
if else✔️
while do while✔️
for✔️
switch✔️
continue✔️
break✔️

函数

反对绝大部分函数性能,函数嵌套,暂不反对闭包和函数参数。

Class

Class反对继承、多态,反对Class组合,反对动态属性与静态方法,不反对办法重载;Class继承和多态应用相似虚构表的形式来反对,多态反对办法和属性。

内置对象

目前内置对象反对力度非常低,仅用于测试。

内置对象办法
consoledebug log info warn error
Datenow

暂不反对

module 内置对象Event LoopGC等等。

奉献Tser

Tser是一个微小的工程,很难用一己之力实现。Tser当初还是一个baby,更心愿它能起到一个抛砖引玉的作用,能汇集起一些有能力的人来一起建设。