← 返回信息流
AI 资讯Hacker News·3 天前

Hobbes 语言和嵌入式即时编译器发布

原标题:Hobbes – A Language and Embedded JIT Compiler

速览

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 代表的是一种回归系统编程语言传统价值的设计思路:将性能与可控性置于安全性之上。它与目前主流的“安全

查看原文 →github.com