Hobbes 语言和嵌入式即时编译器发布
速览
Hobbes 是一种新型编程语言,内置嵌入式即时编译器(JIT Compiler),旨在提升运行时性能。它为开发者提供更灵活的执行路径优化能力,在实时计算和 AI 推理场景有潜在应用价值。该语言设计兼顾简洁与高效,可能推动底层系统性能的突破。
AI 深度解读
背景
Hobbes 是一门专门为高性能 C/C++ 应用集成而设计的语言,同时也是一个嵌入式即时编译器(JIT)和运行时系统。它的主要目标是实现高效的动态表达式求值、数据存储与分析。Hobbes 强调与 C/C++ 生态的深度互操作,而非提供沙箱或运行时安全特性。该项目的设计思路来源于对性能极致追求的场景,例如实时数据处理、系统编程和嵌入式分析任务。
核心内容
语言设计与运行时特性
Hobbes 是一门强类型语言,具备编译时类型检查,但有意放弃了沙箱运行时环境和运行时安全特性(如数组边界检查)。它直接暴露内存访问能力,不提供越界保护。此外,Hobbes 支持通过远程过程调用(RPC)在网络中编译和执行原生机器码,但该功能仅限受信任的内部网络使用,用户需充分理解其安全影响。
构建与依赖
构建 Hobbes 需要以下依赖:
- LLVM 3.3 或更高版本
- cmake 3.4 或更高版本
- GNU gcc 4.8 或更高版本
- Linux 内核 2.5 或更高版本
标准构建流程为:
$ cmake .
$ make
$ make install
若 LLVM 安装位置非标准,需设置环境变量 LLVM_DIR 指向包含 LLVMConfig.cmake 的目录。
构建产物包括:
- 静态库
libhobbes.a(用于链接进 C++ 可执行文件) - 位置无关静态库
libhobbes-pic.a(用于生成.so动态库) - 两个实用程序:
hi(交互式解释器)和hog(高效记录结构化数据到文件,这些文件可被hi加载查询)
嵌入 C++ 示例
以下代码演示了如何在 C++ 中嵌入 Hobbes,实现一个类似 hi 的基本 shell:
#include <iostream>
#include <stdexcept>
#include <hobbes/hobbes.H>
int main() {
hobbes::cc c;
while (std::cin) {
std::cout << "> " << std::flush;
std::string line;
std::getline(std::cin, line);
if (line == ":q") break;
try {
c.compileFn<void()>("print(" + line + ")")();
} catch (std::exception& ex) {
std::cout << "*** " << ex.what();
}
std::cout << std::endl;
hobbes::resetMemoryPool();
}
return 0;
}
编译该程序需要链接 Hobbes 和 LLVM 的库,典型命令如下(路径需根据实际安装调整):
$ g++ -pthread -std=c++17 -I <hobbes-headers> -I <llvm-headers> test.cpp -o test \
-L <hobbes-libs> -lhobbes -ldl -lrt -ltinfo -lz \
-L <llvm-libs> `llvm-config --libs x86asmparser x86codegen x86 mcjit passes`
内存管理机制
Hobbes 使用“内存区域”(memory region)管理动态分配的内存。区域是可动态增长的字节序列,分配极快,释放时通过 hobbes::resetMemoryPool() 整体回收。每个区域是线程局部的,因此多个线程可以并发使用同一个函数指针而无需同步。这种设计要求开发者明确划分“逻辑事务”边界。
语言特性与表达式示例
Hobbes 支持以下基本类型和常量:
- 单元类型
() - 布尔型
false,true - 字符
'c' - 字节
0Xff - 短整数
42S - 整数
42 - 长整数
42L - 单精度浮点
42.0f - 双精度浮点
42.0
组合类型:
- 数组:
[1, 2, 3],字符串"foobar",字节数组0xdeadbeef - 记录(record):
{name="Jimmy", age=45, job="programmer"} - 元组:
("Jimmy", 45, "programmer") - 数组/元组/记录可打印为表格形式
- 变体(variant):
|food="pizza"|::|vehicle:int,food:[char]| - 等递归类型构建的链表:
cons("chicken", cons("hot dog", cons("pizza", nil())))
这些类型构造器构成了类似 ML 语言家族(如 SML、OCaml、Haskell)的代数数据类型。Hobbes 还支持类型类(type classes)和用户定义的约束解析器,允许混合类型算术与类型推断共存:
> 0X01+2+3.0+4L+5S
15
通过 hi 的 :t 命令可以查看表达式类型,例如:
> :t {name="Jimmy", age=45, job="programmer"}
{ name:[char], age:int, job:[char] }
> :t \x.x.foo
(a.foo::b) => (a) -> b
关键要点
- 无沙箱设计:Hobbes 直接操作内存,无边界检查,无运行时安全措施,适合对性能敏感且可完全信任内部环境的场景。
- 嵌入式 JIT 编译器:通过
hobbes::cc对象在 C++ 代码中动态编译 Hobbes 表达式为原生机器码,支持异常处理机制捕获编译/运行时错误。 - 高效内存管理:采用“内存区域”整体分配/回收策略,线程本地,避免锁竞争,但要求程序员手动管理事务边界。
- 远程编译执行:支持 RPC 方式在网络中编译并运行 Hobbes 代码,但明确限制仅用于受信内部网络。
- 强类型与类型推断:支持代数数据类型、类型类、用户定义约束解析器,混合类型算术自动提升。
- 丰富的原始类型与组合:提供单元、布尔、字符、字节、整数(多种宽度)、浮点(单/双精),以及数组、记录、元组、变体、递归类型。
- 跨语言集成:Hobbes 专为与 C/C++ 应用紧密耦合而设计,生成静态库可供链接,并附带交互式解释器
hi和数据记录工具hog。 - 构建依赖:需要 LLVM 3.3+、cmake 3.4+、gcc 4.8+、Linux 2.5+ 内核。
意义与影响
Hobbes 代表的是一种回归系统编程语言传统价值的设计思路:将性能与可控性置于安全性之上。它与目前主流的“安全
