Effective Java 现代重读
《Effective Java》第三版围绕对象、类型、泛型、异常、并发与序列化给出了 90 条建议,内容覆盖到 Java 9。后来 Java 增加了 record、sealed 类型、模式匹配和虚拟线程,有些手写惯用法可以直接交给语言,有些原则则需要重新划清适用边界。本文沿用 C++ 现代重读的方式,按第三版编号逐条讨论:现在应该怎么写,为什么这样写,以及哪些地方不能机械套用。书籍版本与章节...
gperf-usage
在词法分析器、配置解析器或固定命令分发中,经常需要把字符串映射为枚举。词表在编译时已经确定、运行时只查询时,可以让 GNU gperf 在构建阶段生成专用的 C++ 查找代码,再把它编译进程序。运行时不需要安装 gperf,也不需要链接 -lgperf。GNU gperf 官方介绍 本文用 if、else、for、while、return 五个关键字搭建完整示例:编写词表,生成代码,封装 s...
Effective C++ 与 More Effective C++ 现代重读
《Effective C++》第三版(2005,55 条)成书于 C++98,《More Effective C++》(1996,35 条)甚至早于第一个标准。两本书奠定了 C++ 工程实践的基本盘——RAII、异常安全、最小惊讶的接口设计——但在 C++11 之后的语言里,相当一部分条款已被语言特性直接解决,另一部分则换了个形态继续成立。本文按现代 C++(C++11–C++23)的标准逐...
C++ Type Traits:在编译期认识和处理类型
📑 C++ 泛型编程系列:模板 | Type Traits | Concept 写泛型代码时,常会遇到这样的问题:T 是不是整数?能不能用一组参数构造?移动构造是否可能抛异常?去掉引用和 const 后是什么类型?这些问题取决于类型,通常要在编译期回答。标准库 <type_traits> 提供的 type traits(类型特征),就是一组回答这类问题的模板。 先看最常见的...
Java Timeline
📑 Java 演进系列:总览 | Java 8 | Java 11 | Java 17 | Java 21 | Java 25 Java:从 Java 8 到 Java 25 的 LTS 演进 本系列有意只保留 Oracle Java SE Support Roadmap 标记的五个 LTS 版本:Java 8、11、17、21 与 25;下图以 java-lts-timeline.s...
Java 11 - 现代平台的稳定基线
📑 Java 演进系列:总览 | Java 8 | Java 11 | Java 17 | Java 21 | Java 25 Java 11 于 2018-09-25 正式发布,是继 Java 8 之后的第一个长期支持(LTS)版本。它承接了 Java 9 的模块系统与 Java 10 的 var 局部变量推断——这些在中间非 LTS 版本定稿的特性在此 LTS 中可用,并为后续版本...
Java 17 - 现代语言特性的汇合
📑 Java 演进系列:总览 | Java 8 | Java 11 | Java 17 | Java 21 | Java 25 Java 17 于 2021 年 9 月 14 日正式发布,是继 Java 11 之后又一个 LTS 版本,也是现代 Java 语言特性的汇合点。需要注意:record(Java 16 定稿)、文本块(Java 15 定稿)、switch 表达式(Java 1...
Java 21 - 并发模型的跃迁
📑 Java 演进系列:总览 | Java 8 | Java 11 | Java 17 | Java 21 | Java 25 Java 21 于 2023 年 9 月 19 日 GA,是继 Java 17 之后的 LTS 版本,按 Oracle 的支持路线图获得长期支持。它的核心主题是并发模型的跃迁:虚拟线程成为正式特性,让"一请求一线程"的阻塞式写法重新可行;记...
Java 25 - 生产力与运行时演进
📑 Java 演进系列:总览 | Java 8 | Java 11 | Java 17 | Java 21 | Java 25 Java 25 于 2025 年 9 月 16 日 GA,包含 18 个 JEP,是继 Java 21 之后的 LTS 版本;自 25 起 Oracle 将 LTS 间距从 3 年缩短为 2 年,Java 25 获得 Oracle 至少 8 年 Premier...
Java 8 - 函数式编程的起点
📑 Java 演进系列:总览 | Java 8 | Java 11 | Java 17 | Java 21 | Java 25 Java 8 于 2014 年 3 月 18 日正式发布,是 Oracle 支持 roadmap 上首个长期支持(LTS)版本,也是 Java 历史上影响最深远的版本。它引入了 Lambda 表达式、Stream API 和新的日期时间 API,把函数式编程范...
Go 的 iter:从 range 函数到可组合迭代
Go 1.23 为 for range 增加了函数作为遍历对象的能力,同时引入标准库包 iter。这不是为 Go 补上 Java、C++ 风格的可变游标对象,而是把已有的回调遍历模式标准化为可组合的序列协议:生产者调用 yield 推送元素,消费者通过 range 决定是否继续。 本文的代码要求 Go 1.23 或更新版本。语言特性是“对函数 range”,iter 包则提供了通用命名类型...
牛津高阶词典(第 10 版)使用指南
《牛津高阶英汉双解词典》第 10 版(以下简称 OALD10,Oxford Advanced Learner’s Dictionary, 10th edition)不是只用来查中文释义的词典。一个词条同时交代词义、语体、地域、搭配和句法;真正应优先看的,是这些限制信息。本文以第 10 版的纸质词典为准,并补充其在线版沿用的标注;在线版会持续增补词条,个别界面图标和标签可能与纸书不同。 先统一...
JavaScript 在浏览器、Node.js 与 Bun 中的运行差异
JavaScript 的语言语法由 ECMAScript 定义,但 fetch、文件系统、模块解析和事件循环并不属于 ECMAScript。它们由宿主运行时提供。因此,同一段 JavaScript 是否可运行、如何加载依赖、何时执行回调,取决于它运行在浏览器、Node.js 还是 Bun。 先区分语言与运行时 ECMAScript 规定了 class、Promise、模块语法、Map 和 A...
Java 泛型:核心规则
泛型(Generics)把类型作为类、接口和方法的参数。List<String> 的价值是:写入不匹配的类型会在编译期失败,读取时不必重复强制转换。Java 泛型由类型擦除实现,因此也有明确的运行期边界。 示例省略 java.util 与 java.util.function 的导入;标有“编译错误”的代码仅用于说明规则。 基础语法 <T> 是类型参数,Strin...
Java Interface
interface 用来定义类型之间的协作契约:调用方只依赖“能做什么”,实现类决定“如何完成”。它是 Java 多态、依赖倒置和函数式编程的基础。接口不是用来承载对象状态的轻量 class;一个接口应当表达一项稳定、可替换的能力。 基础语法 使用 interface 声明接口,class 使用 implements 兑现契约;接口继承接口时使用 extends。顶层接口可为 public ...
Rust 编译基础:cargo 与 rustc 的分工及编译选项
cargo build 背后其实是两个工具的分工:cargo 负责依赖解析、编译顺序调度和缓存判断,真正做编译的是 rustc——每次调用 rustc 只编译一个 crate。理解 rustc 内部的流水线,才能明白各类编译选项到底作用于哪一层。 编译逻辑链 rustc 采用多趟(multi-pass)流水线,源码逐级降阶(lowering)为越来越低级的中间表示(IR),最终交给 LLVM...
Rust 标准库 std:模块地图、常用 trait 与工程用法
std 是 Rust 默认提供的标准库 crate。它不只是若干容器和工具函数:从 Option、Result、迭代器、格式化,到文件、网络、线程、进程和平台路径,日常 Rust 程序的大多数基础能力都从这里开始。而这些能力背后大多是 trait 的约定——#[derive]、==、for、?、+、println!、文件读写与线程边界,背后都是标准库 trait。正确的使用方式不是背模块名和...
rustup
rustup 是 Rust 官方的工具链管理器,负责安装、升级和切换 Rust 工具链(rustc、cargo、rustfmt、clippy 等)。它类似于 Python 的 pyenv、Node 的 nvm,是 Rust 开发的标准入口。 安装 1curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh...
git
把 Git 想成项目的“拍照机”就够了:你先挑好这张照片要包含哪些改动,再按下快门;以后随时可以回到任意一张照片,或者从某张照片开始开一条新分支。 真正需要分清的只有三处:工作目录是你正在修改的文件,暂存区是下一张照片的候选内容,版本库是已经拍好的历史照片。git add 是挑选内容,git commit 才是按下快门。 数据模型 不必先记 blob、tree 这些名字。先跟着一次最普通的...
Oh My Pi 高阶玩家手册
Oh My Pi(omp)不只是一个终端里的 AI 编码助手。用顺手之后,它更像一个可配置、可约束、可编排的本地开发代理:多模型角色路由、子代理编排、Skills/Hooks 扩展体系、MCP 集成、多种 compaction 策略、headless JSON 输出,以及一套跨 Claude Code / Codex / Gemini 配置的兼容发现层。 这篇不是入门教程。安装、登录、第一次...



















