禅与计算机 禅与计算机
首页
  • Java基础

    • 一文搞懂Java核心技术
    • Java面向对象知识点大总结,建议收藏
    • 聊聊Java中的异常
    • 聊聊Java中的常用类String
    • 万字长文带你细聊Java注解本质
    • 来聊聊Java的反射机制
    • 深入解析Java泛型的魅力与机制
    • Java集合框架深度解析与面试指南
    • Java常用集合类HashMap深度解析
    • LinkedHashMap源码到面试题的全解析
    • 深入解析CopyOnWriteArrayList的工作机制
    • Java基础IO总结
    • Java三大IO模型小结
    • Java BIO NIO AIO详解
    • Java进阶NIO之IO多路复用详解
    • Java8流式编程入门
    • 一文速通lambda与函数式编程
    • Java8函数式方法引用最佳实践
    • Java异常:从原理到实践
  • Java并发编程

    • Java并发编程基础小结
    • 深入理解Java中的final关键字
    • 浅谈Java并发安全发布技术
    • 浅谈Java并发编程中断的哲学
    • Java线程池知识点小结
    • 浅谈Java线程池中拒绝策略与流控的艺术
    • synchronized关键字使用指南
    • 深入源码解析synchronized关键字
    • 详解JUC包下的锁
    • 详解并发编程中的CAS原子类
    • LongAdder源码分析
    • AQS源码解析
    • 深入剖析Java并发编程中的死锁问题
    • Java并发容器总结
    • 详解Java并发编程volatile关键字
    • 并发编程ThreadLocal必知必会
    • CompletableFuture基础实践小结
    • CompletableFuture异步多任务最佳实践
    • 硬核详解FutureTask设计与实现
    • 线程池大小设置的底层逻辑与场景化方案
    • 来聊一个有趣的限流器RateLimiter
  • JVM相关

    • 从零开始掌握 JVM
    • JVM核心知识点小结
    • JVM指令集概览:基础与应用
    • JVM类加载器深度解析
    • JVM方法区深度解析
    • Java内存模型JMM详解
    • Java对象大小的精确计算方法
    • 逃逸分析在Java中的应用与优化
    • 从零开始理解JVM的JIT编译机制
    • G1垃圾回收器:原理详解与调优指南
    • JVM故障排查实战指南
    • JVM内存问题排错最佳实践
    • JVM内存溢出排查指南
    • 简明的Arthas使用教程
    • 简明的Arthas配置及基础运维教程
    • 基于Arthas Idea的JVM故障排查与指令生成
    • 基于arthas量化监控诊断java应用方法论与实践
    • 深入剖析arthas技术原理
    • 探索JVM的隐秘角落:元空间详解
  • 深入理解Spring框架

    • Spring 核心知识点全面解析
    • Spring核心功能IOC详解
    • Spring AOP 深度剖析与实践
    • Spring 三级缓存机制深度解析
    • 深入 Spring 源码,剖析设计模式的落地实践
    • 探索 Spring 事务的奥秘
    • 深入解析Spring Bean的生命周期管理
    • 解读 Spring Boot 核心知识点
    • Spring Boot 启动优化实战:1分钟到13秒的排查与优化之路
    • Spring Boot自动装配原理及实践
    • 一文快速上手Sharding-JDBC
    • sharding-jdbc如何实现分页查询
    • 基于DynamicDataSource整合分库分表框架Shardingsphere
  • 计算机组成原理

    • 计算机硬件知识小结
    • CPU核心知识点小结
    • 浅谈CPU流水线的艺术
    • 从Java程序员视角聊聊CPU缓存
    • CPU任务调度和伪共享问题小结
    • CPU MESI缓存一致性协议
    • CPU内存管理机制
    • 内存深度解析
    • 磁盘存储原理
    • 详解计算机启动步骤
    • CPU南北桥架构与发展史
    • CPU中断机制与硬件交互详解
  • 操作系统

    • 如何实现一个高性能服务器
    • Linux文件结构与文件权限
    • Linux常见压缩指令小结
    • Linux核心系统调用详解
    • Linux进程管理
    • Linux线程管理
    • 进程与线程深度解析
    • Linux进程间通信机制
    • 零拷贝技术原理与实践
    • CPU缓存一致性问题深度解析
    • IO任务与CPU调度艺术
  • 计算机网络

    • 网卡通信原理详解
    • 网卡数据包处理指南
    • 基于抓包详解TCP协议
  • 编码最佳实践

    • 浅谈现代软件工程TDD最佳实践
    • 浅谈TDD模式下并发程序设计与实现
    • 面向AI编程新范式Trae后端开发环境搭建与实践
    • 基于Vibe Coding的Redis分页查询实现
    • 告别AI无效对话:资深工程师的提示词设计最佳实践
  • 实用技巧与配置

    • Mac常用快捷键与效率插件指南
    • Keynote技术科普短视频制作全攻略
  • 元认知

    • 摩擦感:AI时代的写作自省
    • 从断墨寻径浅谈程序员的元学习能力
    • AI时代专注力培养
    • 如何阅读一本书:技术书籍的读书笔记方法论
  • 开发工具

    • IDEA配置详解与高效使用指南
    • Windows环境下JDK安装与环境变量配置
    • Windows 10 下的 Maven 安装配置教程
  • Nodejs
  • 博客搭建
  • Redis

    • Redis核心知识小结
    • 解锁Redis发布订阅模式
    • 掌握Redis事务
    • Redis主从复制技术
    • Redis的哨兵模式详解
    • 深度剖析Redisson分布式锁
    • 详解redis单线程设计思路
    • 来聊聊Redis所实现的Reactor模型
    • Redis RDB持久化源码深度解析
    • 来聊聊redis的AOF写入
    • 来聊聊Redis持久化AOF管道通信的设计
    • 来聊聊redis集群数据迁移
    • Redis SDS动态字符串深度解析
    • 高效索引的秘密:redis跳表设计与实现
    • 聊聊redis中的字典设计与实现
    • 深入Redis SCAN源码:反向迭代算法的设计与实现
  • MySQL

    • MySQL基础知识点小结
    • 解读MySQL 索引基础
    • MySQL 索引进阶指南
    • 解读MySQL Explain关键字
    • 探秘 MySQL 锁:原理与实践
    • 详解MySQL重做日志redolog
    • 详解undoLog在MySQL MVCC中的运用
    • MySQL二进制日志binlog核心知识点
    • MySQL高效插入数据的最佳实践
    • MySQL分页查询优化指南
    • MySQL流式查询的奥秘与应用解析
    • 来聊聊分库分表
    • 来聊聊大厂常用的分布式ID生成方案
  • ElasticSearch

    • Elasticsearch核心原理与架构设计
    • ES 基础使用指南
    • ElasticSearch如何写入一篇文档
    • 深入剖析Elasticsearch文档读取原理
    • 聊聊ElasticSearch性能调优
    • Spring借助Easy-Es操作ES
  • Netty

    • 一文快速了解高性能网络通信框架Netty
    • Netty网络传输简记
    • 来聊聊Netty的ByteBuf
    • 来聊聊Netty消息发送的那些事
    • 解密Netty高性能之谜:NioEventLoop线程池阻塞分析
    • 详解Netty中的责任链Pipeline如何管理ChannelHandler
    • Netty Reactor模型常见知识点小结
    • Netty如何驾驭TCP流式传输?粘包拆包问题全解
    • Netty解码器源码解析
  • 消息队列

    • 一文快速入门消息队列
    • 消息队列RocketMQ入门指南
    • 基于RocketMQ实现分布式事务
    • RocketMQ容器化最佳实践
    • RocketMQ常见问题与深度解析
    • Kafka快速安装与使用指南
  • Nginx

    • Linux下的nginx安装
    • Nginx基础入门总结
    • Nginx核心指令小结
    • Nginx进程结构与核心模块初探
    • Nginx应用进阶HTTP核心模块配置
    • Nginx缓存及HTTPS配置小记
    • nginx高可用实践简记
    • Nginx性能优化
  • 微服务基础

    • 微服务基础知识小结
    • 分布式事务核心概念小结
    • OpenFeign核心知识小结
    • 微服务组件Gateway核心使用小结
    • 分布式事务Seata实践
    • 用 Docker Compose 完成 Seata 的整合部署
  • Nacos

    • Nacos服务注册原理全解析
    • Nacos服务订阅流程全解析
    • Nacos服务变更推送流程全解析
    • 深入解析SpringCloud负载均衡器Loadbalancer
    • Nacos源码环境搭建与调试指南
  • Seata

    • 深度剖析Seata源码
  • Docker部署

    • 一文快速掌握docker的理念和基本使用
    • 使用docker编排容器
    • 基于docker-compose部署微服务基本环境
    • 基于docker容器化部署微服务
    • Gateway全局异常处理及请求响应监控
    • Docker图形化界面工具Portainer最佳实践
  • Go基础

    • AI时代的Go语言基础语法认知
    • AI时代视角下聊聊Go语言的编译过程
    • 一文快速掌握Go语言切片
    • 来聊聊go语言的hashMap
    • 一文速通go语言类型系统
    • 浅谈Go语言中的面向对象
    • go语言是如何实现协程的
    • 聊聊go语言中的GMP模型
    • 极简的go语言channel入门
    • 聊聊go语言基于epoll的网络并发实现
    • 写给Java开发的Go语言协程实践
  • mini-redis实战

    • 来聊聊我用go手写redis这件事
    • mini-redis如何解析处理客户端请求
    • 实现mini-redis字符串操作
    • 硬核复刻redis底层双向链表核心实现
    • 动手复刻redis之go语言下的字典的设计与落地
    • Go 语言下的 Redis 跳表设计与实现
    • Go 语言版 Redis 有序集合指令复刻探索
    • 基于 Claude Code 复刻 Redis 慢查询指令实践
  • 项目编排

    • Spring脚手架创建简记
    • Spring脚手架集成分页插件
    • Spring脚手架集成校验框架
    • maven父子模块两种搭建方式简记
    • SpringBoot+Vue3前后端快速整合入门
    • 来聊聊Java项目分层规范
  • 场景设计

    • Java实现文件分片上传
    • 基于时间缓存优化浏览器轮询阻塞问题
    • 基于EasyExcel实现高效导出
    • 10亿数据高效插入MySQL最佳方案
    • AI时代不可替代的底层思维:位运算与逻辑运算实战
    • 对账核销场景设计与重构实践
    • 千万级交易流水慢查询综合治理实践
    • 记一次StarRocks源码级排错和既有架构优化实践
    • 基于快照合并修复Seata AT回滚补偿与Flink批攒导致StarRocks数据不一致最佳实践
  • CI/CD

    • 基于NETAPP实现内网穿透
    • 基于Gitee实现Jenkins自动化部署SpringBoot项目
    • Jenkins离线安装部署教程简记
    • 基于Nexus搭建Maven私服基础入门
    • 基于内网的Jenkins整合gitlab综合方案简记
  • 监控方法论

    • SpringBoot集成Prometheus与Grafana监控
    • Java监控度量Micrometer全解析
    • 从 micrometer计量器角度快速上手promQL
    • 硬核安利一个监控告警开源项目Nightingale
  • Spring AI

    • Spring AI Alibaba深度实战:一文掌握智能体开发全流程
    • Spring AI Alibaba实战:JVM监控诊断Arthas Agent的工程化构建与最佳实践
  • 大模型评测

    • M2.7 真能打!我用两个真实场景测了测,结果有点意外
    • Qoder JetBrains插件评测:祖传代码重构与接口优化实战
    • 从一次线上事故到底层算法复刻与监控落地,我用MiniMax M3跑通了完整闭环
  • AI工具链

    • Claude Code 实战指南:从安装配置到企业级开发流程
    • 一次 Claude Code 启动失败的 AI 辅助排查复盘
    • 基于提示词工程与KITE框架的Redis签到功能开发实践
    • Claude Code 记忆管理:CLAUDE.md 最佳实践
    • Claude Code 规则管理:Rules 拆分编排与迭代实践(文末送书)
    • VSCode与Claude Code后端开发环境搭建与AI编程工作流实践
    • AI 写的企业级组件不敢用?我替你验过了
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

