🧵 让所有程序将内部信息打印成图片,这样你和大家的生活就不会那么糟糕了;✨ 一个帖子 ✨
我编写的几乎每个程序都可以以某种方式转储其内部状态。 如果说我希望你从这个帖子中记住什么,那就是你可以把这些应用到你自己的程序中。这并不需要很复杂!
我不是指像这样。 你肯定见过这种链表风格的图,用指针表示箭头,用小符号表示 NULL 值等等。这种图在讨论实现细节时非常有用,但在学习之外,你很少会用到它。 图片来源:摩西·埃菲翁·埃克彭永
特别感谢布鲁克林学院 CISC 3130 课程,他们绘制的链表图太棒了!🚂🚃🚃 来源:https://t.co/VTw0qbKDXA
从更高的抽象层次来看,显示 ADT 的内容是否有意义? 可能不行。最好展示一些对你的程序更有意义的内容。有时这指的是单个数据结构的内容,有时则指的是一对数据结构之间的关系。
我经常做编译器相关的工作,但这个理念也适用于其他领域。 编译器之所以分阶段运行,*是因为*每个阶段运行的数据都不同。所以,把这些数据输出出来似乎很自然。 只需在命令行工具中添加一个标志即可!就这么简单。
这是早期 Unix shell 的一个结构。我的程序展示了语法树和层级符号表之间的关系,符号表是在解析过程中同时填充的。希望你能看出它们之间的联系。
你看,我没有展示它们的存储方式,只展示了它们包含的内容。这只是内容,不涉及这些特定数据结构的实现。这种抽象层次对于调试程序的其他部分来说是合适的。
这是来自另一个程序的树状图。这是一个来自 C 和 C++ 编译器的中间表示 (IR)。 除非你在调试这部分代码本身,否则实现细节只是无关紧要的噪音。
这些结构可能非常庞大!但即使缩小视图,看到物体的大致形状也能帮助你进行调试。当你熟悉之后,情况就不同了。 通过观察事物的外观,你可以发现变化中的规律。我们的大脑很擅长这一点!
关于程序结构:首先要确保数据结构正确。代码本身只是次要的。 代码更容易修改 数据设计很容易渗透到各个方面。 这就是为什么将其限制在阶段(或模块或其他任何形式)内很重要的原因。
对于有状态守护进程,添加一种通过 IPC 查询当前状态的方法。 渲染工作请在程序外部进行!
输出格式可以是 graphviz、json、简单的 TSV,或者任何最适合您数据的格式。 以*简单*格式打印,使用外部工具进行渲染。
仅仅因为你有一个程序,并不意味着你的程序就应该负责所有这些事情。把事情分开处理!使用不同的编程语言。 我用的是awk。你可以用你喜欢的任何语言。
JSON 是使用不同语言的团队之间很好的通用数据格式。如果你从事商业项目,可以把它当作社交粘合剂,这样就能为你赢得首席工程师“团队协作”的加分。
颜色应保持对色盲人士友好,且仅用于传递功能信息。我喜欢 Bang Wong 的配色方案。 https://t.co/XtUlGdalOb
工作流程至关重要,无论是数据获取还是可视化。如果需要做很多步骤才能看到最终结果,这会打断你正在进行的工作,那就毫无意义了。 下次我会试着写一些关于这方面的内容。 保重,感谢阅读。











