一个用 JavaScript 编写的简单 JavaScript 引擎,用于学习编译原理和解释器设计。
- 词法分析器 (Lexer): 将源代码转换为 token 流
- 语法分析器 (Parser): 将 token 流转换为抽象语法树 (AST)
- 解释器 (Interpreter): 执行 AST 并返回结果
- 支持的语言特性:
- 变量声明 (
let
,const
,var
) - 基本数据类型 (数字、字符串、布尔值、null、undefined)
- 算术运算 (
+
,-
,*
,/
,%
) - 比较运算 (
==
,!=
,<
,>
,<=
,>=
) - 函数声明和调用
- 条件语句 (
if
/else
) - 循环语句 (
for
,while
) - 数组和对象字面量
- 成员访问 (
obj.prop
,obj[prop]
) - 作用域和闭包
- 变量声明 (
├── src/
│ ├── lexer.js # 词法分析器
│ ├── parser.js # 语法分析器
│ ├── ast.js # AST 节点定义
│ ├── interpreter.js # 解释器
│ └── index.js # 主引擎文件
├── test/
│ └── test-lexer-parser.js # 测试文件
├── demo/
│ └── demo.js # 演示文件
└── package.json
npm install
npm run demo
npm test
import { SimpleJSEngine } from './src/index.js';
const engine = new SimpleJSEngine();
// 执行 JavaScript 代码
const result = engine.run(`
function fibonacci(n) {
if (n <= 1) return n;
return fibonacci(n - 1) + fibonacci(n - 2);
}
fibonacci(10);
`);
console.log(result.result); // 55
engine.run(code)
- 执行 JavaScript 代码engine.tokenize(code)
- 只进行词法分析engine.parse(code)
- 进行词法和语法分析engine.printAST(code)
- 打印 AST 结构engine.getASTJSON(code)
- 获取 AST 的 JSON 表示
let x = 10;
let y = 20;
let result = x + y * 2; // 50
function add(a, b) {
return a + b;
}
let sum = add(5, 3); // 8
let score = 85;
if (score >= 80) {
console.log("优秀");
} else {
console.log("需要努力");
}
let sum = 0;
for (let i = 1; i <= 10; i = i + 1) {
sum = sum + i;
}
console.log(sum); // 55
let arr = [1, 2, 3, 4, 5];
let obj = {
name: "张三",
age: 25
};
console.log(arr[0]); // 1
console.log(obj.name); // "张三"
function createCounter() {
let count = 0;
return function() {
count = count + 1;
return count;
};
}
let counter = createCounter();
console.log(counter()); // 1
console.log(counter()); // 2
将源代码字符串转换为 token 流:
"let x = 42;" → [LET, IDENTIFIER(x), ASSIGN, NUMBER(42), SEMICOLON]
将 token 流转换为抽象语法树:
[LET, IDENTIFIER(x), ASSIGN, NUMBER(42)] → VariableDeclaration AST Node
遍历 AST 并执行相应的操作:
VariableDeclaration → 在环境中定义变量 x = 42
这个项目帮助你理解:
-
编译原理基础
- 词法分析的工作原理
- 语法分析和 AST 构建
- 递归下降解析器
-
解释器设计
- 树遍历解释器
- 环境和作用域管理
- 函数调用和闭包实现
-
JavaScript 语言特性
- 变量提升和作用域
- 函数是一等公民
- 动态类型系统
-
添加更多语言特性
try
/catch
异常处理- 箭头函数
() => {}
- 模板字符串
`Hello ${name}`
- 解构赋值
-
性能优化
- 字节码编译
- 简单的 JIT 编译
- 垃圾回收优化
-
开发工具
- 调试器支持
- 源码映射
- 性能分析器
-
标准库
- 更多内置对象 (Array, Object, Math)
- 异步支持 (Promise, async/await)
- 模块系统
- Crafting Interpreters - 优秀的解释器设计教程
- ECMA-262 - JavaScript 语言规范
- Babel Parser - 生产级 JavaScript 解析器
欢迎提交 Issue 和 Pull Request!
MIT License
🎉 恭喜你完成了一个 JavaScript 引擎的学习之旅!
这个项目展示了现代编程语言引擎的核心概念。虽然功能相对简单,但它包含了真实 JavaScript 引擎的基本组件。通过学习和扩展这个项目,你将对编译原理、解释器设计和 JavaScript 语言本身有更深入的理解。