sharkchili

计算机禅修者
首页
  • Java基础

    • 一文搞懂Java核心技术
    • Java面向对象知识点大总结,建议收藏
    • 聊聊Java中的异常
    • 聊聊Java中的常用类String
    • 万字长文带你细聊Java注解本质
    • 来聊聊Java的反射机制
    • 深入解析Java泛型的魅力与机制
    • Java集合框架深度解析与面试指南
    • Java常用集合类HashMap深度解析
    • LinkedHashMap源码到面试题的全解析
    • 深入解析CopyOnWriteArrayList的工作机制
    • Java基础IO总结
    • Java三大IO模型小结
    • Java BIO NIO AIO详解
    • Java进阶NIO之IO多路复用详解
    • Java8流式编程入门
    • 一文速通lambda与函数式编程
    • Java8函数式方法引用最佳实践
    • Java异常:从原理到实践
  • Java并发编程

    • Java并发编程基础小结
    • 深入理解Java中的final关键字
    • 浅谈Java并发安全发布技术
    • 浅谈Java并发编程中断的哲学
    • Java线程池知识点小结
    • 浅谈Java线程池中拒绝策略与流控的艺术
    • synchronized关键字使用指南
    • 深入源码解析synchronized关键字
    • 详解JUC包下的锁
    • 详解并发编程中的CAS原子类
    • LongAdder源码分析
    • AQS源码解析
    • 深入剖析Java并发编程中的死锁问题
    • Java并发容器总结
    • 详解Java并发编程volatile关键字
    • 并发编程ThreadLocal必知必会
    • CompletableFuture基础实践小结
    • CompletableFuture异步多任务最佳实践
    • 硬核详解FutureTask设计与实现
    • 线程池大小设置的底层逻辑与场景化方案
    • 来聊一个有趣的限流器RateLimiter
  • JVM相关

    • 从零开始掌握 JVM
    • JVM核心知识点小结
    • JVM指令集概览:基础与应用
    • JVM类加载器深度解析
    • JVM方法区深度解析
    • Java内存模型JMM详解
    • Java对象大小的精确计算方法
    • 逃逸分析在Java中的应用与优化
    • 从零开始理解JVM的JIT编译机制
    • G1垃圾回收器:原理详解与调优指南
    • JVM故障排查实战指南
    • JVM内存问题排错最佳实践
    • JVM内存溢出排查指南
    • 简明的Arthas使用教程
    • 简明的Arthas配置及基础运维教程
    • 基于Arthas Idea的JVM故障排查与指令生成
    • 基于arthas量化监控诊断java应用方法论与实践
    • 深入剖析arthas技术原理
    • 探索JVM的隐秘角落:元空间详解
  • 深入理解Spring框架

    • Spring 核心知识点全面解析
    • Spring核心功能IOC详解
    • Spring AOP 深度剖析与实践
    • Spring 三级缓存机制深度解析
    • 深入 Spring 源码,剖析设计模式的落地实践
    • 探索 Spring 事务的奥秘
    • 深入解析Spring Bean的生命周期管理
    • 解读 Spring Boot 核心知识点
    • Spring Boot 启动优化实战:1分钟到13秒的排查与优化之路
    • Spring Boot自动装配原理及实践
    • 一文快速上手Sharding-JDBC
    • sharding-jdbc如何实现分页查询
    • 基于DynamicDataSource整合分库分表框架Shardingsphere
  • 计算机组成原理

    • 计算机硬件知识小结
    • CPU核心知识点小结
    • 浅谈CPU流水线的艺术
    • 从Java程序员视角聊聊CPU缓存
    • CPU任务调度和伪共享问题小结
    • CPU MESI缓存一致性协议
    • CPU内存管理机制
    • 内存深度解析
    • 磁盘存储原理
    • 详解计算机启动步骤
    • CPU南北桥架构与发展史
    • CPU中断机制与硬件交互详解
  • 操作系统

    • 如何实现一个高性能服务器
    • Linux文件结构与文件权限
    • Linux常见压缩指令小结
    • Linux核心系统调用详解
    • Linux进程管理
    • Linux线程管理
    • 进程与线程深度解析
    • Linux进程间通信机制
    • 零拷贝技术原理与实践
    • CPU缓存一致性问题深度解析
    • IO任务与CPU调度艺术
  • 计算机网络

    • 网卡通信原理详解
    • 网卡数据包处理指南
    • 基于抓包详解TCP协议
  • 编码最佳实践

    • 浅谈现代软件工程TDD最佳实践
    • 浅谈TDD模式下并发程序设计与实现
    • 面向AI编程新范式Trae后端开发环境搭建与实践
    • 基于Vibe Coding的Redis分页查询实现
    • 告别AI无效对话:资深工程师的提示词设计最佳实践
  • 实用技巧与配置

    • Mac常用快捷键与效率插件指南
    • Keynote技术科普短视频制作全攻略
  • 元认知

    • 摩擦感:AI时代的写作自省
    • 从断墨寻径浅谈程序员的元学习能力
    • AI时代专注力培养
    • 如何阅读一本书:技术书籍的读书笔记方法论
  • 开发工具

    • IDEA配置详解与高效使用指南
    • Windows环境下JDK安装与环境变量配置
    • Windows 10 下的 Maven 安装配置教程
  • Nodejs
  • 博客搭建
  • Redis

    • Redis核心知识小结
    • 解锁Redis发布订阅模式
    • 掌握Redis事务
    • Redis主从复制技术
    • Redis的哨兵模式详解
    • 深度剖析Redisson分布式锁
    • 详解redis单线程设计思路
    • 来聊聊Redis所实现的Reactor模型
    • Redis RDB持久化源码深度解析
    • 来聊聊redis的AOF写入
    • 来聊聊Redis持久化AOF管道通信的设计
    • 来聊聊redis集群数据迁移
    • Redis SDS动态字符串深度解析
    • 高效索引的秘密:redis跳表设计与实现
    • 聊聊redis中的字典设计与实现
    • 深入Redis SCAN源码:反向迭代算法的设计与实现
  • MySQL

    • MySQL基础知识点小结
    • 解读MySQL 索引基础
    • MySQL 索引进阶指南
    • 解读MySQL Explain关键字
    • 探秘 MySQL 锁:原理与实践
    • 详解MySQL重做日志redolog
    • 详解undoLog在MySQL MVCC中的运用
    • MySQL二进制日志binlog核心知识点
    • MySQL高效插入数据的最佳实践
    • MySQL分页查询优化指南
    • MySQL流式查询的奥秘与应用解析
    • 来聊聊分库分表
    • 来聊聊大厂常用的分布式ID生成方案
  • ElasticSearch

    • Elasticsearch核心原理与架构设计
    • ES 基础使用指南
    • ElasticSearch如何写入一篇文档
    • 深入剖析Elasticsearch文档读取原理
    • 聊聊ElasticSearch性能调优
    • Spring借助Easy-Es操作ES
  • Netty

    • 一文快速了解高性能网络通信框架Netty
    • Netty网络传输简记
    • 来聊聊Netty的ByteBuf
    • 来聊聊Netty消息发送的那些事
    • 解密Netty高性能之谜:NioEventLoop线程池阻塞分析
    • 详解Netty中的责任链Pipeline如何管理ChannelHandler
    • Netty Reactor模型常见知识点小结
    • Netty如何驾驭TCP流式传输?粘包拆包问题全解
    • Netty解码器源码解析
  • 消息队列

    • 一文快速入门消息队列
    • 消息队列RocketMQ入门指南
    • 基于RocketMQ实现分布式事务
    • RocketMQ容器化最佳实践
    • RocketMQ常见问题与深度解析
    • Kafka快速安装与使用指南
  • Nginx

    • Linux下的nginx安装
    • Nginx基础入门总结
    • Nginx核心指令小结
    • Nginx进程结构与核心模块初探
    • Nginx应用进阶HTTP核心模块配置
    • Nginx缓存及HTTPS配置小记
    • nginx高可用实践简记
    • Nginx性能优化
  • 微服务基础

    • 微服务基础知识小结
    • 分布式事务核心概念小结
    • OpenFeign核心知识小结
    • 微服务组件Gateway核心使用小结
    • 分布式事务Seata实践
    • 用 Docker Compose 完成 Seata 的整合部署
  • Nacos

    • Nacos服务注册原理全解析
    • Nacos服务订阅流程全解析
    • Nacos服务变更推送流程全解析
    • 深入解析SpringCloud负载均衡器Loadbalancer
    • Nacos源码环境搭建与调试指南
  • Seata

    • 深度剖析Seata源码
  • Docker部署

    • 一文快速掌握docker的理念和基本使用
    • 使用docker编排容器
    • 基于docker-compose部署微服务基本环境
    • 基于docker容器化部署微服务
    • Gateway全局异常处理及请求响应监控
    • Docker图形化界面工具Portainer最佳实践
  • Go基础

    • AI时代的Go语言基础语法认知
    • AI时代视角下聊聊Go语言的编译过程
    • 一文快速掌握Go语言切片
    • 来聊聊go语言的hashMap
    • 一文速通go语言类型系统
    • 浅谈Go语言中的面向对象
    • go语言是如何实现协程的
    • 聊聊go语言中的GMP模型
    • 极简的go语言channel入门
    • 聊聊go语言基于epoll的网络并发实现
    • 写给Java开发的Go语言协程实践
  • mini-redis实战

    • 来聊聊我用go手写redis这件事
    • mini-redis如何解析处理客户端请求
    • 实现mini-redis字符串操作
    • 硬核复刻redis底层双向链表核心实现
    • 动手复刻redis之go语言下的字典的设计与落地
    • Go 语言下的 Redis 跳表设计与实现
    • Go 语言版 Redis 有序集合指令复刻探索
    • 基于 Claude Code 复刻 Redis 慢查询指令实践
  • 项目编排

    • Spring脚手架创建简记
    • Spring脚手架集成分页插件
    • Spring脚手架集成校验框架
    • maven父子模块两种搭建方式简记
    • SpringBoot+Vue3前后端快速整合入门
    • 来聊聊Java项目分层规范
  • 场景设计

    • Java实现文件分片上传
    • 基于时间缓存优化浏览器轮询阻塞问题
    • 基于EasyExcel实现高效导出
    • 10亿数据高效插入MySQL最佳方案
    • AI时代不可替代的底层思维:位运算与逻辑运算实战
    • 对账核销场景设计与重构实践
    • 千万级交易流水慢查询综合治理实践
    • 记一次StarRocks源码级排错和既有架构优化实践
    • 基于快照合并修复Seata AT回滚补偿与Flink批攒导致StarRocks数据不一致最佳实践
  • CI/CD

    • 基于NETAPP实现内网穿透
    • 基于Gitee实现Jenkins自动化部署SpringBoot项目
    • Jenkins离线安装部署教程简记
    • 基于Nexus搭建Maven私服基础入门
    • 基于内网的Jenkins整合gitlab综合方案简记
  • 监控方法论

    • SpringBoot集成Prometheus与Grafana监控
    • Java监控度量Micrometer全解析
    • 从 micrometer计量器角度快速上手promQL
    • 硬核安利一个监控告警开源项目Nightingale
  • Spring AI

    • Spring AI Alibaba深度实战:一文掌握智能体开发全流程
    • Spring AI Alibaba实战:JVM监控诊断Arthas Agent的工程化构建与最佳实践
  • 大模型评测

    • M2.7 真能打!我用两个真实场景测了测,结果有点意外
    • Qoder JetBrains插件评测:祖传代码重构与接口优化实战
    • 从一次线上事故到底层算法复刻与监控落地,我用MiniMax M3跑通了完整闭环
  • AI工具链

    • Claude Code 实战指南:从安装配置到企业级开发流程
    • 一次 Claude Code 启动失败的 AI 辅助排查复盘
    • 基于提示词工程与KITE框架的Redis签到功能开发实践
    • Claude Code 记忆管理:CLAUDE.md 最佳实践
    • Claude Code 规则管理:Rules 拆分编排与迭代实践(文末送书)
    • VSCode与Claude Code后端开发环境搭建与AI编程工作流实践
    • AI 写的企业级组件不敢用?我替你验过了
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • Go基础

    • 关于我想写一个Go系列的这件事
    • Go环境以及IDE安装配置简记
    • AI时代的Go语言基础语法认知
    • AI时代视角下聊聊Go语言的编译过程
      • 写在文章开头
      • 从历史了解Go语言的诞生
      • Go语言编译过程详解
        • 词法分析
        • 语法解析
        • 语义分析
        • 中间端优化
        • 高级语法降级
        • 生成中间码
        • 生成汇编码
        • 链接
        • Go vs Java:编译模型对比
      • 小结
      • 参考
    • 聊聊Go程序是如何运行的
    • 一文带你速通Go语言数组
    • 一文快速掌握Go语言切片
    • 深入理解go语言中的切片
    • 一文带你速通编程语言中的指针
    • 来聊聊go语言的hashMap
    • 聊聊go语言中map如何解决散列性能下降
    • 一文速通Go语言的map
    • 一文速通go语言类型系统
    • 浅谈Go语言中的面向对象
    • 聊聊go语言中的内存填充
    • 聊聊Go语言中的字符串
    • 聊一聊go语言的空值
    • Go语言企业级日志管理
    • 基于魔改Nightingale源码浅谈go语言包模块管理
    • go语言是如何解决map并发安全问题的
    • go语言是如何实现协程的
    • go语言如何实现协程的抢占式调度的
    • 聊聊go语言中的GMP模型
    • 聊聊go语言对于协程并发的设计
    • 协程是否越多越好
    • 基于Go语言的网络IO扫盲
    • 聊聊go语言基于epoll的网络并发实现
    • 聊聊Go语言中的networkpoller工作机制
    • 聊聊go语言对于socket的抽象
    • 用Go语言实现一个单协程消费者模型
    • 用Go实现一个无界资源池
    • 用go语言实现一个有界协程池
    • 极简的go语言channel入门
    • 聊聊go语言channel为什么可以高效
    • 聊聊go语言channel中的一些小技巧
    • 写给Java开发的Go语言协程实践
  • mini-redis实战

  • Go面试题

  • Go语言
  • Go基础
