通过SSA的解释执行窥探Golang编译之一角通过SSA的解释执行窥探Golang编译之一角 丁尔男 武汉航天远景 产品总监 凹语言 联合发起人 PLOC 联合发起人 目 录 Golang 编译流程简介 01 SSA 解释执行 02 基于 SSA 的应用 03 Golang 编译流程简介 源代码 抽象语法树 抽象语法树 (带语义信息) 静态单赋值 目标代码 Golang 编译流程简介 源代码 抽象语法树 抽象语法树 Golang 编译流程简介 源代码 抽象语法树 抽象语法树 (带语义信息) 静态单赋值 目标代码 1 + 2 * 3 *ast.BinaryExpr (+) *ast.BasicLit 1 : INT *ast.BinaryExpr (*) *ast.BasicLit 2 : INT * ast.BasicLit 3 : INT Golang 编译流程简介 01-AST Golang 编译流程简介 源代码 抽象语法树 抽象语法树 (带语义信息) 静态单赋值 目标代码 语义分析,涉及的包: • go/types 功能: • 类型检查和推导,如: v := "a" + 1 • 确定标识符的引用关系,如: var g = 42 func main() { g := "Hello GoCN!" println(g) } Golang 编译流程简介0 码力 | 30 页 | 1.50 MB | 1 年前3
Golang 101(Go语言101 中文版) v1.21.a目录 第0章:关于《Go语言101》 - 为什么写这本书 第1章:致谢 第2章:Go语言简介 - 为什么Go语言值得学习 第3章:Go官方工具链 - 如何编译和运行Go程序 Go编程入门 第4章:程序源代码基本元素介绍 第5章:关键字和标识符 第6章:基本类型和它们的字面量表示 第7章:常量和变量 - 顺便介绍了类型不确定值和类型推断 第8章:运算操作符 - 顺便介绍了更多的类型推断规则 reflect标准库包中提供的反射支持 一些专题 第28章:代码断行规则 第29章:更多关于延迟函数调用的知识点 第30章:一些恐慌/恢复用例 第31章:详解panic/recover原理 - 也解释了什么是“函数退出阶段” 第32章:代码块和标识符作用域 第33章:表达式估值顺序规则 第34章:值复制成本 第35章:边界检查消除 并发编程 第36章:并发同步概述 第37章:通道用例大全 第38章:如何优雅地关闭通道 计略微反直觉,甚至 自相矛盾。 Go语法和语义设计中有很多折衷和权衡。一个Go程序员需要相当 的Go编程经验和感悟才能理解这些权衡。 Go提供了几种基本但非必需的类型,比如切片,接口和通道。 Go编译器和运 行时在实现这些类型的时候,进行了必要的封装。 一方面,这些封装为Go编 程带来了许多便利,使我们不用从头实现这些类型。 但另一方面,这些封装 隐藏了这些类型的内部结构, 从而对我们更深入地理解这些类型的值的行为0 码力 | 821 页 | 956.82 KB | 1 年前3
Golang 101(Go语言101 中文版) v1.21.a目录 第0章:关于《Go语言101》 - 为什么写这本书 第1章:致谢 第2章:Go语言简介 - 为什么Go语言值得学习 第3章:Go官方工具链 - 如何编译和运行Go程序 Go编程入门 第4章:程序源代码基本元素介绍 第5章:关键字和标识符 第6章:基本类型和它们的字面量表示 第7章:常量和变量 - 顺便介绍了类型不确定值和类型推断 第8章:运算操作符 - 顺便介绍了更多的类型推断规则 reflect标准库包中提供的反射支持 一些专题 第28章:代码断行规则 第29章:更多关于延迟函数调用的知识点 第30章:一些恐慌/恢复用例 第31章:详解panic/recover原理 - 也解释了什么是“函数退出阶段” 第32章:代码块和标识符作用域 第33章:表达式估值顺序规则 第34章:值复制成本 第35章:边界检查消除 并发编程 第36章:并发同步概述 第37章:通道用例大全 第38章:如何优雅地关闭通道 计略微反直觉,甚至自 相矛盾。 Go语法和语义设计中有很多折衷和权衡。一个Go程序员需要相当的 Go编程经验和感悟才能理解这些权衡。 Go提供了几种基本但非必需的类型,比如切片,接口和通道。 Go编译器和运 行时在实现这些类型的时候,进行了必要的封装。 一方面,这些封装为Go编程 带来了许多便利,使我们不用从头实现这些类型。 但另一方面,这些封装隐藏 了这些类型的内部结构, 从而对我们更深入地理解这些类型的值的行为带来了0 码力 | 608 页 | 1.08 MB | 1 年前3
Golang 101(Go语言101 中文版) v1.21.a目录 1 目录 第0章:关于《Go语言101》 - 为什么写这本书 第1章:致谢 第2章:Go语言简介 - 为什么Go语言值得学习 第3章:Go官方工具链 - 如何编译和运行Go程序 Go编程入门 第4章:程序源代码基本元素介绍 第5章:关键字和标识符 第6章:基本类型和它们的字面量表示 第7章:常量和变量 - 顺便介绍了类型不确定值和类型推断 第8章:运算操作符 - 顺便介绍了更多的类型推断规则 reflect标准库包中提供的反射支持 一些专题 第28章:代码断行规则 第29章:更多关于延迟函数调用的知识点 第30章:一些恐慌/恢复用例 第31章:详解panic/recover原理 - 也解释了什么是“函数退出阶段” 第32章:代码块和标识符作用域 目录 2 第33章:表达式估值顺序规则 第34章:值复制成本 第35章:边界检查消除 并发编程 第36章:并发同步概述 第37章:通道用例大全 第38章:如何优雅地关闭通道 略微反直觉,甚至自相矛盾。 Go 语法和语义设计中有很多折衷和权衡。一个Go程序员需要相当的Go编程经验和感悟 才能理解这些权衡。 Go提供了几种基本但非必需的类型,比如切片,接口和通道。 Go编译器和运行时在 实现这些类型的时候,进行了必要的封装。 一方面,这些封装为Go编程带来了许多 便利,使我们不用从头实现这些类型。 但另一方面,这些封装隐藏了这些类型的内 部结构, 从而对我们更深入地理解这些类型的值的行为带来了一些障碍。0 码力 | 591 页 | 21.40 MB | 1 年前3
Hello 算法 1.1.0 Go版享你的见解,帮助他人进步。 图 0‑7 评论区示例 0.2.5 算法学习路线 从总体上看,我们可以将学习数据结构与算法的过程划分为三个阶段。 1. 阶段一:算法入门。我们需要熟悉各种数据结构的特点和用法,学习不同算法的原理、流程、用途和效 率等方面的内容。 2. 阶段二:刷算法题。建议从热门题目开刷,先积累至少 100 道题目,熟悉主流的算法问题。初次刷题 时,“知识遗忘”可能是一个挑战,但请 刷题计划请见此 GitHub 仓库。 3. 阶段三:搭建知识体系。在学习方面,我们可以阅读算法专栏文章、解题框架和算法教材,以不断丰富 知识体系。在刷题方面,可以尝试采用进阶刷题策略,如按专题分类、一题多解、一解多题等,相关的 刷题心得可以在各个社区找到。 如图 0‑8 所示,本书内容主要涵盖“阶段一”,旨在帮助你更高效地展开阶段二和阶段三的学习。 第 0 章 前言 hello‑algo 本书的主要受众是算法初学者。如果你已有一定基础,本书能帮助你系统回顾算法知识,书中源代码也 可作为“刷题工具库”使用。 ‧ 书中内容主要包括复杂度分析、数据结构和算法三部分,涵盖了该领域的大部分主题。 ‧ 对于算法新手,在初学阶段阅读一本入门书至关重要,可以少走许多弯路。 ‧ 书中的动画图解通常用于介绍重点和难点知识。阅读本书时,应给予这些内容更多关注。 ‧ 实践乃学习编程之最佳途径。强烈建议运行源代码并亲自敲代码。 ‧0 码力 | 383 页 | 18.48 MB | 1 年前3
Hello 算法 1.0.0 Golang版享你的见解,帮助他人进步。 图 0‑7 评论区示例 0.2.5 算法学习路线 从总体上看,我们可以将学习数据结构与算法的过程划分为三个阶段。 1. 阶段一:算法入门。我们需要熟悉各种数据结构的特点和用法,学习不同算法的原理、流程、用途和效 率等方面的内容。 2. 阶段二:刷算法题。建议从热门题目开刷,如“剑指 Offer”和“LeetCode Hot 100”,先积累至少 100 道题目,熟悉 3~5 轮的重复后,就能将其牢记在心。 3. 阶段三:搭建知识体系。在学习方面,我们可以阅读算法专栏文章、解题框架和算法教材,以不断丰富 知识体系。在刷题方面,可以尝试采用进阶刷题策略,如按专题分类、一题多解、一解多题等,相关的 刷题心得可以在各个社区找到。 如图 0‑8 所示,本书内容主要涵盖“阶段一”,旨在帮助你更高效地展开阶段二和阶段三的学习。 第 0 章 前言 hello‑algo 本书的主要受众是算法初学者。如果你已有一定基础,本书能帮助你系统回顾算法知识,书中源代码也 可作为“刷题工具库”使用。 ‧ 书中内容主要包括复杂度分析、数据结构和算法三部分,涵盖了该领域的大部分主题。 ‧ 对于算法新手,在初学阶段阅读一本入门书至关重要,可以少走许多弯路。 ‧ 书中的动画图解通常用于介绍重点和难点知识。阅读本书时,应给予这些内容更多关注。 ‧ 实践乃学习编程之最佳途径。强烈建议运行源代码并亲自敲代码。 ‧0 码力 | 382 页 | 17.60 MB | 1 年前3
Hello 算法 1.2.0 简体中文 Go 版享你的见解,帮助他人进步。 图 0‑7 评论区示例 0.2.5 算法学习路线 从总体上看,我们可以将学习数据结构与算法的过程划分为三个阶段。 1. 阶段一:算法入门。我们需要熟悉各种数据结构的特点和用法,学习不同算法的原理、流程、用途和效 率等方面的内容。 2. 阶段二:刷算法题。建议从热门题目开刷,先积累至少 100 道题目,熟悉主流的算法问题。初次刷题 时,“知识遗忘”可能是一个挑战,但请 刷题计划请见此 GitHub 仓库。 3. 阶段三:搭建知识体系。在学习方面,我们可以阅读算法专栏文章、解题框架和算法教材,以不断丰富 知识体系。在刷题方面,可以尝试采用进阶刷题策略,如按专题分类、一题多解、一解多题等,相关的 刷题心得可以在各个社区找到。 如图 0‑8 所示,本书内容主要涵盖“阶段一”,旨在帮助你更高效地展开阶段二和阶段三的学习。 第 0 章 前言 www.hello‑algo 本书的主要受众是算法初学者。如果你已有一定基础,本书能帮助你系统回顾算法知识,书中源代码也 可作为“刷题工具库”使用。 ‧ 书中内容主要包括复杂度分析、数据结构和算法三部分,涵盖了该领域的大部分主题。 ‧ 对于算法新手,在初学阶段阅读一本入门书至关重要,可以少走许多弯路。 ‧ 书中的动画图解通常用于介绍重点和难点知识。阅读本书时,应给予这些内容更多关注。 ‧ 实践乃学习编程之最佳途径。强烈建议运行源代码并亲自敲代码。 ‧0 码力 | 384 页 | 18.49 MB | 11 月前3
Hello 算法 1.0.0b5 Golang版到的问题,从而查漏补缺,激发更深入的思考。另一方面,期待你能慷慨地回答其他小伙伴的问题,分享您 的见解,帮助他人进步。 图 0‑6 评论区示例 0.2.5 算法学习路线 从总体上看,我们可以将学习数据结构与算法的过程划分为三个阶段。 1. 算法入门。我们需要熟悉各种数据结构的特点和用法,学习不同算法的原理、流程、用途和效率等方面 内容。 2. 刷算法题。建议从热门题目开刷,如剑指 Offer和LeetCode Hot 100,先积累至少 断丰富知识体 系。在刷题方面,可以尝试采用进阶刷题策略,如按专题分类、一题多解、一解多题等,相关的刷题心 得可以在各个社区找到。 如图 0‑7 所示,本书内容主要涵盖“第一阶段”,旨在帮助你更高效地展开第二和第三阶段的学习。 第 0 章 前言 hello‑algo.com 8 图 0‑7 算法学习路线 0.3 小结 ‧ 本书的主要受众是算法初学者。如果已有一定基础,本书能帮助您系统回顾算法知识,书内源代码也可 顾算法知识,书内源代码也可 作为“刷题工具库”使用。 ‧ 书中内容主要包括复杂度分析、数据结构、算法三部分,涵盖了该领域的大部分主题。 ‧ 对于算法新手,在初学阶段阅读一本入门书籍至关重要,可以少走许多弯路。 ‧ 书内的动画和图解通常用于介绍重点和难点知识。阅读本书时,应给予这些内容更多关注。 ‧ 实践乃学习编程之最佳途径。强烈建议运行源代码并亲自敲打代码。 ‧ 本书网页版的每个章节都0 码力 | 379 页 | 30.70 MB | 1 年前3
Go基础语法宝典觉得上面的还是有些繁琐,继续简化: 现在是不是看上去非常简洁了? := 这个符号直接取代了 var 和 type ,这种形式叫做简短声明。不过它有 一个限制,那就是它只能用在函数内部;在函数外部使用则会无法编译通过,所以一般用 var 方式来定 义全局变量。 //定义一个名称为“variableName”,类型为"type"的变量 var variableName type //定义三个类型都是“type”的变量 vname1为v1,vname2为v2,vname3为v3 编译器会根据初始化的值自动推导出相应的类型 */ vname1, vname2, vname3 := v1, v2, v3 _ (下划线)是个特殊的变量名,任何赋予它的值都会被丢弃。在这个例子中,将值 35 赋予 b ,并同时 丢弃 34 : Go对于已声明但未使用的变量会在编译阶段报错,比如下面的代码就会产生一个错误:声明了 i 但未使 但未使 用。 常量 所谓常量,也就是在程序编译阶段就确定下来的值,而程序在运行时无法改变该值。在Go程序中,常量 可定义为数值、布尔值或字符串等类型。 它的语法如下: 下面是一些常量声明的例子: Go 常量和一般程序语言不同的是,可以指定相当多的小数位数(例如200位),若指定给 float32 自动缩 短为 32bit ,指定给 float64 自动缩短为 64bit ,详情参考0 码力 | 47 页 | 1020.34 KB | 1 年前3
5.cgo 原理解析及优化实践十余年网关研发 • OpenResty 老司机(NGINX + LuaJIT) • MOSN 核心成员 • Envoy Golang extension maintainer • 玩过 DSL 编译器 • 对 LuaJIT、Go 有一些研究 目 录 背景介绍 01 cgo 工作机制 02 cgo 调度机制 03 CPU 优化 04 GC 优化 05 背景介绍 第一部分 网关发展历史 PC 寄存器的修改 编译器完成地址指引 函数调用规约 Go 1.17 数据结构/类型 内存对象生命周期 GMP cgo 编译的两个阶段 cgo 预编译 常规编译 1 2 生成 wrapper 代码 屏蔽 GMP 模型 底层调用 C 编译器 链接器通过符号寻址 cgo 预编译 - C 调用 Go cgo 预编译 - C 调用 Go ① cgo 预编译 - Go 调用 C cgo 预编译 - Go 调用 C ① 普通 Go 代码 ② Wrapper Go 代码 通过 runtime.cgocall 调用 Wrapper C ③ Wrapper C 代码 调用目标 C 函数 cgo_import_static 申明导入 C 函数 方便后续链接器寻址 常规编译 三种源码,分别编译,最终链接为一个可执行文件0 码力 | 45 页 | 5.74 MB | 1 年前3
共 49 条
- 1
- 2
- 3
- 4
- 5













