工具链、同一套 libc 和 libc++、应用库,加上图形引擎。Linux、Windows、macOS 和 Android 从同一份代码构建。为此不必安装 Windows SDK,也不必安装 NDK。
编译器、链接器和 make 都在工具链里。不用先另外装。
MIT,无版税
怎么建工程、怎么编译、选哪个系统,写在仓库里。打开源码去问,代理按仓库回答。
工具链自己带编译器、头文件和库。只有你特意选了走厂商 SDK 的构建,才会用到它。
x86_64、arm64 和 riscv64,glibc 和 musl。调用进系统 libc,上面不再叠第二套。
x86_64 和 arm64。自己的 libc,分配器是 mimalloc,不用 UCRT,也不用 Windows SDK。系统 DLL 用我们自己的 import.lib 绑定。
x86_64 和 arm64。+sprt 构建不需要 macOS SDK。走 Apple SDK 的普通构建仍然要它——这是他们的许可,不是我们多要的。
arm64、armv7、x86 和 x86_64。有一套不依赖 NDK 的 sysroot。机器上已经有 NDK 的话,那条构建也能用。
WebAssembly、Embox 和 NuttX 是单独的目标。iOS 目前只有工具链 sysroot:还没有运行时,也没有 +sprt。
从你的代码看,Linux、Windows、macOS 和 Android 是一样的。不用因为 CRT 不同而堆一堆 #ifdef。
在 Linux、Android 和 macOS 上,调用进 glibc、musl、Bionic 或 libSystem。Windows 上的 libc 是我们自己的。time_t 和 off_t 到处都是 64 位。系统没有的调用不会从头文件里消失:它还在,返回 ENOSYS。
每个系统上都是普通的 pthread。带优先级继承的互斥量,底下是 futex、WaitOnAddress 或 os_sync,看跑在哪。
运行时自己用一套小的 sprt/cxx 构建:没有异常,有 Status 和 Result。应用代码拿到的是移植过来的 LLVM libc++,也就是真正的 std::。它放在 std::__sprt 里,不会和别人的 libc++ 撞 ABI。
定时器、套接字、文件和进程走同一个 Looper。底下是 epoll 和 io_uring、IOCP、kqueue 或 ALooper。窗口和显示器也在这个 API 后面,不在厂商 SDK 的头文件后面。
运行时上面是应用程序通常会自己长出来的那些库。不是套在系统 SDK 上的包装。
一个 Value 容器,写成 JSON、CBOR,或我们自己的 url-safe 格式。LZ4 压缩,读的时候自己认格式。
SQLite 和 PostgreSQL 走同一套 scheme:对象、文件、按操作的角色、键集分页。23 种语言的全文搜索,没有服务器时也可以放在内存里。
经 curl 的 HTTP/2 和 HTTP/3。OpenSSL、GnuTLS 和 mbedTLS:RSA、ECDSA、EdDSA、GOST 34.10、34.11 和 34.12,以及 JWT。
读 PNG、JPEG、WebP、GIF 和 TIFF,写 PNG、JPEG 和 WebP。矢量在 GPU 上剖成三角形。字体是 FreeType 和 HarfBuzz,包括可变字体。
HTML 和 EPUB,排版是我们自己的:块、浮动、表格、目录。另外还有 Markdown 和 Pug 模板。
自己的 zip、文件系统,以及跑在 WAMR 上的访客 WebAssembly。图形还没有开放给访客代码。
一帧是 pass 和资源组成的图。屏障和布局转换由引擎自己插入。图形和 compute 可以放在同一张图里。只有场景变了才准备新的一帧,闲着的时候不耗电。
主要的一个。在 macOS 上是 MoltenVK,带 portability 子集,从你的 .app 里加载。
macOS 上的单独后端,不经过 Vulkan。
给没有能用的 Vulkan 的板子:Mali、VideoCore、较旧的 Android 和模拟器。
原生可用,也能经 WebAssembly 构建跑在浏览器里。
没有驱动、没有着色器的平面 2D。这条路上没有 compute,没有深度,也没有 MSAA。
Wayland 和 X11(Linux 上启动时选择)、Win32、Cocoa、Android,以及无窗口模式。自带 flexbox 和 grid、手势、矢量,以及把字形落到像素上的文字。
在浏览器里打开即可。不必先装工具链。