sharkchili
2026-03-25
目录

AI时代视角下聊聊Go语言的编译过程

# 写在文章开头

近期一直在梳理AI时代前,笔者写的一些文章,记得当时笔者本着效率和工作效率上的考量,对于知识密度的考量现在看来远远不够。

笔者认为AI时代下,对于编程语言的学习因弱化对于语法细节的比重,毕竟经过大量语料的训练的模型,基本不会出现语法表达的上的错误,这是不断在犯错的人类(尤其是没有智能IDE时代的时代)所无法做到的,所以AI时代下,我们应学会弱化这部分的工作的参与比重:

我们应着重在以下层面完成个人核心能力的升级:

  • 设计决策:理解语言的本质,了解对于语言具体落地方式,例如:编写一个Go语言函数的时候,学会什么时候用值,什么时候用指针
  • 原理分析:经过大量的优秀的语料分析,AI对于逻辑代码的编写是非常标准且规范的,但是它无法每时每刻帮你做到极致,即只能给你保证能用 ,对于性能上如果开发者没有一定的认知,无论多么出色模型,都会因为你的上限而受限制,例如:对于函数编写细节上的逃逸分析和GC压力推理分析
  • 架构选择:AI可以非常高效帮我们完成编码的工作,对于系统的全局推理决策和未来的规划和人为的不可抗力因素是无法做到完美的权衡。所以,我们也要学会在架构设计上具备准确的技术选型和全流程架构设计能力,界定软件系统边界和能力,做到既能保证现状,又能对未来各种变化进行预埋,例如:在核心流程的互斥层面,用接口的形式构建一个标准的分布式互斥行为定义,将来若系统升级由单体架构升级为分布式架构,只需基于接口构建一个签名一致的工具类,即可完成架构升级

