3作者: theperezident4 个月前
Ariandel 是一种内存模型,其中每个堆对象都存在于一个作用域拥有的 arena 中。作用域退出以 O(1) 的时间复杂度重置 arena — 一次 bump pointer 写操作和一次 free 操作 — 无论分配了多少个对象。 安全默认设置:分配函数返回 ARENA_PTR 句柄(打包的 arena_id + 偏移量整数),而不是原始指针。默认情况下,在函数返回边界处无法构造悬空指针。跨作用域的生命周期扩展是显式的 — 在分配之前,您通过 SCOPE(ptr) 进入目标 arena,这会将对象路由到外部 arena,而无需转移所有权。 基准测试(无优化标志):100 万节点树清理时间从 31 毫秒降至 1 毫秒(约 30 倍)。在紧密的内循环中存在真正的性能下降(约 0.76 倍),因为 DEREF 无法像编译器那样提升基指针 — 规范对此进行了如实记录。 这是一个基于 C 宏的内存模型概念验证,我正在编译语言中针对该模型。有趣的问题不是 C 实现 — 而是作用域结构化的 arena 路由是否可以可靠地替代重要程序中的 GC 和借用检查。 代码库:<a href="https://github.com/hollow-arena/ariandel" rel="nofollow">https://github.com/hollow-arena/ariandel</a> — SPEC.md 包含了完整的模型,包括并发语义以及与 Tofte & Talpin 基于区域的内存的比较。
3作者: 10keane4 个月前
我正在使用 Claude 来维护一个代理循环,在重要的工具调用之前会暂停并请求用户的批准。在进行一些错误修复时,我发现了一些清晰的模式和原因,解释了为什么对于没有技术知识和架构专业知识的人来说,Vibe 编码会失败。 首先,让我描述一下我的工作流程——这在数百个成功的会话中一直沿用: 1. 通过内部测试识别错误。 2. 让 Claude 代码调查代码库,找出三个潜在的根本原因。 3. 将根本原因和建议的修复方案粘贴到我存储所有架构文档和设计决策的 Claude 项目中,以便它进行评估。 4. 在项目中与 Claude 讨论,编写详细的任务规范——任务规范将具有指定的格式,并包含各种测试。 5. 将其交还给 Claude 代码以实现修复。 在今天的会话中,根本原因分析仍然很棒,但提出的修复方案非常糟糕,我真的认为这就是大多数 Vibe 编码项目最终失去可维护性的原因。 以下是两个根本原因和建议的修复方案: 错误:代理请求用户批准,但有时批准弹出窗口不会显示。我尝试发送消息来解决这个问题。消息被默默吞噬。代理看起来已经死了。我需要重新启动整个流程。 Claude 的评估: 根本原因 1: 批准弹出窗口通过实时连接发送一次。如果用户的 UI 在那一刻没有连接——页面刷新、手机后台运行、连接不稳定——他们就永远看不到它。没有重试,没有恢复。 这实际上是真的。 建议的修复方案 “让我们将批准状态保存到磁盘,以便它在崩溃后仍然存在”。听起来不错,但关键是,按照设计,如果发生崩溃,代理将从会话日志中冷启动恢复,并且无论如何都不会获取批准状态。这个修复方案只是增加了模式的复杂性,而且完全无用。 根本原因 2: 当批准被中断(守护程序崩溃、用户重启)时,会话历史记录中会有一个孤立的 tool\_call,没有匹配的 tool\_result。 建议的修复方案: “编写一个合成的 tool\_result 以保持会话文件的结构有效。” 听起来很干净。但我问:谁会因此而崩溃? LLM API?不,它处理缺失的结果。会话重放?不,它读取现有的内容。孤立的 tool\_call 准确地代表了发生的事情:工具被调用但从未完成。这就是真相。编写一个假结果来掩盖它会引入一个新的写入协调问题(你到底什么时候编写假结果?如果守护程序在写入期间崩溃了怎么办?)来解决一个不存在的问题。会话文件并没有“损坏”,它是准确的。 Claude 拥有完整的架构文档、代码库以及一百多个项目的历史会话作为上下文。它仍然选择了复杂的解决方案,因为它看起来是好的工程。它从未问过“重启后这重要吗?” 我个人多次遇到这种倾向于看似更稳健的过度工程的情况。我真的相信,这才是人类应该介入的地方,而不是给出一个一句话的需求,然后看着代理做各种“稳健”的工程。