sp.h:C 语言应有的标准库
本文将探讨相关的基本概念。2026 年 5 月 20 日,过去一年里,开发者致力于为 C 语言打造一个高质量、超便携的标准库以完善 C 语言,它并非简单封装 libc,除平台要求外不依赖 libc,目前暂无类似库。该库名为 `sp.h`,是用纯 C99 编写的单头文件库,约 15000 行代码,可在 [GitHub](https://github.com/tspader/sp) 找到其源代码,包含库本身、大量示例程序及六个扩展核心功能的辅助库。
目录
涵盖设计原则(直接针对系统调用编程、Libc 有负面影响、不依赖堆内存、避免使用以空字符结尾的字符串、融入软件而非游离在外、高度可移植、明确清晰)、非目标(遵循现有接口、支持生僻架构和操作系统、追求极致性能)、结语(C 语言的价值在于其简单性)、期待合作。
设计原则
直接针对系统调用编程:核心思想是 C 标准库须基于可用最低级原语编写,与冗余代码交互无用且低效。Libc 有负面影响:遵循 libc 看似能让大量代码编译运行,但实际无法为程序提供有用接口,异步编程让问题更突出,`sp.h` 摒弃以 `FILE*` 为基本 I/O 单位等做法。不依赖堆内存:库以特定分配器类型为基础,让程序认识到内存分配是虚构,内存归程序所有,库让堆分配可选。避免使用以空字符结尾的字符串:以空字符结尾的字符串存在诸多问题,要让 C 语言现代化需摒弃,使用 `sp_str_t`,基于指针 + 长度字符串构建的 C 标准库易用高效。融入软件,而非游离在外:库让用户可按需操作,开发者付出努力,库核心约含 40 个系统调用,以单文件发布,结构清晰,函数有命名空间,`sp.h` 统一真实有用部分并构建功能。高度可移植:`sp.h` 用 C99 编写,可在多种编译器、libc 及不同系统、环境运行,因体积小巧实现可移植。明确清晰:选择隐式方式会付出代价,错误由调用者处理,程序无可变全局状态,内存分配函数接受分配器,内存初始化为零。
非目标
遵循现有接口:`sp.h` 不是 libc,必要时尊重 libc,可在使用 libc 的程序中正常工作。支持生僻架构和操作系统:主要为 x86_64 和 aarch64 编写代码,WASM 是次要目标,不想为少数用例让库臃肿,愿提供帮助并合并合理补丁。追求极致性能:库认为底层计算密集型性能投入回报不成正比,设计高性能软件和数据结构困难且代码复杂,某些方面不在考虑范围,某些方面在考虑范围,可进行细粒度优化和修复 bug。
结语
人们会问为何做此事,答案是 C 语言有独特地位,可直接编译成机器代码,有先进优化编译器,与操作系统和多数库语言相同,可将编写编译器作为个人项目。C 语言的价值在于其简单性,虽有局限性,但得到广泛支持、高度优化、与平台紧密结合且易上手。
期待合作
开发者希望结交朋友、帮助参与库开发,可移植到特殊环境、解释内容,在 [Discord 服务器](https://discord.gg/K3XUzDSnNP)、[IRC 的 #sp 频道](https://web.libera.chat/?channel=#sp.h) 可找到开发者,也可发邮件。