所以,这篇文章,笔者将不再拘泥于编译实现的各个中间层的细节,而是着重于强调读者如何基于这些输出,完成如下工作:

  • 快速得出自己的需求,协同AI获得合适的输出
  • 学会判断AI的准确性、合理性
  • 基于AI看透本质,完成个人认知沉淀和进阶

希望我的理念对你有所帮助。

SharkChili · 禅与计算机程序设计的艺术

开源贡献

  • mini-redis:教学级 Redis 精简实现 · https://github.com/shark-ctrl/mini-redis

关注公众号,回复 【加群】 加入技术社群

# 从历史了解Go语言的诞生

实际上,每一个技术的诞生,都是伴随一个历史的痛点,以本文所要讲的Go语言的编译过程为例,在计算机行业发展初期,2007年Google团队一直采用C++进行软件研发工作,由于系统工程的敏捷迭代,一个2000源文件、4.2MB的源代码项目在分布式编译集群下需要45分钟才能完成,即使经过各种极致的优化,也需要25分钟:

In 2007, build engineers at Google instrumented the compilation of a major Google binary. The file contained about two thousand files that, if simply concatenated together, totaled 4.2 megabytes. By the time the #includes had been expanded, over 8 gigabytes were being delivered to the input of the compiler, a blow-up of 2000 bytes for every C++ source byte. [1]

