tompassarelli/chartroom
GitHub: tompassarelli/chartroom
Chartroom 将源码 AST 投射为声明图,通过 Datalog 引擎推导作用域正确的调用图和传递性杠杆关系,探索图原生代码智能相对于传统文本解析的优势。
Stars: 1 | Forks: 0
# Chartroom
**代码即声明,基于 [Fram](https://github.com/tompassarelli/fram)。** Chartroom
将 beagle 源码树投射到 Lodestar
用于生活和工作的同一个具象化声明图中,然后从该图中*推导*出代码智能——如调用图、作用域正确的调用者
解析、传递杠杆——将其作为对该图的查询,而不是对文本的
定制处理过程。
这与 Lodestar 所做的尝试如出一辙,且直指源码:**扁平的、
基于文本与 grep 的代码库视图会腐化且无法计算关系问题;
而图始终是最新的,并且能免费给出答案。** Chartroom
存在的意义在于弄清楚,与现有的冷解析、
单跳工具相比,这是否真的能带来实质性的提升——又或者并非如此。
## 流水线
```
*.bjs ──beagle-claims──▶ CNF triples ──load──▶ Fram claim store ──Datalog──▶ leverage / callers
(AST as claims) [s "p" o] (interned graph) (transitive closure)
```
1. **`beagle-claims`**(位于 [beagle](https://github.com/tompassarelli/beagle),`bin/beagle-claims`)将文件的
AST 转化为换行符分隔的 EDN 声明三元组 `[subj "pred" obj]` —
包含 `form-kind`、`name`、`calls` 以及统一的 **`child`** 包含边。
它是一种横切的*分析*投影,而非编译目标:它能处理
`.bjs` / `.bclj` / `.bnix`,忽略每个文件的 `#lang`。
2. **`bin/emit-corpus`** 在源码树上运行该操作 → `build/.claims`。
3. **`src/chartroom.clj`** 将三元组折叠进 Fram 存储中,推导出
**命名空间正确**的函数调用图(调用绑定在其自身
模块中的 defn——即裸符号匹配所忽略的作用域),并运行基准测试。
## 前置条件
Chartroom 是三个同级项目之上的粘合层;将它们克隆到该
仓库旁边(下方命令假设采用 `~/code/` 的目录结构),并确保
[Babashka](https://github.com/babashka/babashka) (`bb`) 在 `PATH` 中:
- **[fram](https://github.com/tompassarelli/fram)** — 声明存储 + Datalog
引擎。构建其 classpath 目录(`fram/out`);运行器会加载 `-cp ~/code/fram/out`。
- **[beagle](https://github.com/tompassarelli/beagle)** — 提供 `bin/beagle-claims`
和 `bin/beagle-roundtrip`(AST→声明投影器)。这里的 `bin/*` 通过
`$BEAGLE`(默认为 `$HOME/code/beagle`)来解析它;如果在其他地方检出,请覆盖此变量。
- **[gjoa](https://github.com/tompassarelli/gjoa)** — RESULTS.md 中基准测试所运行的
活跃语料库。任何 beagle 源码树都可以;gjoa 只是其中被测量的那一个。
## 运行说明
```
bin/emit-corpus ~/code/gjoa/src ~/code/gjoa/tools ~/code/gjoa/tests build/gjoa.claims
bb -cp ~/code/fram/out src/chartroom.clj build/gjoa.claims
```
## 它证明了什么(以及没证明什么)
有关测量结论,请参阅 **[RESULTS.md](RESULTS.md)**。简而言之:在活跃的
gjoa 语料库上,该图回答了现有工具无法回答的两个问题——**作用域正确的
调用者**(在裸符号匹配错误率为 33–67% 的情况下,实现了完美的准确度)和
**传递性爆炸半径**(这是单跳工具在结构上根本无法
呈现的基石)——并且 Fram 的 Datalog 正确地计算出了真实的调用图闭包。
两种投影,两项任务(均源自同一份源码):
- **查询投影** (`beagle-claims`) — 带有语义
覆盖(`calls`/`name`/`child`)的紧凑型 AST 声明。非常适合杠杆查询;但存在信息丢失(舍弃了
类型/参数)。约 18 个三元组/form。
- **真值投影** (`beagle-roundtrip`) — 冗长的读取器数据声明,
能够**无损地**往返程序(类型作为 token 保留,注释作为
已解析的引用保留)。图作为*事实来源*;文本作为可重新生成的
视图。约 238 个三元组/form。
## 状态
分阶段构建并验证:投影 → 杠杆基准测试 → 无损
往返 → 图原生重命名 → 作用域正确的词法解析器 →
重命名正确的注释。核心关卡保持在 **1100/1100 forms, 97/97 files**。
测量结果见 **[RESULTS.md](RESULTS.md)**;逐阶段构建
日志见 **[docs/build-log.md](docs/build-log.md)**。
标签:AST解析, Clojure, Datalog, 云安全监控, 代码分析, 凭证管理, 调用图, 静态分析