前言
💬 Quote
2 月末探索了不少开发管理工具,终于想通了作为「用户」需要的软件包和作为「开发者」需要的软件包是两回事,于是大幅重构开发环境,现在的方案更新只需要三行,连 topgrade 都用不上。
上面这段话本来打算更在 更新强迫症,但重构还没结束(部分更新流程还能自动化),更何况大幅更新还没重新写一篇快还没有历史包袱。
脱离了系统软件的版本要求,迁移 Void 到其他发行版的阻碍小了很多。但是基于 LXC/distrobuilder 的 distro hopping 路径还在探索阶段,短期估计还是苟在 Void。还开始了艰难的 linux-distro 改写,扩展到包罗万象的 OS,为下文的「大一统」做准备,但是「系统」概念过于复杂,估计几个月都写不完。
尝试
言归正传,最近为了实现「大一统」,尝试了很多路径,结果都不甚理想。
- Zig
- zig cc 本身还可以,但是 zig Translate-C 的体验一言难尽,输出非常 verbose,而且很多简单语句也不能转换
- 不过 Zig 很好的一点是尝鲜方便,安装 VSC 插件即可,不需要再额外安装 Zig 和 ZLS,直接就能体验全部功能
- 关联阅读:
zig cc
: a Powerful Drop-In Replacement for GCC/Clang
- cosmopolitan libc
- 如果你参与开发却从来没听说过 cosmopolitan,立即点开链接阅读
没有用过 cosmocc 的人生是不完整的!如果读完感到意犹未尽,Cosmopolitan Third Edition。如果还有兴趣,redbean + superconfigure。还打算深入?greenbean.c + pledge + cosmopolitan 源码 - cosmocc 可能比较难理解,但绝对值得一试,颠覆思维的存在,举个例子,就好比数学界的伽罗瓦理论和
游汐叶界游戏开发界的 Flash - 这也是我会写下正文的直接原因,理论上通过合理配置,可以实现 Windows/Linux/Termux 真正的大一统
- Windows 很多操作之前还需要借助 WSL/PowerShell,但 cosmocc 帮我淘汰了一批脚本
- 什么叫「真正的大一统」,比如我试过把博客全量塞进 redbean,于是拥有了一个在 AMD64/ARM64 Linux + Mac + Windows + BSD + BIOS 都能运行的文件。注意,是同一个文件
- 但是 cosmocc 比较 tricky 的一点是,第一次运行 APE(Actually Portable Executable)的系统会影响 APE 本身,而且虽然 APE 是 PKZIP,但只有用 cosmocc 编译的
zip
才能正确修改 APE。另外不支持非 64 位系统,所以 WinXP/Win7 32bit 和其他上古系统就无缘「大一统」 - 还有一点比较搞笑的是,虽然 cosmopolitan libc 编译的二进制支持那么多平台,superconfigure bootstrap 只考虑了 Debian,我曾尝试添加 Alpine + Fedora/Rocky/Almalinux + Arch/Manjaro + Void + LFS + Slackware 支持,(我瞎取的)stage 1 倒是轻松搞定,但 stage 2 才搞定 Void 就觉得太麻烦弃坑了……
- 如果你参与开发却从来没听说过 cosmopolitan,立即点开链接阅读
- Rust,显而易见,但是在 Termux 有 DNS 无法解析的问题,需要用 PRoot 映射到
$PREFIX/etc/resolv.conf
,一个两个这么搞可以,个个都这么搞太麻烦 - 其他像 LuaJIT 这样的还尝试了很多,但是和「大一统」还是有差距,最后的结论是…… Golang 凑合用吧
难点
ℹ️ Note
下文几乎是原封不动的转录,实际上是我在迁移开发环境到 mise 的笔记中的一小部分,部分上下文可能有所缺失。
最近脑子里也想过几回,一直没写下来,我很少真正上手开发的原因。 这也是软件包管理的难点,因为这些东西对于很多人乃至开发者而言都属于「未知的未知」,没办法预知。
- 系统支持,我用过的系统太多,什么都想支持,Windows/Linux/Termux 是必须的
- 发行版支持,Linux 生态非常混乱,linux-distro 可见一斑,而常用的就有 Void Glibc, Alpine Edge, Debian testing/Devuan unstable/Kali rolling, Rocky9, LFS, Manjaro
- 架构支持,x86_64/amd64, arm64/aarch64/aarch64-linux-android, 可能的话还想支持 RISC-V 和 32 位老系统
- libc 支持,glibc/musl/bionic/cosmopolitan
- 前两者还好,Rust/Golang/Zig 都能 cover
- bionic 是 Android C Library,Rust 基本没戏,只能 Termux 开 PRoot
- 最后一个非常考验能力,开发的思维方式都不一样
- init 支持,SystemD, SysVinit, runit, OpenRC, s6
- (非 cli 工具的)WM/DE 支持
- DE: Xfce4, KDE Plasma, Lxqt, GNOME…
- Display server: Xorg, XWayland, Wayland
- Window manager (WM): xfwm4, KWin, Mutter, Openbox, i3, Sway
- Display manager (DM): DWM, LightDM, SDDM, GDM
Session manager
- 使用难度
- 减少对特定工具的运行时依赖
- 不能默认系统一定存在某些软件包,或者使用特定实现才支持的命令行参数
- e.g. BusyBox Grep/GNU Grep, GNU tar/bsdtar/Libarchive, netcat 各种变体
- 更多联想,参考系统支持、libc 支持、init 支持和 WM/DE 支持……
- 对于用户而言,获取/更新方式(上面那些条件的支持、发行版打包情况、下载脚本)、文档
- 减少对特定工具的运行时依赖
- 开发难度
- 离线编译,编译时依赖最小化,对于 Rust/Golang 而言几乎是不可能的
- 对于开发者而言,库、app、开发文档
后记
太久没有读书,文笔已经无法承载我的知识量。哪怕东拼西凑整出一篇文章,这个后起的标题,看起来和正文也没有太强的逻辑关系。
Anyway,最后送上 Henry Wadsworth Longfellow A Psalm of Life 的经典片段,共勉:
💬 Quote
Let us, then, be up and doing,
With a heart for any fate;
Still achieving, still pursuing,
Learn to labor and to wait.