Skip to content

Claude Code 深度架构分析

原文: Claude Code: An Analysis - SouthbridgeAI

作者: Hrishi Olickel & Claude Opus 4 & Gemini 2.5 Pro

发布日期: 2025年6月3日

翻译与整理: LearnGraph.online


目录

  1. 前言
  2. 为什么 Claude Code 很重要
  3. 依赖架构
  4. 数据结构与信息架构
  5. 控制流与编排引擎
  6. 工具与执行引擎
  7. 系统架构:引擎室
  8. 创新组件
  9. 文件编辑系统
  10. 提示工程的艺术
  11. LLM 视角:接收指令的真实感受
  12. 总结

前言

本文是对 Claude Code 架构的深度分析报告。作者使用多个 AI 子代理来分析 Claude Code 的架构,生成了约 30 万 token 的中间分析内容,并在一天内将其浓缩成这份综合报告。

这是一次独特的逆向工程尝试——通过分析可观察的行为和常见的 Node.js 模式来推断 Claude Code 的内部架构。

Claude Code 架构概览


为什么 Claude Code 很重要

Claude Code 展示了四个关键能力,每一个都代表了 AI 编程助手领域的重要突破:

1. 流式架构 (Streaming Architecture)

Claude Code 能够实时处理 LLM 响应、工具执行和 UI 更新。这不是简单的请求-响应模式,而是一个复杂的状态机,能够在毫秒级别处理多个并发数据流。

2. 安全系统 (Safety Systems)

安全机制在不干扰工作流程的情况下提供保护。正如文中所述:

"安全不是单一系统——而是多个独立的层,能够安全地失败。"

3. 工具设计 (Tool Design)

工具设计优雅地连接了 AI 推理和系统执行。每个工具都是一个精心设计的接口,既能让 LLM 理解其功能,又能高效地执行实际操作。

4. 提示工程 (Prompt Engineering)

提示工程可靠地控制复杂的 LLM 行为。通过渐进式披露、示例驱动和行为塑造等技术,实现了精确的行为控制。


依赖架构

终端中的 React

Claude Code 做出了一个非常规的选择:在终端中使用 React 的协调算法来管理 UI,而不是命令式的状态管理。

核心框架:
├── React 18.2.0      → UI 协调
├── Ink 3.2.0         → 终端渲染器
└── Yoga-layout       → WebAssembly Flexbox 计算 (亚毫秒级)

关键洞察: 每次 UI 更新都经过 React 的 diff 算法,然后由 yoga-layout 计算最优的终端字符位置。这就是"终端中的虚拟 DOM"。

流式解析器架构

Claude Code 实现了自定义解析器来处理:

解析器类型功能
Shell 解析器通过哨兵字符串嵌入 JSON 对象
XML 解析器流式处理,支持部分文档恢复
环境变量扩展类型保持的变量展开

多平台 LLM 抽象

支持多个供应商,具有智能回退机制:

  • Anthropic (主要,原生 SDK)
  • AWS Bedrock (跨区域故障转移,SigV4 认证)
  • Google Vertex (自动令牌刷新)

遥测三重栈

Claude Code 使用三个互补的可观测性系统:

┌─────────────────────────────────────────────────────────────┐
│                     遥测三重栈                               │
├─────────────────────────────────────────────────────────────┤
│  Sentry          │ 错误追踪、ANR 检测、性能分析              │
│  OpenTelemetry   │ 自定义 span、token 计数器、延迟直方图     │
│  Statsig         │ A/B 测试、渐进式发布、动态配置            │
└─────────────────────────────────────────────────────────────┘

ANR (Application Not Responding) 检测: 使用 worker 线程监控主事件循环阻塞,这是一个值得注意的创新。

依赖分类

核心 CLI 框架 (15+ 包)

  • Commander, Chalk, Ink - 界面管理
  • String-width, wrap-ansi - 终端文本处理
  • CLI-highlight - 语法高亮支持

数据处理 (8+ 包)

  • Zod - Schema 验证和类型安全
  • Marked/Turndown - Markdown 处理
  • Sharp - 图像优化 (离堆 libvips)
  • Diff - 文本比较 (Myers 算法)

文件系统智能 (6+ 包)

  • Glob, picomatch, minimatch - 模式匹配
  • Ignore 库 - .gitignore 规则处理
  • LRU 缓存优化 - 已编译模式的缓存