所以,Google团队就有了设计一门新语言的想法,即一种编译快、编程简单抑易于维护且性能表现出色的小而美的编程语言——于是就有了Go语言 [2]。所以这也是笔者为什么要讲解Go语言编译这一知识点的原因,即学会了解痛点并得出最佳解决方案,并学会汲取方案后面优秀的设计。

# Go语言编译过程详解

# 词法分析

国内大部分的教程都喜欢强调突兀的定理和结论,然后让读者带头毫无用处的结论进行后续的阅读和理解,这是笔者完全不能接受的。所以在讲解Go语言编译的时候,笔者还是希望从一个实际的场景出发,逐步推导得到结论,再进行总结,辅助读者感知理解,最后获得一个全局视角的知识体系:

回到文章课题,为了能够让读者对编译这个相对抽象的知识本身有着直观的理解和认知,我们给出本文的代码示例,即一段简单的计算函数和main传参调用:

package main

import "fmt"

func main() {
	sum := calc(1, 2, 3)
	fmt.Println(sum)
}

func calc(a int, b int, c int) int {
	return a + b*c
}


1
2
3
4
5
6
7
8
9
10
11
12
13
14

完整的编码交给编译器之后,词法分析器会按照最小语义化单位将其切割为token序列,对应的我们的代码,将被拆解为如下子序列,因为有了AI,笔者对于这些词法解析的细节不做过度展开,大体描述一下这步的内容,本质上词法解析是将我们的编码按照既有关键字例如:

  • PACKAGE关键字:记录声明的包名
  • IDENT关键字:开发者定位的名字,例如main函数和add函数
  • FUNC关键字:func关键字,定义函数

