go tool compile编译的输出的问题

go tool compile编译的输出的问题

http://img1.sycdn.imooc.com//climg/60b743100984f8a013200490.jpg

请教曹大,

1. 这里78和0x004e 00078是一个意思,为什么go tool compile 会需要转换出一个16进制的列,和一个10进制的列?分别有什么做用呢?是不是内存地址?


2. 另外我有一个疑惑,代码编译后,内存地址都是固定的,这个是由操作系统和编译器一起编译决定的?那么如果地址一样,同时启动两个都使用一个地址的程序,不会冲突吗?


3. 按照我的理解,最底层都是汇编调用,比如调用哪个方法,然后返回值写回那个寄存器(或者堆)都是编译器翻译成为了汇编,代码编译后,有部分汇编会调用go的runtime的方法,那这个runtime的代码怎么执行的过程呢?解释执行吗?

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
Xargin 2021-06-02 17:03:54
  1. 10 进制好读一点,多输出可能这个工具作者喜欢。。。没啥特殊意涵,go tool compile -S 出来的这个是相对那个函数的偏移量,链接完成以后出来的才是虚拟地址

  2. 需要了解一下虚拟地址和物理地址的关系,虚拟地址一样,物理地址也不一定一样,通过四级页表和 MMU 之类的硬件进行地址翻译。

  3. 编译完毕以后,每个函数都有唯一的名字和地址,只要能找到地址,通过现场保存和跳转就能做函数调用。编译以后所有函数都是一段二进制机器码,没什么区别

  • 提问者 拧壶冲 #1

    续一个相关问题,

    我发现使用 `go tool compile -S main.go` 和 `go build -gcflags '-S' main.go` 的输出只有细微的差别。

    他们是不是都是生成 SSA的方式?compile和build 都是一样生成SSA,但是它们的区别是什么呢?


    2021-06-27 10:14:24
  • 提问者 拧壶冲 #2
    SSA是不是可以理解成类似java里面的字节码的作用
    2021-06-27 10:28:49
  • Xargin 回复 提问者 拧壶冲 #3

    compile -S 出来的是汇编,生成 SSA 是汇编之前的步骤


    build = compile + link


    java 那个字节码就是最后拿来执行的东西了,SSA 应该和其它编译器里的 IR 之类的可以做类比

    2021-06-29 22:10:06
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师