2.1.3 如何用Go模拟CPU
计算机的演化历史 – 硬件计算到冯诺伊曼架构 • 构建虚拟世界 – MOS 6502 • 控制单元(control unit) • 运算逻辑单元(arithmetic logic unit) • 6502汇编器与链接器 • 未来目标 1970年程序员 CPU 80KHz 单核 内存 64KB 手编磁芯 老娘把你送上月球 2021年程序员 CPU 2,400,000KHz 4核 内存 8,000 虚拟内存?不存在的 • 都是用汇编编写程序 Go模拟Apple II • ZHUOS = Zhuo’s Hardly Usable Operating System for fun • 小结 • 早期电脑都是直接读写内存/硬件 • 操作系统仅仅是帮助处理IO • 进程?不存在的 • 用户?不存在的 • 虚拟内存?不存在的 你说汇编? 可GCC 不支持6502啊 Go 编写汇编器 • 破除迷信 • processing https://www.youtube.com/watch?v=KINIAgRpkDA Go 编写汇编器 • 如何开始? • http://www.appleoldies.ca/anix/ • 先读读前人的工作 • 然后用Go实现! Go 编写汇编器等工具 • 用Go编写的汇编器编写ZHUOS • Tokenizer + Parser(可以参加比赛) • 解析语句 • 几乎不用的就直接不实现0 码力 | 42 页 | 7.10 MB | 1 年前3Golang 101(Go语言101 中文版) v1.21.a
时,只 有它的直接部分(第17章)被复制了。 不含函数体的函数声明 我们可以使用Go汇编(Go assembly) ? 来实现一个Go函数。 Go汇编代码放 在后缀为.a的文件中。 一个使用Go汇编实现的函数依旧必须在一个*.go文件 中声明,但是它的声明必须不能含有函数体。 换句话说,一个使用Go汇编实 现的函数的声明中只含有它的原型。 某些有返回值的函数可以不必返回 如果一个函数有返 系统调用。 注意此标准库包和 其它标准库包不同,它其中的函数是和具体操作系统相关的。 Go汇编 Go函数可以使用Go汇编语言来编写。Go汇编是一种跨平台(尽管并非100%) 的汇编语言。 Go汇编汇编常用来实现一些对性能要求很高的函数。 更多详情,请阅读下列文章: Go汇编快速导读 ? Go汇编的设计 ? cgo 通过cgo机制,我们可以在Go代码中调用C代码,或者反之。 请阅读下列链接0 码力 | 821 页 | 956.82 KB | 1 年前3Golang 101(Go语言101 中文版) v1.21.a
制时,只 有它的直接部分(第17章)被复制了。 不含函数体的函数声明 我们可以使用Go汇编(Go assembly) 来实现一个Go函数。 Go汇编代码放在 后缀为.a的文件中。 一个使用Go汇编实现的函数依旧必须在一个*.go文件中声 明,但是它的声明必须不能含有函数体。 换句话说,一个使用Go汇编实现的函 数的声明中只含有它的原型。 某些有返回值的函数可以不必返回 如果一个函数有返回 行系统调用。 注意此标准库包和 其它标准库包不同,它其中的函数是和具体操作系统相关的。 Go汇编 Go函数可以使用Go汇编语言来编写。Go汇编是一种跨平台(尽管并非100%) 的汇编语言。 Go汇编汇编常用来实现一些对性能要求很高的函数。 更多详情,请阅读下列文章: Go汇编快速导读 Go汇编的设计 cgo 通过cgo机制,我们可以在Go代码中调用C代码,或者反之。 请阅读下列链接0 码力 | 608 页 | 1.08 MB | 1 年前3Golang 101(Go语言101 中文版) v1.21.a
的直接部分(第17章)被复制了。 不含函数体的函数声明 我们可以使用Go汇编(Go assembly)(https://golang.google.cn/doc/asm)来实 现一个Go函数。 Go汇编代码放在后缀为.a的文件中。 一个使用Go汇编实现的函数 依旧必须在一个*.go文件中声明,但是它的声明必须不能含有函数体。 换句话 说,一个使用Go汇编实现的函数的声明中只含有它的原型。 某些有返回值的函数可以不必返回 标准库包不同,它其中的函数是和具体操作系统相关的。 Go汇编 Go函数可以使用Go汇编语言来编写。Go汇编是一种跨平台(尽管并非100%)的汇编 语言。 Go汇编汇编常用来实现一些对性能要求很高的函数。 更多详情,请阅读下列文章: Go汇编快速导读(https://golang.google.cn/doc/asm) Go汇编的设计(https://talks.golang.org/2016/asm0 码力 | 591 页 | 21.40 MB | 1 年前3Go 入门指南(The way to Go)
有着更显著的优势,因为它在解决一些很难用 C++ 解决的问题的同时,让我的工作变得更加高效。我并不是说 C++ 的存在是一个错误,相反地,我认 为这是历史发展的必然结果。当我深陷在 C 语言这门略微比汇编语言好一点的泥潭时,我坚信任何语言的 构造都不可能支持大型项目的开发。像垃圾回收或并发语言支持这类东西,在当时都是极其荒谬的主意, 根本没有人在乎。C++ 向大型项目开发迈出了重要的第一步,带领我们走进这个广袤无垠的世界。很庆幸 Plan 9 项目。 g = 编译器:将源代码编译为项目代码(程序文本) l = 链接器:将项目代码链接到可执行的二进制文件(机器代码) (相关的 C 编译器名称为 6c、8c 和 5c,相关的汇编器名称为 6a、8a 和 5a) 标记(Flags) 是指可以通过命令行设置可选参数来影响编译器或链接器的构建过程或得到一个特殊的 目标结果。 可用的编译器标记如下: flags: -I 针对包的目录搜索 针对包的目录搜索 -d 打印声明信息 -e 不限制错误打印的个数 -f 打印栈结构 -h 发生错误时进入恐慌(panic)状态 -o 指定输出文件名 // 详见第3.4节 -S 打印产生的汇编代码 -V 打印编译器版本 // 详见第2.3节 -u 禁止使用 unsafe 包中的代码 -w 打印归类后的语法解析树 -x 打印 lex tokens 从 Go 1.0.3 版本开始,不再使用 8g,8l0 码力 | 380 页 | 2.97 MB | 1 年前35.cgo 原理解析及优化实践
• 释放 extraM 不好搞 • pthread_key_create(&pthread_g, pthread_key_destructor) • crosscall2 是手写 Plan9 的汇编函数 • 兼容性处理:十来个 CPU,好几个 OS • 搞懂混合编译:Go,ASM ,C dropm 的判断条件 1. 有些操作系统,比如 Windows,不支持 pthread 来注册 destructor0 码力 | 45 页 | 5.74 MB | 1 年前3Go 入门指南(The way to Go)
有着更显著的优势,因为它在解决一些很难用 C++ 解决的问题的同时, 让我的工作变得更加高效。我并不是说 C++ 的存在是一个错误,相反地,我认为这是历史发展的必然结果。当我深 陷在 C 语言这门略微比汇编语言好一点的泥潭时,我坚信任何语言的构造都不可能支持大型项目的开发。像垃圾回收 或并发语言支持这类东西,在当时都是极其荒谬的主意,根本没有人在乎。C++ 向大型项目开发迈出了重要的第一 步,带领我们走进这个广袤无垠的世界。很庆幸 项目。 1. g = 编译器:将源代码编译为项目代码(程序文本) 2. l = 链接器:将项目代码链接到可执行的二进制文件(机器代码) (相关的 C 编译器名称为 6c、8c 和 5c,相关的汇编器名称为 6a、8a 和 5a) 标记(Flags) 是指可以通过命令行设置可选参数来影响编译器或链接器的构建过程或得到一个特殊的目标结 果。 可用的编译器标记如下: 1. flags: 4. -e 不限制错误打印的个数 5. -f 打印栈结构 6. -h 发生错误时进入恐慌(panic)状态 7. -o 指定输出文件名 // 详见第3.4节 8. -S 打印产生的汇编代码 9. -V 打印编译器版本 // 详见第2.3节 10. -u 禁止使用 unsafe 包中的代码 11. -w 打印归类后的语法解析树 12. -x 打印 lex tokens0 码力 | 466 页 | 4.44 MB | 1 年前3Go Web编程
最后,如果你想在同一个系统中安装多个版本的Go,你可以参考第三方工具GVM,这是目前在这方面做得最好的工 具,除非你知道怎么处理。 Go源码安装 Go源码安装 在Go的源代码中,有些部分是用Plan 9 C和AT&T汇编写的,因此假如你要想从源码安装,就必须安装C的编译工具。 在Mac系统中,只要你安装了Xcode,就已经包含了相应的编译工具。 在类Unix系统中,需要安装gcc等工具。例如Ubuntu系统可通过在终端中执行sudo0 码力 | 295 页 | 5.91 MB | 1 年前3
共 8 条
- 1