通过这种标准化关键字,将所有的编码转为标准化token,为后续的语法解析形成树结构做好准备。

# 语法解析

结合词法解析得到的基本token序列,语法解析阶段会通过高效的递归向下+运算符优先级的混合解析器,构建出AST树。以我们的代码所生成token序列为例:

  1. 看到func关键字,知道要解析函数,故调用parseFuncDecl
  2. 看到return关键字,了解知道返回值,调用parseReturnStmt
  3. 看到Return后面的a+b知道这是一个运算表达式,于是调用parseExpr

就这样逐层递归,于是就有了下面这棵宏观上的语法树:

与之对应还有一个运算优先级的分析,按照数学先乘除后加减的逻辑,我们的运算也会构建出一个AST树,如下所示,结合AST树自下而上的规律,该数学会先完成子树的乘法,然后递归向上完成加法运算:

# 语义分析

语义分析阶段,主要完成类型检查、接口满意度检查和常量求值等细节优化工作。以我们的代码为例,因为入参a、b、c进行计算后求值也是int类型,所以类型检查是通过。

然后是接口满意度检查,因为我们代码比较简单,所以没有这一步骤,假设我们有个类要继承Writer接口,对应就需要编写和Writer接口签名一致的Write方法,即入参为byte数组,出参为int和error类型:

