Files
structrail-design/.trae/rules/project-introduction.md
skycurtain c90f4a0244 docs: 添加项目设计文档与跨语言SDK实现指南
- 新增 tracer-type.md 说明 Tracer 类型及其设计理念
- 新增 project-introduction.md 介绍项目背景与目标
- 新增 cross-language-sdk-guide.md 详细说明跨语言数据传递与序列化方案
- 新增 sdk-initialization-patterns.md 提供多语言 SDK 初始化设计规范
2026-02-04 13:44:51 +08:00

16 lines
2.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## 项目背景
我正在设计一款数据结构与算法可视化平台(以下简称为“平台”),允许用户在平台上编写算法的实现代码,当用户提交代码后,平台会能够获取到代码中所涉及的数据结构的变化过程,并以可视化的形式来渲染整个变化过程,并且将数据结构的变化与代码的执行过程关联起来,给用户的感受就像是在调试代码一样,算法执行到某一步时,代码中的相关部分会高亮显示。用户可以在平台上通过“下一步”功能来查看算法的执行过程中每一个步骤所对应的数据结构变化,并且还可以具有“时间旅行”的功能,允许用户通过“上一步”功能来向前回溯算法的执行。此外,从长期规划和产品化的角度来说,平台还会支持添加对多种主流编程语言的支持。
## 项目目标
基于上述设想,我肯定无法接受从编译技术的角度去适配每一种编程语言(例如代码插桩甚至改造编译器),因为这会导致平台的开发变得非常复杂,维护成本也会非常高。因此我的想法是设计一套语言无关的协议,用来描述各种数据结构的变化(跟踪器),因此这套协议会定义需要支持的数据结构类型,以及每一种数据结构类型需要支持的操作指令,并且我倾向于将指令设计得更加“底层”一些,类似于“原语”的概念。
> 例如针对顺序表结构,我可能会定义 pick(获取元素)、drop(取消获取)、patch(修改元素) 指令来替代 swap(交换元素) 操作,因为交换两个元素的本质就是 获取元素 + 修改元素,而我在其中添加 drop 指令的目的则是使可视化过程更加具体,例如 pick 指令会将其选定的元素高亮,那么 drop 指令就可以取消该元素的高亮行为。
我们会先选取一种编程语言(例如 TypeScript)来实现这套协议,在实现的过程中,需要考虑到未来将添加其他编程语言的支持,因此需要考虑到不同编程语言之间的差异,例如语法/类型系统差异,进而反过来优化这套协议,以使其能够更好地支持不同的编程语言,这是一个双向的过程。
当我们实现了这套协议后,就形成了一套 SDK用户可以在平台中标记想要记录的数据结构(注册跟踪器),并调用 SDK 提供的 API 来记录数据结构的变化,当代码被编译运行后,就能够自然地获取数据结构的变化过程(序列化为 JSON)。
所以本项目的最终目标就是设计这一套语言无关的协议,并在多个主流编程语言上实现该协议。