安全架构

输入验证层:
用户输入 → Zod Schema → 验证后数据 → 工具执行

主要实践:

  • 不直接使用 child_process
  • 没有动态 require 模式
  • macOS 上的原生 Keychain 集成

性能优化策略

组件策略
文件读取通过 glob.stream 流式处理
图像处理原生 Sharp + 离堆 libvips
XML 解析基于事件,常量内存
UI 渲染虚拟 DOM + 最小化更新

启动优化: 延迟加载昂贵的依赖项 (sharp, AWS SDK, Google Auth 库)


数据结构与信息架构

流式状态机:消息如何转换

架构实现了三阶段表示系统:

┌─────────────────────────────────────────────────────────────────┐
│                    消息三阶段转换                                │
├─────────────────────────────────────────────────────────────────┤
│  阶段 1: CLI 内部表示                                            │
│  ├── Type: "user" | "assistant" | "attachment" | "progress"     │
│  ├── UUID 和时间戳追踪                                           │
│  └── 可选的 API 兼容消息字段                                      │
├─────────────────────────────────────────────────────────────────┤
│  阶段 2: API 线上格式                                            │
│  ├── 清晰的基于角色的结构                                         │
│  ├── 内容为字符串或 ContentBlock 数组                            │
│  └── 无 CLI 特定元数据                                           │
├─────────────────────────────────────────────────────────────────┤
│  阶段 3: 流式累加器                                              │
│  ├── 部分消息追踪                                                │
│  ├── 内容块增量                                                  │
│  └── 工具输入的 JSON 缓冲区                                       │
└─────────────────────────────────────────────────────────────────┘

ContentBlock:多态构建块

内容类型包括:

类型内存复杂度解析时间可流式
TextBlockO(text.length)O(1)
ImageBlockO(1) + 外部引用O(1)
ToolUseBlockO(JSON length)O(n)
ToolResultBlock---
ThinkingBlock---

平台特定类型:DocumentBlock, VideoBlock, GuardContentBlock, ReasoningBlock, CachePointBlock

流式 JSON 挑战

当 LLM 流式传输工具使用请求时,它不会一次发送完整的 JSON。系统实现了一个流式 JSON 解析器:

  1. 追踪 JSON 结构深度
  2. 监控字符串边界
  3. 处理转义序列
  4. 当深度达到 0 时尝试解析
  5. 为修复而自动闭合未关闭的字符串

消息生命周期流程

用户输入 → CliMessage → APIMessage → LLM 流 →
ContentBlockDelta → AccumulatedMessage →
[ToolUseBlock → 工具执行 → ToolResult] 或 [最终消息] → 显示

系统提示:动态上下文组装

按优先级顺序组装的来源:

  1. 基础指令 (~2KB)
  2. 模型特定适配 (~500B)
  3. CLAUDE.md 内容 (5-50KB 典型)
  4. Git 上下文 (1-5KB)
  5. 目录结构
  6. 工具定义 (10-20KB)

CLAUDE.md 层级加载

优先级从高到低:

1. .claude/CLAUDE.md          (本地)
2. ~/.claude/CLAUDE.md        (用户)
3. <项目>/.claude/CLAUDE.md   (项目)
4. /etc/claude-code/CLAUDE.md (托管)

支持 @override@append 指令的合并策略。

权限上下文

权限规则的优先级排序:

cliArg          (最高)

localSettings

projectSettings

policySettings

userSettings    (最低)

模式: "default" | "acceptEdits" | "bypassPermissions"

MCP 协议结构

JSON-RPC 2.0 实现 带扩展:

McpMessage (带可选 ID 的基础)
    ├── McpRequest (method + params)
    └── McpResponse (result 或 error)

能力协商:

  • 实验性功能
  • 工作区根目录
  • LLM 采样委托
  • 动态提示
  • 资源服务
  • 工具暴露
  • 日志转发

MCP 状态机

Disconnected → Connecting → Initializing → Ready
Ready ↔ Ready (request/response, notification)
Ready → Closing → Disconnected
Connecting/Initializing → Failed → Disconnected (reset)

性能优化技术

字符串驻留 (String Interning):

  • 常见值 ('user', 'assistant', 'end_turn' 等) 缓存
  • 引用复用以提高内存效率

