共计 1627 个字符,预计需要花费 5 分钟才能阅读完成。
我写了一个 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) |
---|---|---|
TypeScript | deno | 4150 |
JavaScript | v8 / node | 3859 |
TypeScript | Tser | 2035 |
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
, var
与let
雷同。
根底类型
类型 | 字节 (in 64bit) | 反对 |
---|---|---|
boolean | 1 | ✔️ |
number | 4 | ✔️ 同 int32 |
int32 | 4 | ✔️ |
int64 | 8 | ✔️ |
float | 4 | ✔️ |
double | 8 | ✔️ |
string | — | ✔️ 暂不反对运算 |
运算符
运算符 | 反对 | ||
---|---|---|---|
+ - * / % |
✔️ | ||
++ -- |
✔️ | ||
+= -= *= /= %= |
✔️ | ||
< > <= >= |
✔️ | ||
== === != !== |
✔️ === 与 == 目前没有区别 |
||
&& ` |
` | ✔️ | |
! |
✔️ | ||
? : |
✔️ | ||
() |
✔️ | ||
. |
✔️ |
逻辑管制语句
语句 | 反对 |
---|---|
if else |
✔️ |
while do while |
✔️ |
for |
✔️ |
switch |
✔️ |
continue |
✔️ |
break |
✔️ |
函数
反对绝大部分函数性能,函数嵌套,暂不反对闭包和函数参数。
Class
Class 反对继承、多态,反对 Class 组合,反对动态属性与静态方法,不反对办法重载;Class 继承和多态应用相似虚构表的形式来反对,多态反对办法和属性。
内置对象
目前内置对象反对力度非常低,仅用于测试。
内置对象 | 办法 |
---|---|
console |
debug log info warn error |
Date |
now |
暂不反对
module
内置对象
、Event Loop
、GC
等等。
奉献 Tser
Tser 是一个微小的工程,很难用一己之力实现。Tser 当初还是一个 baby,更心愿它能起到一个抛砖引玉的作用,能汇集起一些有能力的人来一起建设。