News Hacker|极客洞察

126 12 小时前 ammil.industries
😬把三万行 Perl 交给 Claude 的移植失败与 MicroQuickJS 的 Claude‑Code 成功样例
真要把三万行老代码交给不会测的模型了吗?

🎯 讨论背景

原帖记录作者尝试用 Claude(交互式 LLM/agent)把一个约 30,000 行、跨 28 个模块的 Perl 代码库移植到 TypeScript,但未能交付。评论区把失败归结为:缺乏系统化分解与可执行测试导致的盲目提示试错,以及语言(如 Perl)和代码耦合复杂性带来的挑战。相对地,有评论提供了成功经验:用 Claude Code 搭配 TDD,把 MicroQuickJS(轻量 QuickJS 实现)移植为纯 Python 并跑通大量测试,展示了“模型+测试+agent”闭环的可行性。讨论还延伸到模型能力与 agent/工具的角色、RAG/MCP 的代价,以及实务上应优先采用分治、自动化测试与人工审查的工程做法。

📌 讨论焦点

失败原因:无系统化流程与缺乏可执行反馈(测试/规格)

多条评论指出问题并非单一模型的“智力”不足,而是流于随机试错的流程:作者描述的“模型瘫痪”(多分支 worktrees、云代理、并行模型运行和对抗式提示)导致无法判断是否接近目标。关键缺陷是没有系统化的度量与可执行规范——缺乏完整的测试套件或规范意味着代理无法自动验证行为,最终即使投入大量时间也学不到可复用的知识或成果。评论还强调语言与代码库本身的复杂性(例如 Perl 的可读性与惯用用法)会放大这种风险,说明并非所有项目都适合直接交给 LLM 完成移植。多位评论建议回归工程心态:建立内部假设、设计小实验、用自动化测试做可量化的进度判断。

[来源1] [来源2] [来源3] [来源4]

成功案例:Claude Code + TDD 把 MicroQuickJS 移植到纯 Python

有评论详细分享了用 Claude Code(交互式编程 agent)驱动、以 TDD 流程为核心,把 MicroQuickJS(轻量 QuickJS 实现)移植为无外部依赖的纯 Python 项目的实例。该工程在模型连续运行下生成了 400+ 个测试(报告 402 个、仅 2 个失败),模型按“先写测试、看失败、再修复”的 TDD 循环工作,从而把自动化验证嵌入移植流程。作者强调这是大量由模型生成(13,000+ 行)但未完全人工复核的代码,因而保留 alpha 标签并建议严格人工审查;该项目还发布了 PyPI 包与可公开的会话转录工具以便复现。具体移植细节(例如 JavaScript 的 toFixed 舍入策略为 round‑half‑away‑from‑zero,而 Python 默认 round‑half‑to‑even)显示出 TDD 帮助捕获真实、可重现的差异。

[来源1] [来源2] [来源3] [来源4] [来源5]

模型能力 vs 工具/代理:进步来源的争论

评论区对“为什么现在可行”存在分歧:一部分人认为近年的核心是模型能力本身显著提升,把更强模型放进相同工具就会产生质的变化;另一部分人认为真正的进步来自于 agent 框架、工具链与流程集成,使模型能在工程环境中持续运行与闭环验证。有人指出 RAG(检索增强生成)与 MCP(远程/多上下文访问)虽然能扩展上下文,但消耗大量 tokens/计算与能源,是一种成本权衡;也有观点认为能力提升呈现递减或对数关系但工具能把这些能力放大。总体结论倾向于三者共同决定成败:模型、agent 设计与工程化的验证流程缺一不可。

[来源1] [来源2] [来源3] [来源4]

实用策略与警告:分治、自动化测试与保守审查

多位评论给出可执行建议:把大任务拆成最小、易验证的子任务(divide & conquer),优先做能被单条命令自动验证的步骤,或逐个模块移植并比对返回值。具体技术建议包括先写测试(TDD)、使用 property‑based testing 捕捉边界情况、为语言间差异写语法转换/语法变换脚本(而不是完全依赖 LLM 生成整套逻辑),以及让模型负责小步实现而把设计与验收留给人类。评论同时警告“vibe‑coding”(随机提示试错)和 LLM 在遇到不可控或未指定约束时可能做出隐性改动,因此对 AI 生成代码必须严格人工审查并保留可量化的回归测试。若团队不打算长期维护源语言,LLM 可做辅助,但需要由有经验的人做分解与验证。

[来源1] [来源2] [来源3] [来源4] [来源5]

📚 术语解释

LLM: 大型语言模型(LLM,Large Language Model):通过大规模文本训练的生成模型,能产出自然语言与代码,经常作为代码助手或更复杂 agent 的核心组件。

Agent / agent mode: Agent(LLM agent / agent mode):把 LLM 与外部工具(如 shell、git、测试运行器、浏览器等)和反馈回路结合的系统,使模型能执行多步任务、运行测试并依据结果调整行为。

TDD(Test‑Driven Development): 测试驱动开发:先编写可执行测试用例再实现功能,能为移植提供明确的可运行规格,便于用自动化测试约束并验证 LLM 生成的实现。

MicroQuickJS(mquickjs): MicroQuickJS(mquickjs):Fabrice Bellard 开发的轻量级 QuickJS 变体/微型 JavaScript 虚拟机,强调字节码与紧凑实现,附带测试套件,常用于嵌入式或移植性实验。

RAG(Retrieval‑Augmented Generation): 检索增强生成(RAG):在生成提示中加入来自外部文档或数据库的检索内容,以扩展模型可访问的上下文和事实记忆,常用于处理大代码库或长期状态。

MCP(评论语境下): MCP(讨论中用语):指远程或多上下文访问机制,即模型通过外部服务或多源上下文调用来获取更大规模的环境信息,与本地 RAG 对比时常被提及,但代价是更多 token 和计算开销。

舍入策略(round‑half‑to‑even vs round‑half‑away‑from‑zero): 两种数值舍入规则:Python 默认的 round‑half‑to‑even(银行家舍入)与 JavaScript 的 round‑half‑away‑from‑zero 在数值格式化(如 toFixed)上会产生差异,移植数值相关代码时需显式处理。