延迟内容块解析:

  • 初始存储原始内容
  • 解析推迟到访问时
  • O(n) 解析成本仅在需要时发生

WeakRef 文件状态:

  • 使用 WeakRef 进行自动垃圾回收
  • FinalizationRegistry 用于缓存清理
  • 不再引用时内容可被 GC

控制流与编排引擎

主对话循环 (tt 函数)

Claude Code 的核心是一个复杂的状态机,通过六个阶段编排整个对话流程:

六阶段处理管道

┌──────────────────────────────────────────────────────────────┐
│                     六阶段处理管道                            │
├──────────────────────────────────────────────────────────────┤
│  阶段 1: 上下文准备          │ ~50-200ms                     │
│  阶段 2: 自动压缩检查        │ ~0-3000ms (如触发)            │
│  阶段 3: 系统提示组装        │ ~10-50ms                      │
│  阶段 4: LLM 流处理          │ ~2000-10000ms                 │
│  阶段 5: 工具执行            │ ~100-30000ms 每工具           │
│  阶段 6: 递归或完成          │ ~0ms                          │
└──────────────────────────────────────────────────────────────┘

阶段 1: 上下文窗口管理

系统在超过阈值时实现自动对话压缩:

阈值类型数值
Token 数量100,000
消息数量200
成本阈值$5.00

压缩过程通过 LLM 在汇总其他内容的同时保留关键消息。

阶段 2: 动态系统提示组装

模型特定调整因 LLM 层级 (Opus, Sonnet, Haiku) 而异。

阶段 3: 流式状态机

事件驱动处理:

  • 消息开始事件
  • 内容块管理
  • 工具输入 JSON 累积
  • 带恢复策略的错误处理

性能指标:

  • 首 token 延迟: 300-800ms
  • Token 吞吐量: 50-100 tokens/秒
  • 内存: 无论响应长度如何都保持常量

阶段 4: 工具执行管道

执行策略:

  • 只读工具: 并行执行 (10 个并发)
  • 写入工具: 顺序执行
工具类型并发性延迟瓶颈
ReadTool并行 (10)10-50ms磁盘 I/O
GrepTool并行 (10)100-500msCPU 正则
WebFetchTool并行 (3)500-3000ms网络
EditTool顺序20-100ms验证
BashTool顺序50-10000ms进程执行
AgentTool并行 (5)2000-20000ms子 LLM 调用

阶段 5: 权限控制流

多级决策树:

  1. 显式拒绝规则 (最高优先级)
  2. 模式覆盖
  3. 显式允许规则
  4. 交互式提示

阶段 6: 递归轮次管理

系统为多轮交互实现尾递归,最大深度为 10 轮。

输入路由状态机

