V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
Suger828
V2EX  ›  程序员

大伙在没有 ai 的时候都是怎么分析开源项目的源代码

  •  
  •   Suger828 · 1 天前 · 1919 次点击

    现在有了 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 的时候经常一个方法看半天看不懂

    19 条回复    2026-01-27 20:18:05 +08:00
    changwei
        1
    changwei  
       1 天前   ❤️ 1
    其实搜一下源码分析方面的博客文章还是蛮多的

    有动态分析和静态分析

    动态分析最简单的办法就是打断点,从入口开始一行一行跟着走,然后做笔记记录

    静态分析就是用 SourceInsight 或者任何一个支持 F12 找到原始 definition 的 IDE/Editor 逐层查看调用链,然后做笔记记录

    如果不知道编译或者不知道项目怎么跑起来的话就先去看 CI 配置
    thinszx
        2
    thinszx  
       1 天前   ❤️ 3
    我们那时候哪有这条件啊😭
    x86
        3
    x86  
       1 天前
    ♻️ ctrl+c,ctrl+v,ctrl+shift+f
    donaldturinglee
        4
    donaldturinglee  
       1 天前
    只要不是 Java 的就还好,有基础的基本上能看懂。Java 的话得一层层点进去才知道是要干嘛的
    jackmod
        5
    jackmod  
       1 天前
    能在自己机子上编译跑起来就成功了一半,剩下是俺寻思之力。
    俺寻思这个文件是那个功能,就直接观察。
    俺寻思这个 method 是对的,下个断点。
    为啥能俺寻思,因为特定语言或框架都有相应特点,基本上能猜到里面是啥。

    实在俺寻思不出来的话也不要憋着,去发个 issue 询问维护者(注意「提问的智慧」)。
    ProphetN
        6
    ProphetN  
       1 天前
    所以以前经常出现开源投毒,以后有 AI Review 之后,应该可以根绝了。
    aisk
        7
    aisk  
       22 小时 54 分钟前
    用 deepwiki 或者 codewiki ?
    youshangdemajia
        8
    youshangdemajia  
       20 小时 34 分钟前
    以前很多各种源码剖析之类的书。我就看过 MFC/STL/Lua/Redis 的。
    levelworm
        9
    levelworm  
       17 小时 32 分钟前
    @changwei #1
    多谢。我最近在看操作系统开发的东西,做完了 xv6 的 lab ,转过头去做 Linux 的,感觉两者的复杂度相差太远。我目前用 VSCode + clangd lang server 看,但是感觉还是没头绪,不知道有没有免费的 sourceinsight 之类的软件,或者相对便宜一些的?

    不过话说回来,我可能还是底子太薄弱了,连 Linux 的编译系统也看不懂。一大堆 Makefile 和 Kbuild ,还有很多 Python 脚本,的确头大,只敢跟着课程跑,生怕一个命令搞错了没法恢复。
    ooo000
        10
    ooo000  
       17 小时 9 分钟前
    OpenGrok
    iorilu
        11
    iorilu  
       16 小时 44 分钟前
    你这个流程图看的很清楚阿

    一般用什么提示词可以得到
    Suger828
        12
    Suger828  
    OP
       15 小时 35 分钟前
    @iorilu 让 cc 输出方法调用流程
    feelapi
        13
    feelapi  
       14 小时 31 分钟前
    scitools 的 understand 比 sourceinsight 更强,但是很贵。
    这种软件并不复杂,静态解析源代码,建立数据库,提取信息各种分析。understand 的很多功能实际上是 perl,python 实现的,但是代码的统计分析很强
    godall
        14
    godall  
       13 小时 48 分钟前
    请问楼主,你是一个个源码文件让 ai 分析某个函数,还是直接整个工程给 ai ?
    Suger828
        15
    Suger828  
    OP
       12 小时 46 分钟前
    @godall 看你目的
    godall
        16
    godall  
       12 小时 44 分钟前
    @Suger828 不是啊,就是你前面分析的这个过程,是怎么分析的,是喂一个源文件,还是整个工程喂给她?
    Suger828
        17
    Suger828  
    OP
       10 小时 33 分钟前
    @godall 用到 Claude code ,他会根据你问他搜索探索文件回答
    changwei
        18
    changwei  
       7 小时 46 分钟前 via Android   ❤️ 1
    @levelworm 很巧,OS 这方面我刚好有研究。学 OS 和计算机组织结构的话可以先从 ARM 和 RTOS 这种比较简单的架构入手,你可以参考我在知乎写的文章 https://zhuanlan.zhihu.com/p/350587132 ,我是根据自己手写的一个最小版 RTOS 来讲解的,参考代码 https://github.com/cw1997/ez-rtos
    levelworm
        19
    levelworm  
       3 小时 56 分钟前
    @changwei #18
    多谢大佬,我正好没有写过 scheduler,向你的项目学习一下。
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   1883 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 16:14 · PVG 00:14 · LAX 08:14 · JFK 11:14
    ♥ Do have faith in what you're doing.