Pascal BESEN:轻量高效的嵌入式 JavaScript 引擎
项目概述
Pascal BESEN 是一个完全用 Object Pascal 语言编写的 JavaScript 引擎实现,由 BeRo1985 开发并维护。该项目旨在提供一个轻量级、高性能且易于集成的 JavaScript 解释器,特别适合需要嵌入式脚本功能的 Delphi 和 Free Pascal 应用程序。
核心特性
- 纯 Pascal 实现:不依赖外部库,完全用 Pascal 编写,确保跨平台兼容性
- ECMAScript 5.1 兼容:支持大多数现代 JavaScript 特性
- 轻量级设计:代码库简洁,易于理解和集成
- 高性能解释器:采用高效的字节码编译和执行机制
- 可扩展性:支持自定义原生对象和函数绑定
应用场景
- Delphi/Free Pascal 应用程序的脚本扩展
- 游戏开发中的脚本系统
- 配置文件和规则引擎
- 教育目的(学习编译器/解释器原理)
基础使用示例
1. 基本脚本执行
text
uses BESEN;
var
BESENInstance: TBESEN;
ResultValue: TBESENValue;
begin
BESENInstance := TBESEN.Create;
try
BESENInstance.Execute('var x = 10; var y = 20; x + y;', ResultValue);
Writeln('Result: ', ResultValue.ToString);
finally
BESENInstance.Free;
end;
end;
2. 函数定义与调用
text
var
BESENInstance: TBESEN;
Script: string;
begin
BESENInstance := TBESEN.Create;
try
Script :=
'function factorial(n) {' +
' if (n <= 1) return 1;' +
' return n * factorial(n - 1);' +
'}' +
'factorial(5);';
BESENInstance.Execute(Script, ResultValue);
Writeln('5! = ', ResultValue.ToString); // 输出: 120
finally
BESENInstance.Free;
end;
end;
3. 原生函数绑定
text
procedure NativeAdd(const ThisArgument: TBESENValue;
Arguments: PPBESENValues;
CountArguments: integer;
var ResultValue: TBESENValue);
begin
if CountArguments >= 2 then
ResultValue := BESENNumberValue(
Arguments^[0]^.Num + Arguments^[1]^.Num
);
end;
var
BESENInstance: TBESEN;
begin
BESENInstance := TBESEN.Create;
try
// 注册原生函数
BESENInstance.RegisterNativeFunction('add', @NativeAdd, 2, []);
// 在 JavaScript 中调用
BESENInstance.Execute('add(5, 3);', ResultValue);
Writeln('Result: ', ResultValue.ToString); // 输出: 8
finally
BESENInstance.Free;
end;
end;
4. 对象操作
text
var
BESENInstance: TBESEN;
Script: string;
begin
BESENInstance := TBESEN.Create;
try
Script :=
'var person = {' +
' name: "Alice",' +
' age: 30,' +
' greet: function() {' +
' return "Hello, " + this.name;' +
' }' +
'};' +
'person.greet();';
BESENInstance.Execute(Script, ResultValue);
Writeln(ResultValue.ToString); // 输出: Hello, Alice
finally
BESENInstance.Free;
end;
end;
高级功能示例
5. 错误处理
text
var
BESENInstance: TBESEN;
begin
BESENInstance := TBESEN.Create;
try
try
BESENInstance.Execute('undefinedFunction();', ResultValue);
except
on E: EBESENError do
Writeln('JavaScript Error: ', E.Message);
end;
finally
BESENInstance.Free;
end;
end;
6. 模块化脚本
text
procedure LoadAndExecuteModule;
var
BESENInstance: TBESEN;
Module1, Module2: string;
begin
BESENInstance := TBESEN.Create;
try
// 定义模块
Module1 := 'var utils = { version: "1.0" };';
Module2 := 'function multiply(a, b) { return a * b; }';
// 执行多个脚本(共享上下文)
BESENInstance.Execute(Module1);
BESENInstance.Execute(Module2);
BESENInstance.Execute('multiply(utils.version.length, 10);', ResultValue);
Writeln('Result: ', ResultValue.ToString);
finally
BESENInstance.Free;
end;
end;
集成建议
- 内存管理:确保正确创建和释放 TBESEN 实例
- 错误处理:使用 try-except 块捕获 JavaScript 运行时错误
- 性能优化:对于重复执行的脚本,考虑预编译
- 安全性:在沙盒环境中执行不受信任的脚本
项目优势
- 零依赖:纯 Pascal 实现,部署简单
- 源码透明:完全开源,便于调试和定制
- 活跃维护:项目持续更新,社区支持良好
- 文档齐全:提供详细的使用示例和 API 文档
Pascal BESEN 为 Pascal 开发者提供了一个强大而优雅的 JavaScript 集成解决方案,特别适合需要在应用程序中添加脚本支持的项目。其简洁的设计和良好的性能使其成为嵌入式脚本引擎的优秀选择。
注:更多高级功能和详细文档请参考项目 GitHub 页面和示例代码。
besen.zip
类型:压缩文件|已下载:1|下载方式:免费下载
立即下载




还没有评论,来说两句吧...