脚本应使用项目的主语言编写
关于“使用主语言编写脚本”的总体立场
- 讨论在“适合时很不错”和“危险的泛化”之间分裂。
- 许多人坚持这高度取决于语言、项目类型、部署环境和团队技能。
- 有些人认为文章比标题看起来更温和;另一些人仍然把这个想法视为锤子看钉子。
支持使用主语言的论点
- 共享语言可减少上下文切换,并可复用领域逻辑和 API。
- 之后更容易把临时脚本迁移为定时任务或生产工具。
- 对某些语言(Go、Kotlin、C#、JVM 整体而言),脚本支持或快速
run工具使这很实用。 - 单语言二进制文件(尤其是 Go)简化跨平台分发,并避免 Python 式的依赖问题。
反对 / “用合适的工具”
- 许多语言(C、C++、Rust、Java 配合完整工具链)并不适合快速的文件系统/操作系统自动化。
- 对于基础设施和部署,专用工具(Ansible、Fabric、Terraform、Nix、Docker/Compose、Helm 等)往往比应用语言里的定制“部署代码”更好。
- 将部署逻辑嵌入主二进制会模糊职责,变成脆弱的定制 DevOps 系统,并把非语言专家挡在外面。
- 脚本通常是一次性调查;使用重量级语言/工具链属于大材小用。
Shell 与更高层脚本语言
- bash/sh 的坚定支持者强调其无处不在、与操作系统工具紧密集成,以及用于小脚本时的简洁性。
- 其他人强调 bash 的坑、引用规则、可移植性问题(macOS vs Linux、非 GNU 工具)以及“在我机器上能跑”的失败。
- shellcheck 等工具可缓解部分 shell 风险;风格指南建议把冗长/复杂的 shell 重写为结构化语言。
特定生态中的经验
- Go 因小型 CLI 或
go run被赞为出色的“脚本”语言,尤其适合异构开发环境。 - Kotlin 脚本和自定义 shell 展示了静态类型主语言也能提供令人愉快的脚本体验。
- C++ 和 Rust 的例子则显示出痛点:重建耗时、平台特定二进制,以及几乎普遍依赖外部脚本语言(通常是 Python)。
团队、可维护性与学习
- 额外语言会增加入职、测试和工具链开销,但很多人认为工程师应当掌握一两种常见脚本语言。
- 过于复杂、未经测试的脚本才是更大的问题,而不是语言选择;评论强调测试、文档、清晰的假设和职责分离。
- LLM 略微降低了使用不熟悉语言的门槛,但不足以消除语义和安全方面的陷阱。