Jade Dungeon

QucikJS

特点

因为 QuickJS 这样的东西没有早出来几年,否则根本没有 Lua 什么事情,归根揭底,Lua 并不是一门好语言:

  • 作用域默认是global的,不是local的,但凡最近三十年发明的语言, 变量和函数定义基本都是默认local的作用域 ,lua 这种默认global的设计, 强迫你到处写满local,简直是一口气直追 50 年前的古圣先贤。
  • 索引从 1 开始:记忆里只有 Pascal / QBasic 是这么做的,但 pascal 事实上允许索引从任意位置开始(从 0 / 1 / 100 开始都可以)。
  • 到处是nil,你的代码四处和nil作斗争,明明可以有更优雅的机制的,却什么都用nil
  • 到现在都没有 unicode 支持,字符串是bytes的别名。
  • 到现在都没有 switch/case,只能写几十行 if/else,隔壁 python 都能模式匹配了。
  • 到现在都没有 type hint ,隔壁的 python 在 7 年前就有 type hint 和 type check 了。
  • 项目更新速度异常缓慢,最近十年尤其如此,作者以出世的态度做入世的项目。
  • 前几个版本 table 长度好像还要自己数,现在不用了,但至今打印个 table 内容都没标准方法
  • 至少有 5 种方法定义一个模块,3 种方法定义一个类。
  • 缺乏基础库,每个项目都重新发明了一套,导致你的脚本很难跨项目复用。
  • 一个项目里的代码基本很难不做修改的给第二个项目用,知识无法积累。
  • 缺乏妥善的周边工具。
  • 更多的选择意味着更多的迷惑与更多的束缚,选择多看似更好,但往往最终带来更多痛苦。

明明是 90 年代才发明的语言,浑身透着一股 60-70 年代的味道。

那么使用 QuickJS 代替 lua 的有哪些好处呢?

  • QuickJS 同 Lua 一样小巧,代码就几个文件,运行只需要 200KB 的内存就能跑个简单程序。
  • QuickJS 遵从 ES2020标准,可以跑全部 ES2020 测试用例,也能轻松支持 TypeScript。
  • 基于 JS 的技术栈有丰富的前人成果供你使用,生态更好。
  • JavaScript 的人员很容易招聘。
  • 少打字:{ }vsbegin end
  • JavaScript 有Uint8Array,Float32Array等内建类型,能比 Lua 更高效的处理媒体数据。
  • 简单逻辑直接用 JavaScript 撸,复杂业务可以上优雅又安全的 TypeScript 。
  • 逻辑可以复用到 Web / Electron 上,向 web 迁移容易很多。
  • QuickJS 在众多 JS 虚拟机实现里,性能是比较好的,V8 下来就是它了。
  • Lua 在 github 上只有 1 万个开源项目,很多还是用 Lua 的宿主项目和 neovim 配置,非纯 Lua 项目,你复用不了。
  • JavsScript 在 github 上有 38 万个项目,大部分是可以用被你复用的纯 js 项目。
  • TypeScript 短短几年,在 github 上就有 13 万个项目了。
  • 团队在 JavaScript 上积累的知识可复用到:移动应用,桌面应用和 web 开发,不光做游戏。
  • JS/TS 有很多优秀的开发环境和丰富的周边工具。

事实上周边一些中型引擎最近两年都完成了 QuickJS 的集成, 用它逐步替代 Lua,架不住 js 的人好招聘,技术生态好, 架不住 js 还可以有 ts 的加持。

所以说,QuickJS 要是早出来几年,根本没 Lua 什么事情了,老项目选 Lua 是没办法, 新项目可以多看看,多比较下,没必要看着继续在 Lua 上面继续浪费时间。

例如用Typescript定义类:

class Persion {
	private name  : string;
	private age   : number;
	private salary: number;
	
	constructor(name: string, age: number, salary: number) {
		this.name   = name  ;
		this.age    = age   ;
		this.salary = salary;
	}
	
	toString(): string {
		return `${this.name} (${this.age}) (${this.salary})`;
	}
	
}


var p = new Persion("skywind", 18, 8000)
console.log(p.toString())

当前最新版是 quickjs-2021-03-27版。

Linux平台下的安装很容易,在Linux 直接下载 源码,然后进入安装目录:

make && make install