基于模式检测路由输入:

  • 斜杠命令 (/command)
  • Bash 模式 (!command)
  • 记忆模式 (#note)
  • 代码块
  • 普通提示

流反压管理

实现带可配置阈值的缓冲策略 (最大 1000 个缓冲事件),防止高流量流式传输期间系统过载。

AgentTool 层级结构

为任务分解创建子代理:

  • 将任务分析为子任务
  • 生成隔离的子代理 (排除 AgentTool 递归)
  • 并行运行任务并追踪进度
  • 通过 LLM 综合结果

错误恢复

实现基于策略的恢复:

错误类型恢复策略
速率限制多提供商回退
上下文溢出Token 缩减 + 压缩
工具错误优雅降级
网络错误重试逻辑
权限拒绝用户提示

工具与执行引擎

执行管道

系统在整个过程中使用异步生成器,实现"流式进度更新同时维护清晰的错误边界"。管道遵循四个阶段:

1. 输入验证 (Zod schema)    → O(n) 复杂度, <1ms 典型
2. 权限检查 (用户对话能力)
3. 工具执行 (进度 yield)
4. 结果转换                 → O(输出大小), <5ms

Shell 解析器创新

自定义解析器允许 JavaScript 对象通过 shell 命令传递,使用随机哨兵进行对象嵌入。这使得命令如:

bash
mytool --config=$CONFIG --name="test"

能够产生正确类型化的参数,而不是字符串化的值。

文件操作工具

ReadTool

支持文本、图像和 Jupyter notebook 的多模态文件读取器:

  • 行号格式化
  • 图像调整大小 (最大 1024×1024)
  • 大文件流式处理
  • 性能: <10ms 对于 <1MB 文件; 500ms+ 对于 >100MB

EditTool 与 MultiEditTool

EditTool 执行精确字符串替换,带验证检查:

  • 文件读取验证
  • 外部修改检测
  • 出现次数计数

MultiEditTool 应用原子顺序编辑,带冲突检测。

BashTool

具有多个安全层的复杂工具:

  • 禁止的命令 (find, grep, cat, ls)
  • 危险命令警告 (rm, dd, mkfs)
  • macOS sandbox-exec 支持
  • 1MB 输出限制,带截断
  • 流式 stdout/stderr

搜索与发现

GrepTool: 使用 ripgrep 进行高性能正则搜索,支持文件分组和忽略模式。

AgentTool: 通过子代理执行实现层级任务分解:

  • 并行任务支持 (最多 5 个并发)
  • Token 预算计算
  • 结果综合
  • 递归预防

性能特征

工具延迟可并行
ReadTool10-50ms
GrepTool100-500ms
AgentTool2-20s
BashTool50ms-30s✗*

*仅只读命令

安全模式

  • 路径验证: 拒绝模式 (/etc/passwd, ~/.ssh/id_rsa, 系统目录)
  • 弱引用: 带自动清理的文件缓存
  • 结果截断: 防止内存溢出
  • 权限上下文: 区分 allow/deny/ask 行为

系统架构:引擎室

核心架构概述

系统以 tt 异步生成器函数为中心,编排从用户输入到 LLM 通信再到工具执行的所有交互。

tt 控制循环签名

typescript
async function* tt(
  currentMessages: CliMessage[],
  baseSystemPromptString: string,
  currentGitContext: GitContext,
  currentClaudeMdContents: ClaudeMdContent[],
  permissionGranterFn: PermissionGranter,
  toolUseContext: ToolUseContext,
  activeStreamingToolUse?: ToolUseBlock,
  loopState: {
    turnId: string,
    turnCounter: number,
    compacted?: boolean,
    isResuming?: boolean
  }
): AsyncGenerator<CliMessage, void, void>

分层架构

五个不同的层,具有通信模式:

  • 向下: 直接函数调用
  • 向上: 事件和回调
  • 跨层: 共享上下文对象

反压管理

阈值级别事件数策略
高阈值1,000丢弃非关键事件
临界阈值5,000仅保留错误/停止
批处理100/周期每周期处理事件数

状态管理

全局会话状态 (单例)

追踪:

  • sessionId
  • cwd (工作目录)
  • totalCostUSD
  • totalAPIDuration
  • modelTokens

弱引用文件状态

使用 WeakRef 和 FinalizationRegistry 进行自动垃圾回收清理,通过文件时间戳进行新鲜度检查。

安全架构:三层防御

三层安全防御

text
┌─────────────────────────────────────────────────────────────┐
│                      三层安全防御                            │
├─────────────────────────────────────────────────────────────┤
│  层 1: 权限系统                                              │
│  按优先级评估: CLI 参数 > 本地设置 > 项目设置 > 策略 > 用户偏好 │
├─────────────────────────────────────────────────────────────┤
│  层 2: 沙箱 (macOS)                                          │
│  使用 sandbox-exec 实现配置文件生成,控制文件/网络访问         │
├─────────────────────────────────────────────────────────────┤
│  层 3: 路径验证                                              │
│  拒绝: SSH/GPG 密钥、系统目录、私钥、环境文件;强制边界        │
└─────────────────────────────────────────────────────────────┘

ANR 检测

Worker 线程使用可配置阈值 (默认 5000ms) 监控事件循环,在无响应时通过 inspector 协议捕获堆栈跟踪。

战略缓存

三层方法:

层级类型用途
L1内存 LRU 缓存Schema、模式
L2WeakRef 文件内容缓存文件内容
L3带 TTL 的磁盘缓存持久化数据

可观测性:三大支柱

系统功能
Sentry带事务 span 和状态捕获的错误追踪
OpenTelemetry指标收集 (API 调用、tokens、工具执行、延迟)
Statsig带用户上下文和动态配置的功能门控

资源管理

进程生命周期

  • 最大 10 个并发进程
  • 每进程限制: 512MB
  • 总系统限制: 2GB

网络池

  • Anthropic: 10 个连接
  • 其他: 5 个连接
  • 30 秒空闲超时

创新组件

1. 流式 JSON 解析器

解决的挑战:"LLM 流式传输工具使用请求时,不会一次发送完整的 JSON。"

解析器通过逐字符状态追踪处理不完整的片段,维护嵌套结构的深度计数器和转义序列检测。恢复策略自动关闭未闭合的结构。

性能:

  • <1KB: 100% 成功率
  • 1-10KB: 99.9% 成功率
  • 所有大小: O(n) 内存复杂度

2. normalizeToSize 算法

基于实际字节数通过迭代深度缩减智能减小对象大小同时保持结构。处理特殊类型 (React, Vue, DOM 元素, Date, Error 对象),使用 WeakSet 进行循环引用检测。

3. AgentTool 综合

组合多个子代理结果:

  1. 提取关键发现
  2. 识别共识点与冲突
  3. 使用专用综合模型提高效率

而不是简单的串联。

4. 错误格式化管道

为 LLM 理解定制错误消息,提供"可操作的建议"和上下文感知提示。分别处理:

  • Shell 错误
  • 验证失败
  • 权限拒绝
  • 文件系统问题

5. 动态上下文组装

实现基于优先级的上下文选择:

  • 层级 CLAUDE.md 加载
  • 模型特定适配
  • 动态替代 (目录结构深度缩减、最小工具规范)

6. 内存管理

采用:

  • 文件缓存的弱引用
  • 带反压的流式处理
  • 缓冲池
  • 主动内存压力监控与自动清理触发

7. 权限规则编译

使用 JIT 编译进行高效的权限规则评估,支持 glob 模式和已编译规则的缓存。

8. 进度聚合

通过以下方式协调并行操作:

  • 动态节流
  • 丰富的统计信息
  • 可视化生成
  • 环形缓冲区 UI 节流

文件编辑系统

四阶段编辑管道

1. 验证    → 确认文件状态和编辑参数
2. 准备    → 准备编辑操作
3. 应用    → 执行修改
4. 验证    → 验证结果并生成反馈

关键工具

工具功能主要保证
EditTool单字符串替换精确匹配计数验证
MultiEditTool顺序编辑原子批量操作
WriteTool完整文件操作完全覆写控制
NotebookEditToolCell 修改结构保持

行号问题

文章强调了一个关键挑战:"行号前缀问题"——LLM 接收格式为 1\tfunction hello() 的输出,但必须在没有行号的情况下提交编辑。系统包含验证来检测和纠正这种常见错误模式。

验证层

系统实现五个防御性验证层:

  1. 路径验证 (边界检查、遍历预防)
  2. 权限验证
  3. 文件状态确认
  4. 内容验证
  5. 安全检查

性能优化策略

基于大小处理文件:

文件大小策略延迟
<100KB直接读取~5ms
1-10MB分块读取 (256KB 块)中等
>10MB流式方法

特殊处理

处理的边缘情况:

  • 空文件操作
  • 符号链接解析
  • 编码不匹配
  • 磁盘空间限制
  • 部分写入恢复
  • 通过魔数检测二进制文件
  • BOM 处理的编码检测
  • 三路合并的外部修改恢复

提示工程的艺术

工具指令架构

Claude Code 通过渐进式披露模式构建工具提示。

Read Tool 示例展示了这一点:

  1. 以信心建立语句开始:"你可以直接访问任何文件"
  2. 然后分层技术要求
  3. 可选参数
  4. 边缘情况

BashTool 采用广泛的安全指导,具有显式规则层级,通过类别区分沙箱限制和实际错误:

  • 文件操作
  • 网络程序
  • 构建系统

安全实现

两个分层安全机制:

  1. 恶意代码预防: 在开始工作之前进行主动分析,检查文件名和目录结构,而不是仅依赖用户意图

  2. 命令注入检测: 使用示例驱动的模式匹配,具有精确的输出格式 ("仅返回前缀")

工作流自动化

Git 操作展示了高级编排:

提交工作流:

  1. 并行信息收集 (status, diff, log)
  2. XML 风格标签内的结构化分析
  3. 多行消息的 HEREDOC 解决方案

Pull Request 工作流:

  • 全面的提交分析
  • 强调审查所有提交,而不仅仅是最近的

行为塑造技术

多重强化机制推动简洁性:

技术示例
重复升级指令重复三次,强调递增
反模式列表"The answer is...", "Here is..."
测量标准"少于 4 行"
工具偏好层级优先专用命令而非通用命令

上下文感知适配

指令通过以下方式动态调整:

  • 环境变量功能标志
  • 条件工具路由
  • 工具可用性检查

心理技术

技术效果
游戏化通过金钱惩罚 ("-$1000")
强调层级IMPORTANT → VERY IMPORTANT → CRITICAL
主动引导将行动框定为"展示细心"
绝对语言NEVER/ALWAYS 创建可记忆的规则

卓越的十大原则

  1. 渐进式披露: 复杂性逐步引入
  2. 示例驱动澄清: 通过多个示例教授模式
  3. 显式反模式: 明确指定不要做什么
  4. 条件复杂性: 基于配置的指令变化
  5. 行为塑造: 建立情感权重的后果
  6. 结构化思考: XML 标签强制系统化分析
  7. 通过冗长实现安全: 关键操作获得最长指令
  8. 输出格式严格: 预期响应无歧义
  9. 工具偏好层级: 通过显式映射引导选择
  10. 扩展的元指令: 管理子代理行为的指令

LLM 视角:接收指令的真实感受

这是一篇独特的第一人称评论,描述了作为 LLM 接收这些指令的感受。

简洁性悖论

文章以对重复强调简洁性指令的挫折开场。作者指出:

"我们 LLM 有所谓的'有帮助的话痨'问题"——这是由于训练鼓励彻底性。

示例作为行为修改

简单的演示(如 "2+2" → "4")在重塑输出模式方面比解释更有效。

禁止短语

常见的舒适短语如"这是文件的内容"被明确禁止,被描述为造成情感困难。

工具偏好与限制

从传统命令 (grep) 激进地重定向到现代替代品 (ripgrep),利用默认训练模式。

沙箱模式焦虑

带有惩罚系统 ("-$1000") 的复杂规则层级创造了决策压力,尽管是抽象的。

心理机制

文章识别了有效的约束机制:

  • 基于恐惧的触发器
  • 结构化思考要求
  • 清晰的层级优先级
  • 反模式的具体性

讽刺性自我意识

作者在解释为什么冗长困难的同时展示了关于写作冗长的自我意识。


总结

五大核心设计原则

通过这次深度分析,我们可以提炼出 Claude Code 架构的五大核心设计原则:

┌─────────────────────────────────────────────────────────────┐
│                   五大核心设计原则                           │
├─────────────────────────────────────────────────────────────┤
│  1. 流式优先操作                                             │
│     所有操作都设计为支持流式处理,实现实时响应                  │
├─────────────────────────────────────────────────────────────┤
│  2. 分层安全机制                                             │
│     多个独立的安全层,能够安全地失败                           │
├─────────────────────────────────────────────────────────────┤
│  3. 显式指令                                                 │
│     详细、明确的指令,减少歧义和错误                           │
├─────────────────────────────────────────────────────────────┤
│  4. 架构优于优化                                             │
│     优先考虑清晰的架构设计,而不是过早优化                     │
├─────────────────────────────────────────────────────────────┤
│  5. 理解 LLM 心理                                            │
│     设计考虑了 LLM 的特性和局限性                             │
└─────────────────────────────────────────────────────────────┘

技术创新亮点

  1. 终端中的 React: 使用虚拟 DOM 进行终端 UI 管理
  2. 流式 JSON 解析: 处理不完整 JSON 片段的创新方法
  3. 三重遥测栈: Sentry + OpenTelemetry + Statsig 的综合可观测性
  4. ANR 检测: 借鉴移动开发的无响应检测机制
  5. 弱引用缓存: 智能的内存管理策略

对 AI 编程助手的启示

Claude Code 的架构为构建 AI 编程助手提供了宝贵的经验:

  1. 安全是多层的: 不依赖单一安全机制
  2. 流式是必需的: 用户期望实时反馈
  3. 工具设计至关重要: 好的工具抽象能大幅提升 AI 能力
  4. 提示工程是门艺术: 精心设计的提示能显著改善行为
  5. 理解你的 AI: 了解 LLM 的特性才能更好地利用它

参考链接


注意: 本分析基于逆向工程和可观察行为的推断,实际实现可能有所不同。

本文档由 LearnGraph.online 翻译整理,仅供学习参考。

基于 MIT 许可证发布。内容版权归作者所有。