Aho – 用 Awk 实现的 Git
一个用 Awk 编写的 Git 玩具实现,重新激发了人们对 Awk 作为通用脚本语言而不仅仅是一行命令工具的兴趣。评论者举出用 Awk 构建复杂系统的例子,权衡其简洁与普及性相对于可读性和扩展性问题的利弊,并将其与 Perl、Python、Bash 以及其他 shell 工具进行比较,讨论范围从日志分析到嵌入式系统。这个项目还引发了关于 Git 工作流、语言设计取舍,以及传统 Unix 文本处理工具在何种程度上还能继续“硬撑”,直到“真正的”编程语言更合适为止的旁支争论。
项目与命名反响
- 许多人觉得用 Awk 实现 Git 很有趣,像是把一种“工具推到了它通常的极限之外”,也是很好的学习载体(例如,有人曾在一台小路由器上用 Awk 做过一个 wiki)。
- “Aho” 这个名字被广泛称赞为巧妙的双关:既指 Alfred Aho(AWK 里的 “A”),也指许多语言/方言里“aho”/“git”作为“笨人”的俚语含义。
Awk 的能力、用例与生态
- 有多个规模不小的 Awk 项目示例:
sed里的国际象棋、一个 Awk 光线投射器、一个 Google Translate 客户端、一种静态站点标记语言,以及生物信息学工具。 - 一些人主张把 Awk 当作通用脚本语言,认为它在许多任务上比 shell 更顺手;他们举了日志分析、基因组流水线,以及由 Awk + coreutils 组成的数据/ML “Taco Bell 编程” 作为例子。
- Awk 的价值在于其普及性、简洁性、隐式的文本处理行为,以及对大文本流的良好性能。
语言设计、可读性与工具支持
- 对 Awk 的强烈批评包括:
- 变量默认全局作用域,并且只能通过额外的函数参数和空格约定来做笨拙的“伪局部变量”。
- 可扩展性有限;大型 Awk 代码库被形容为“庞然大物”。
- Unicode 支持较晚,管道/TTY 边缘情况也很微妙。
- 缺乏强大的调试器,这对较大的工具尤其成问题。
- 另一些人则反驳说:
- 就其适用领域(按行/按字段的文本处理)而言,Awk 近乎理想,而且能写出比 Python 短得多的脚本。
- 可读性就是“学会这种方言”;一旦熟悉后,它会让人感觉自然,而且写起来很快。
- 有一个分支版本
egawk增加了词法作用域风格的let变量;也有人建议用宏预处理器(cppawk)或简单的 Awk include 来增强模块化。
Perl、Python、Ruby 与工具链争论
- 历史脉络:Perl 曾经取代 Awk+sed+shell,之后 Python 又因可读性和开发体验而取代 Perl。
- 观点分歧明显:
- 一些人仍然喜欢 Perl(尤其是跨平台脚本),并指出它通常是预装的。
- 另一些人认为 Python 是从 shell “升级一步”的默认选择,也更容易被“下一个人”理解。
- Ruby 被称赞为愉快好用,但其形象更多被 Rails 所主导。
- 对现代系统默认预装哪些解释器,以及性能如何,也存在争论(有人声称 Python 比 Awk 快 10–20 倍;也有人对此提出异议或补充说明)。
Git、大文件与替代方案
- Aho 刻意省略了网络操作(
clone/push),不过讨论中提到了本地“克隆”以及rsync/worktree 作为替代;git worktree在一些人看来很强大,在另一些人看来则是令人困惑的“历史包袱”。 - 大文件处理仍然是 Git 的设计限制;用 Awk 重写并不能解决这一点。有人建议使用 Git LFS,但也有人批评它集成时很痛苦。
- 采用基于 Awk 的 Git 工具的一个动机,是在最小化系统中减少对 Perl 的依赖(内核构建、证书工具、Git 客户端)。