Write(p []byte) (n int, err error)
1

所以笔者在实现myWriter,就会按照签名约定指定签名格式保持一致,如下代码,反之若不存在该方法的实现,则会出现编译报错:*myWriter does not implement io.Writer (missing Write method)

// myWriter 实现了 io.Writer 接口(有 Write 方法)
type myWriter struct{}

func (w *myWriter) Write(p []byte) (n int, err error) {
	fmt.Println(string(p))
	return len(p), nil
}
1
2
3
4
5
6
7

最后就是常量折叠了,这一步的工作就是Go语言执行高效的原因所在,和大部分高级语言一样,在编译阶段为了避免后续非必要的CPU运算开销,若存在常量级的显示运算,GO语言会在编译期直接完成常量折叠工作,例如我们存在一个运算代码:

const x = 1 + 2
	fmt.Println(x)

	y := 1 + 2
	fmt.Println(y)
1
2
3
4
5

Go语言感知到运算操作是常量,则会直接在编译期进行常量折叠,在编译期完成计算,并写入到对应的变量上:

对应可通过如下指令完成汇编输出:

go build -gcflags="-S" main.go 2>&1 | grep "main.go"
1

输出结果如下,可以看到,编译器将常量计算结果直接在汇编码中体现,即直接将常量结果放到寄存器R6地址上,并没有add操作:

反之若无法在编译期感知变量实值的情况下,则会执行add操作:

# 中间端优化

中间端优化会执行一些函数内联和逃逸分析的操作,这也是一个非常经典的设计,函数内联顾名思义就是将简单函数编译优化为简单指令,避免栈帧跳转的开销,以我们的计算函数为例,则是直接将calc方法优化为一段函数指令:

还是以我们的运算函数为例,执行go build -gcflags="-m" main.go 2>&1查看汇编:

import (
	"fmt"
)

func main() {
	sum := calc(1, 2, 3)
	fmt.Println(sum)
}

func calc(a, b, c int) int {
	return a + b*c
}
1
2
3
4
5
6
7
8
9
10
11
12

可以看到在编译期针对add函数执行了内联操作,不再进行函数跳转调用,而是直接在当前栈帧完成运算:

另外一个则是逃逸分析,这也是一个非常经典的设计,传统对象都是在堆上分配,这就涉及到内存申请等操作系统级别写入的开销,Go为了避免这一动态非可控的操作系统级别调用,进行了逃逸分析的优化操作,若发现对象并没有发生函数逃逸则直接在栈上分配,避免内存申请的开销(栈编译期即可知道分配大小)和非必要的GC操作:

如下代码,我们分别创建两个方法,一个方法变量指针(发生逃逸),一个返回值,变量没有逃逸,并通过go:noinline避免这些函数内联:

//go:noinline
func stackAlloc() int {
	x := 42
	return x
}

//go:noinline
func heapAlloc() *int {
	x := 42
	return &x
}

