1
0
mirror of https://github.com/chai2010/advanced-go-programming-book.git synced 2025-05-24 12:32:21 +00:00

Merge pull request #157 from fuwensun/pr3-5-6

ch3-05-fix typo
This commit is contained in:
chai2010 2018-06-29 19:29:03 +08:00 committed by GitHub
commit 6e451d6cf2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -165,9 +165,9 @@ func main() {
其中runtime.Caller先获取当时的PC寄存器值以及文件和行号。然后根据PC寄存器表示的指令位置通过runtime.FuncForPC函数获取函数的基本信息。Go语言是如何实现这种特性的呢 其中runtime.Caller先获取当时的PC寄存器值以及文件和行号。然后根据PC寄存器表示的指令位置通过runtime.FuncForPC函数获取函数的基本信息。Go语言是如何实现这种特性的呢
Go语言作为一终静态编译型语言,在执行时每个函数的地址都是固定的,函数的每条指令也时固定的。如果针对每个函数和函数的每个指令生成一个地址表格也叫PC表格那么在运行时我们就可以根据PC寄存器的值轻松查询到指令当时对应的函数和位置信息。而Go语言也采用类似的策略,只不过地址表格经过裁剪,舍弃了不必要的信息。因为要在运行时获取任意一个地址的位置,必然是要有一个函数调用,因此我们只需要为函数的开始和结束位置,以及每个函数调用位置生成地址表格就可以了。同时地址是有大小顺序的,在排序后可以通过只记录增量来减少数据的大小;在查询时可以通过二分法加快查找的速度。 Go语言作为一门静态编译型语言,在执行时每个函数的地址都是固定的,函数的每条指令也是固定的。如果针对每个函数和函数的每个指令生成一个地址表格也叫PC表格那么在运行时我们就可以根据PC寄存器的值轻松查询到指令当时对应的函数和位置信息。而Go语言也采用类似的策略,只不过地址表格经过裁剪,舍弃了不必要的信息。因为要在运行时获取任意一个地址的位置,必然是要有一个函数调用,因此我们只需要为函数的开始和结束位置,以及每个函数调用位置生成地址表格就可以了。同时地址是有大小顺序的,在排序后可以通过只记录增量来减少数据的大小;在查询时可以通过二分法加快查找的速度。
在汇编中有个PCDATA用于生成PC表格PCDATA的指令用法为`PCDATA tableid, tableoffset`。PCDATA有个两个参数第一个参数为表格的类型第二个是表格的地址。在目前的实现中有PCDATA_StackMapIndex和PCDATA_InlTreeIndex两种表格类型。两种表格的数据是类似的应该包含了代码所在的文件路径、行号和函数的信息只不过PCDATA_InlTreeIndex用于内联函数的表格。 在汇编中有个PCDATA用于生成PC表格PCDATA的指令用法为`PCDATA tableid, tableoffset`。PCDATA有个两个参数第一个参数为表格的类型第二个是表格的地址。在目前的实现中有PCDATA_StackMapIndex和PCDATA_InlTreeIndex两种表格类型。两种表格的数据是类似的应该包含了代码所在的文件路径、行号和函数的信息只不过PCDATA_InlTreeIndex用于内联函数的表格。
此外对于汇编函数中返回值包含指针的类型在返回值指针被初始化之后需要执行一个GO_RESULTS_INITIALIZED指令 此外对于汇编函数中返回值包含指针的类型在返回值指针被初始化之后需要执行一个GO_RESULTS_INITIALIZED指令