Matt Godbolt's blog16 hours agohttp://xania.org/202512/09-induction-variables?utm_source=feed&utm_medium=rss编译器通常会优化循环代码,通过使用归纳变量等技术使看似昂贵的操作变得快速。如果乘法已经很快且独立,编译器有时会拒绝将乘法转化为加法序列的循环优化。独立的循环迭代允许CPU重叠计算,即使每次迭代的延迟较长也能提高吞吐量。像Compiler Explorer和llvm-mca这样的工具可以验证编译器优化并分析CPU性能。相信编译器能进行优化,但始终要通过基准测试和分析工具来验证。
Matt Godbolt's blog16 hours agohttp://xania.org/202512/10-loop-unrolling?utm_source=feed&utm_medium=rss向编译器提供编译时已知的循环计数(例如通过`std::span<int, 8>`)可以启用循环展开优化。动态大小的span(`std::span<int>`)会导致一个直接的循环,每次迭代都有计数器和分支。展开消除了循环计数器和条件分支,节省了指令,并允许进一步的模式检测,例如使用`ldmib`进行多次加载。编译器可能会部分展开、推测性展开,或者根据启发式和迭代计数回退到常规循环(例如,在50次迭代时放弃)。检查热点循环并提供编译时循环计数可以为编译器成功做好准备;配置文件引导优化(PGO)也可以帮助优化性能。
Matt Godbolt's blog16 hours agohttp://xania.org/202512/23-switching-it-up?utm_source=feed&utm_medium=rss
56,000 lines of DOOM, in a language I made up12 days agohttps://betlang.dev/about/bet 是一种小型、真实的编程语言,旨在作为一项受控实验的设计。它通过 LLVM 编译为原生代码,实现自我托管、管理内存,并能运行 DOOM。该语言使用区域分配(称为 cribs)实现游戏中的高效内存管理。DOOM 被完整移植到 bet 语言,代码超过 56,000 行,实现了逐比特相同的游戏体验。该项目在无前期研究的情况下构建,仅依赖测试进行把关,未进行代码审查。它作为一个玩笑、一项实验和学习经历,没有进一步开发的计划。
How Our Rust-to-Zig Rewrite Is Going12 days agohttps://rtfeldman.com/rust-to-zigRoc编译器团队已将30万行Rust代码重写为Zig,最近实现了与原编译器同等功能特性。基于Zig的新编译器核心特性包括:开发期间热代码加载、交叉编译二进制文件、支持零堆分配的类型安全模式匹配字符串插值。重写源于架构挑战,特别是实现多态去函数化时,需要彻底重构而非渐进式修改。选择Zig而非Rust的原因是:编译时间更快、通过细粒度分配器实现更优内存控制、生态更契合编译器需求、对非安全内存代码有更好辅助支持。内存安全性对比显示Zig编译器内存损坏错误报告(10例)少于Rust(21例),但多数属于错误编译问题而非编译器自身缺陷。Zig增量编译耗时(35毫秒)显著优于Rust(3.4秒),尽管当前稳定版存在暂时影响性能的缺陷。编译器采用零解析反序列化缓存技术,利用数组式数据结构实现I/O密集型性能优化,这得益于Zig的内存控制能力。Zig生态圈(含其编译器源码)提供了可复用组件(如LLVM位码序列化器),契合Roc的特殊需求。相较于Rust缺失的特性包括:测试中自动分配、私有结构体字段、更优死代码检测,但Zig在数据布局控制和错误处理方面具有优势。后续计划包括今年晚些时候发布Roc 0.1.0版本,目前正持续完善文档和修复漏洞,相关工作由非营利组织Roc编程语言基金会支持。
History of T17 days agohttps://paulgraham.com/thist.htmlT是一种极具影响力的Lisp实现,以其简洁的设计和优化闻名。T由乔纳森·里斯于1980年代初在耶鲁大学开发,是一个优化的原生代码Scheme系统,这在当时是一个激进的选择。T引入了创新的实现技术,如高效的数据表示、深度优先垃圾收集器和细粒度中断处理。其编译器Orbit采用CPS(延续传递风格)作为中间表示,多年来一直是最优化的Scheme编译器之一。T的发展催生了多篇博士论文,并对后来的语言和编译器(包括SML/NJ和Scheme 48)产生了影响。其语言设计具有简洁的对象系统,集成了赋值机制和一致的命名方案。T的遗产包括对函数式编程、编译器技术和垃圾收集研究的贡献。
Zig: All Package Management Functionality Moved from Compiler to Build System24 days agohttps://ziglang.org/devlog/2026/#2026-06-30包管理功能从编译器移出至构建系统,提升了模块化程度,允许在不重新编译编译器的情况下进行补丁。SPIR-V后端取得进展,新增@SpirvType内置类型、通过调用约定设置执行模式,并支持多线程代码生成。新的@bitCast语义基于逻辑位布局定义,使行为与字节序无关,并支持整数到向量转换等新操作。ELF链接器改进实现了快速增量编译和与外部库的链接,但DWARF调试信息支持尚待完善。构建系统重构为配置器和构建器分离的进程,显著加快构建速度并提升缓存效率。增量编译现已支持LLVM后端,加快了开发过程中的错误反馈速度。类型解析重新设计使编译器更惰性,改进了依赖循环的错误信息,并增强了增量编译。io_uring和Grand Central Dispatch的std.Io实现已就绪,允许轻松切换I/O实现。包管理功能增强:依赖项本地存储在zig-pkg目录中,新增--fork标志便于依赖项分支。Windows标准库现优先使用原生ntdll API而非kernel32,以避免不必要的开销并提高可靠性。zig libc项目用Zig封装器替代C源文件,减少冗余并提升优化效果。
Zig: Package Management Moved from Compiler to Build Systema month agohttps://ziglang.org/devlog/2026/?2026-06-30#2026-06-30包管理功能从编译器移至构建系统,以提高灵活性和安全性。SPIR-V后端进展包括新增内置函数、执行模式、多线程代码生成以及目标文件链接功能。重新定义@bitCast语义以使用逻辑位布局,提升跨平台一致性。ELF链接器改进支持外部库(包括LLVM和LLD)的增量编译。构建系统重构分离了配置器与构建器进程,加速构建并支持缓存配置。包管理工作流增强包括本地zig-pkg目录和用于依赖覆盖的--fork标志。Windows std.Io绕过kernel32.dll直接调用ntdll,提高性能和可靠性。Zig libc项目用Zig封装器替代C源文件,减少代码量并支持优化。新的std.Io.Evented实现(io_uring和GCD)支持基于纤程协程的实验性异步I/O。类型解析重新设计提升了惰性求值、依赖循环错误信息和增量编译性能。