GoForum › 🌐 V2EX
大伙在没有 ai 的时候都是怎么分析开源项目的源代码
Suger828 ·
2026-01-26 21:37 ·
0 次点赞 · 3 条回复
现在有了 ai 我遇到不懂的方法直接让 ai 分析输入输出和调用关系直接就出来了 例如:opencode 的源代码
用户发送消息
↓
┌─────────────────────────────────────────────────────────────┐
│ Server (routes/session.ts:733) │
│ SessionPrompt.prompt({ ...body, sessionID }) │
└─────────────────────┬───────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────┐
│ SessionPrompt.prompt (prompt.ts:151) │
│ 1. 创建用户消息 │
│ 2. 调用 loop(sessionID) │
└─────────────────────┬───────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────┐
│ SessionPrompt.loop (prompt.ts:258) │
│ while (true) { │
│ 1. 获取 Agent 配置: Agent.get(lastUser.agent) │
│ 2. 解析工具: resolveTools({ agent, session, ... }) │
│ 3. 创建处理器: SessionProcessor.create(...) │
│ 4. 调用处理器: processor.process({ user, agent, ... }) │
│ } │
└─────────────────────┬───────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────┐
│ SessionProcessor.process (processor.ts:45) │
│ while (true) { │
│ 1. 调用 LLM: LLM.stream(streamInput) │
│ 2. 处理流式响应: │
│ - reasoning-delta → 更新推理部分 │
│ - text-delta → 更新文本部分 │
│ - tool-call → 执行工具 │
│ 3. 工具执行完成后继续循环 │
│ } │
└─────────────────────┬───────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────┐
│ LLM.stream (llm.ts) │
│ 1. 构建系统提示词 │
│ 2. 调用 AI SDK: streamText({ model, messages, tools }) │
│ 3. 返回流式响应 │
└─────────────────────────────────────────────────────────────┘
TUI ↔ Server 通信机制
架构图
┌─────────────────────────────────────────────────────────────┐
│ 主线程 (thread.ts) │
│ - 运行 TUI 界面 │
│ - 创建 RPC 客户端 │
└─────────────────────┬───────────────────────────────────────┘
│ RPC 通信
▼
┌─────────────────────────────────────────────────────────────┐
│ Worker 线程 (worker.ts) │
│ - 运行 Server.App() │
│ - 处理 fetch 请求 │
│ - 转发事件 │
└─────────────────────────────────────────────────────────────┘
Worker 启动流程
用户运行 `opencode`
↓
index.ts 解析命令 → TuiThreadCommand ($0 默认命令)
↓
thread.ts handler 执行:
↓
第 79-85 行:确定 worker 文件路径
↓
第 93 行:创建 Worker 线程
const worker = new Worker(workerPath, { env: ... })
↓
第 101 行:创建 RPC 客户端与 Worker 通信
const client = Rpc.client<typeof rpc>(worker)
↓
第 143 行:启动 TUI 界面
const tuiPromise = tui({ url, fetch: customFetch, ... })
之前没有 ai 的时候经常一个方法看半天看不懂
3 条回复
添加回复
你还需要 登录
后发表回复
其实搜一下源码分析方面的博客文章还是蛮多的
有动态分析和静态分析
动态分析最简单的办法就是打断点,从入口开始一行一行跟着走,然后做笔记记录
静态分析就是用 SourceInsight 或者任何一个支持 F12 找到原始 definition 的 IDE/Editor 逐层查看调用链,然后做笔记记录
如果不知道编译或者不知道项目怎么跑起来的话就先去看 CI 配置