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