func main() {
	a := stackAlloc()
	b := heapAlloc()
	_, _ = a, b
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

最终执行结果如下,可以看到返回指针的变量,因为返回了变量地址导致函数逃逸,变量分配到了堆上,而返回值的函数,变量直接在栈上分配完成逻辑运算:

# 高级语法降级

高级编程语言本质是让开发者能够快速理解函数语义,高效完成编码工作,CPU则反之,这些非指令结构化指令在执行时非常抵消,所以GO语言存在一个高级语法降级的操作,即降一些语义化的语法转为标准法指令让CPU标准高效执行例如:

高级 Go 语法                      降级后的基本操作
─────────────                    ──────────────────

m[key] = value           ──▶    runtime.mapassign(map, key, value)

ch <- msg                ──▶    runtime.chansend(ch, msg)

defer cleanup()          ──▶    runtime.deferproc(&cleanup)
1
2
3
4
5
6
7
8

对此,笔者也写了一个简单的map赋值的代码,通过go build -gcflags="-S" main.go 2>&1 可以看到,这段代码底层被降低为runtime.mapassign_faststr这个高效的标准函数调用:

# 生成中间码

在生成各个系统平台可执行的机器码之前,go会生成一段与平台无关的中间汇编码,即可SSA码,在此期间,代码可能还会再进行一次优化工作,例如:

  • 死代码消除

对于SSA码,感兴趣的读者可以在操作系统上通过这段指令生成:

GOSSAFUNC=main go build main.go
1

执行完成之后,文件夹会生成一段ssa.html,读者打开之后就会看到下面这样一个网页,其中网页的最右边就是我们说的SSA码,由于SSA码不是笔者本次讨论的重点就是就不做展开了:

# 生成汇编码

通过上述的步骤之后,系统就会得到中间码,自此各个平台都会基于这段中间码生成汇编码,当然如果你对汇编码感兴趣,可以通过下面这段执行看到我们的代码转为Plan 9的汇编码:

go build -gcflags -S main.go
1

可以看到一行简单的输出语句就变成下面这样一段汇编代码:

# 链接

基于上述的代码键入如下指令即可查看go语言的编译过程:

go build -n main.go
1

此时在Linux终端就会输出一大段日志,这里笔者就贴出几个比较核心的地方,首先就是导入配置,由上代码我们可知我们用到了go语言最基本的runtime和fmt包:

# import config
packagefile fmt=/root/.cache/go-build/7a/7a84f8c71e0cd98a53158ab655d48960d612698abe0567abbeb7a633bcb066b7-d
packagefile runtime=/root/.cache/go-build/e2/e2bf522ce6c0c2bfb09b8486578b70b1424422349a8dc2c5e200bf6b8760d950-d
EOF
1
2
3
4

随后就开始通过compile完成上述所说的编译过程:

cd /root
/usr/local/go/pkg/tool/linux_amd64/compile -o $WORK/b001/_pkg_.a -trimpath "$WORK/b001=>" -p main -complete -buildid 5LGDePcnhcnEtpXVckY4/5LGDePcnhcnEtpXVckY4 -goversion go1.22.0 -c=2 -nolocalimports -importcfg $WORK/b001/importcfg -pack ./main.go
/usr/local/go/pkg/tool/linux_amd64/buildid -w $WORK/b001/_pkg_.a # internal
cat >$WORK/b001/importcfg.link << 'EOF' # internal

.....

1
2
3
4
5
6
7

中间完成中间码和汇编码生成机器码之后,就来到了链接这一步,如下输出所示,可以看到它用到了/usr/local/go/pkg/tool/linux_amd64/link

cd .
/usr/local/go/pkg/tool/linux_amd64/link -o $WORK/b001/exe/a.out -importcfg $WORK/b001/importcfg.link -buildmode=exe -buildid=IGC7T6g3raqmSVvDtHEN/5LGDePcnhcnEtpXVckY4/5LGDePcnhcnEtpXVckY4/IGC7T6g3raqmSVvDtHEN -extld=gcc $WORK/b001/_pkg_.a
/usr/local/go/pkg/tool/linux_amd64/buildid -w $WORK/b001/exe/a.out # internal
1
2
3

最终在最后一段输出我们得到了可执行文件main,自此我们的go代码编译过程完成:

mv $WORK/b001/exe/a.out main
1

链接器把所有依赖——你的代码、标准库代码、Go runtime(调度器、GC、内存分配器)——全部打包进一个二进制文件。这就是为什么Go部署只需要一个文件。

# Go vs Java:编译模型对比

对于笔者的大部分读者都是Java背景(笑),这里做一个编译模型的对比:

维度 Go Java
编译产物 原生机器码 字节码(.class)
运行方式 直接执行,二进制包含完整runtime 需要JVM,JIT编译
部署物 单个静态链接二进制 jar + JRE
启动速度 毫秒级 秒级(JVM预热)
内存占用 低(~10MB) 高(~200MB+)
优化时机 编译期(AOT) 运行时(JIT)

简单解释一下上表中的 AOT 和 JIT:

  • AOT(Ahead-Of-Time,提前编译):在程序运行之前,就把源代码一次性编译成机器码。Go、C、C++、Rust 都是 AOT
  • JIT(Just-In-Time,即时编译):先编译成字节码(.class),等程序运行时,JVM 再把热点代码实时编译成机器码。Java、C# 默认是 JIT
AOT(Go)的执行流程:                   JIT(Java)的执行流程:

源码 → 编译器 → 机器码 → 直接执行      源码 → javac → 字节码 → JVM → 运行时编译成机器码
         ↑                                      ↑                    ↑
    开发阶段完成                            开发阶段完成          运行时才完成
1
2
3
4
5

这个对比不是要分高下,而是帮读者理解:Go选择静态编译是为了部署简单和启动快,代价是放弃了JIT的运行时优化。理解它才能做出正确的技术选型。

# 小结

本文从Go语言的诞生背景出发,逐阶段拆解了Go代码从编写到运行的完整旅程:

  1. 词法分析:源代码 → Token序列
  2. 语法分析:Token → AST(递归下降 + 运算符优先级)
  3. 语义分析:类型检查 + 接口满意度检查 + 常量折叠
  4. 中间端优化:函数内联 + 逃逸分析
  5. 高级语法降级:map/channel/defer → runtime调用
  6. 生成中间码(SSA):平台无关优化
  7. 生成机器码:SSA → 原生汇编
  8. 链接:打包所有依赖 → 单个二进制文件

回到文章开头提出的三个核心能力,学完编译原理后,你应该能够回答:

  • 设计决策:什么时候传值、什么时候传指针?——理解逃逸分析后你就知道了
  • 原理分析:AI生成的代码性能如何?——用 go build -gcflags="-m" 检查逃逸情况
  • 架构选择:为什么选Go而不是Java?——理解AOT vs JIT的权衡后你就能回答了

SharkChili · 禅与计算机程序设计的艺术

开源贡献

  • mini-redis:教学级 Redis 精简实现 · https://github.com/shark-ctrl/mini-redis

关注公众号,回复 【加群】 加入技术社群

# 参考

《Go语言设计与实现》

编辑 (opens new window)
上次更新: 2026/06/01, 09:47:02
AI时代的Go语言基础语法认知
聊聊Go程序是如何运行的

← AI时代的Go语言基础语法认知 聊聊Go程序是如何运行的→

最近更新
01
从一次线上事故到底层算法复刻与监控落地,我用MiniMax M3跑通了完整闭环
06-04
02
深入Redis SCAN源码:反向迭代算法的设计与实现
06-01
03
Go语言常见面试题解析(上)语言基础与核心概念
05-20
更多文章>
Theme by Vdoing | Copyright © 2025-2026 Evan Xu | MIT License | 桂ICP备2024034950号 | 桂公网安备45142202000030
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×
×