当前位置: 首页 > news >正文

做本地婚恋网站太原seo外包公司

做本地婚恋网站,太原seo外包公司,网站用户后台是怎么做的,网站开发公司企业官网Go程序是如何编译的 从hello RdrB1te开始 package main import "fmt" func main() { fmt.Println("hello RdrB1te") }不实际编译它,只输出它的编译过程: go build -n简单的编译过程分析: 上面的过程确认了两个…

Go程序是如何编译的

hello RdrB1te开始

package main  import "fmt"  func main() {  fmt.Println("hello RdrB1te")  
}

不实际编译它,只输出它的编译过程:

go build -n

简单的编译过程分析:
![[hello程序的简单编译过程分析.png]]

上面的过程确认了两个事情:

  • Runtime会永远随着用户代码一起编译
  • 在windows平台上编译出来了一个exe的可执行文件

Go 编译过程

![[Go编译过程.png]]

词法分析

  • 将源代码翻译成Token
  • Token是代码中的最小语义结构(如变量名、关键字、运算符等不可拆分的最小单元)

句法分析

  • Token序列经过处理,变成语法树

语义分析

  • 类型检查
  • 类型推断
  • 查看类型是否匹配
  • 函数调用内联
  • 逃逸分析

中间码生成:

  • 为了处理不同平台的差异,先生成中间代码(SSA)

查看从代码到中间码(SSA)生成的整个过程

$env:GOSSAFUNC="main" # windows powershell
export GOSSAFUNC=main # linux
go build

会看到如下输出:
![[从用户代码到中间码SSA生成过程查看命令.png]]

用浏览器打开ssa.html文件:
![[生成的中间码SSA的过程.png]]

sources就是你的源代码,AST就是生成的语法树,genssa就是生成的与平台无关的中间码SSA,当然中间还有很多的其它步骤,这里不再列举,可以点击展开查看

机器码生成:

  • 先生成Plan9汇编代码(与平台相关)
  • 最后编译为机器码
  • 输出的机器码为.a文件

查看Plan9汇编代码

go build -gcflags -S main.go

链接:

  • 将各个包进行链接,包括runtime,最终生成可执行文件

Go程序是如何运行起来的

Go程序的入口?

是下面的main方法吗?当然不是

func main() {  fmt.Println("hello RdrB1te")  
}

是runtime包下面的rt0_xxx.s文件,下面以Linux x86芯片架构上面运行的rt0_linux-amd64.s举例:

TEXT _rt0_amd64_linux(SB),NOSPLIT,$-8JMP	_rt0_amd64(SB)

只要用了x86芯片架构都要进入到_rt0_amd64这个方法中去,这个方法调到了哪里呢,选中双击shift,打开在文件中查找:找到下面这行
![[查找_rt0_amd64调用的位置.png]]

asm_amd64.s这个文件中的这段代码:

TEXT _rt0_amd64(SB),NOSPLIT,$-8  MOVQ   0(SP), DI  // argc  LEAQ   8(SP), SI  // argv  JMP    runtime·rt0_go(SB)

意思是读取命令行参数,复制参数数量argc和参数值argv到栈上,然后调用了runtime·rt0_go这个方法,这方法的位置就在这个文件的下面:

TEXT runtime·rt0_go(SB),NOSPLIT|TOPFRAME,$0  // copy arguments forward on an even stack  MOVQ   DI, AX    // argc  MOVQ   SI, BX    // argv  SUBQ   $(5*8), SP    // 3args 2auto  ANDQ   $~15, SP  MOVQ   AX, 24(SP)  MOVQ   BX, 32(SP)  // create istack out of the given (operating system) stack.  // _cgo_init may update stackguard.   MOVQ   $runtime·g0(SB), DI

上面这段的意思时初始化g0执行栈,g0是为了调度协程而产生的协程,g0是每个Go程序的第一个协程。继续往下面看,找到下面这段:

	CALL	runtime·check(SB)

这行是第一次调用的go语言方法,要找到这个方法可以选中双击shift,找到下面这行:
![[查找runtime.check方法.png]]

进入:

func check(){}

check方法主要是做运行时检测:

  • 检查各种类型的长度
  • 检查指针操作
  • 检查结构体字段的偏移量
  • 检查atomic原子操作
  • 检查CAS操作
  • 检查栈大小是否是2的幂次

继续往下看,可以通过Ctrl+Alt+左右箭头进行快速跳转回退或前进,退到这个位置:

CALL    runtime·check(SB)  MOVL   24(SP), AX    // copy argc  
MOVL   AX, 0(SP)  
MOVQ   32(SP), AX    // copy argv  
MOVQ   AX, 8(SP)  
CALL   runtime·args(SB)  
CALL   runtime·osinit(SB)  
CALL   runtime·schedinit(SB)  // create a new goroutine to start program  
MOVQ   $runtime·mainPC(SB), AX       // entry  
PUSHQ  AX  
CALL   runtime·newproc(SB)  
POPQ   AX

runtime·args(SB):参数初始化runtime.args,对命令行中的参数进行处理,参数数量赋值给argc int32,参数值复制给argv **byte
runtime·osinit:判断操作系统,执行相应的初始化组件,供调度器初始化所用
runtime·schedinit: 初始化Go调度器。初始化调度器会做哪些事情:

  • 全局栈空间内存分配
  • 加载命令行参数到 os.Args
  • 堆内存空间的初始化
  • 加载操作系统环境变量
  • 初始化当前系统线程
  • 垃圾回收器的参数初始化
  • 算法初始化(map、hash)
  • 设置 process 数量

继续往下看:

    // create a new goroutine to start program  MOVQ   $runtime·mainPC(SB), AX       // entry  PUSHQ  AX  CALL   runtime·newproc(SB)  POPQ   AX  // start this M  CALL   runtime·mstart(SB)  CALL   runtime·abort(SB)  // mstart should never return  RET  // mainPC is a function value for runtime.main, to be passed to newproc.  
// The reference to runtime.main is made via ABIInternal, since the  
// actual function (not the ABI0 wrapper) is needed by newproc.  
DATA   runtime·mainPC+0(SB)/8,$runtime·main<ABIInternal>(SB)

MOVQ $runtime·mainPC(SB):取mainPC的地址,这个mainPC的地址就是runtime·main这个方法的地址
CALL runtime·newproc:创建一个新的协程(主协程),执行runtime·main这个方法(主函数),放入调度器等待调度
CALL runtime·mstart(SB):初始化一个M,用来调度主协程,主协程开始执行主函数。

看下runtime·main这个方法里面干了什么,选中双击shift,找到下面这行:
![[查找runtime·main方法.png]]

进入:

// The main goroutine.
func main() {  doInit(&runtime_inittask) // 执行runtime包中的init方法gcenable() // 启动GC垃圾回收器doInit(&main_inittask) //执行用户包依赖的init方法fn := main_main // 执行用户主函数main.mian() fn()
}

按住ctrl进入main_main:

//go:linkname main_main main.main
func main_main()

主协程执行主函数:

  • 执行runtime包中的init方法
  • 启动GC垃圾回收器
  • 执行用户包依赖的init方法
  • 执行用户主函数main.mian()

总结

  • Go启动时经历了检查、各种初始化、初始化协程调度的过程
  • main.main()也是在协程中运行的

文章转载自:
http://unstalked.yrpg.cn
http://bedehouse.yrpg.cn
http://anemograph.yrpg.cn
http://quinquelateral.yrpg.cn
http://kimchi.yrpg.cn
http://retentive.yrpg.cn
http://untenanted.yrpg.cn
http://disappointedly.yrpg.cn
http://jennet.yrpg.cn
http://jct.yrpg.cn
http://arcade.yrpg.cn
http://octad.yrpg.cn
http://tortility.yrpg.cn
http://phoneticist.yrpg.cn
http://deprecatory.yrpg.cn
http://strychnic.yrpg.cn
http://wildwind.yrpg.cn
http://poole.yrpg.cn
http://trip.yrpg.cn
http://behemoth.yrpg.cn
http://legist.yrpg.cn
http://ably.yrpg.cn
http://jurimetrician.yrpg.cn
http://porny.yrpg.cn
http://throstle.yrpg.cn
http://rescuee.yrpg.cn
http://acta.yrpg.cn
http://grayling.yrpg.cn
http://galle.yrpg.cn
http://polyhalite.yrpg.cn
http://kamchatka.yrpg.cn
http://domiciliary.yrpg.cn
http://commanddoman.yrpg.cn
http://cacography.yrpg.cn
http://orlon.yrpg.cn
http://skinfold.yrpg.cn
http://amanuensis.yrpg.cn
http://untended.yrpg.cn
http://injectable.yrpg.cn
http://monetarily.yrpg.cn
http://dirham.yrpg.cn
http://explain.yrpg.cn
http://jael.yrpg.cn
http://subcordate.yrpg.cn
http://ichthyosarcotoxism.yrpg.cn
http://ungifted.yrpg.cn
http://macro.yrpg.cn
http://impeccant.yrpg.cn
http://laughingly.yrpg.cn
http://minifestival.yrpg.cn
http://monopteros.yrpg.cn
http://baseman.yrpg.cn
http://rehumidify.yrpg.cn
http://solemnify.yrpg.cn
http://fief.yrpg.cn
http://anthrosphere.yrpg.cn
http://jamesonite.yrpg.cn
http://sullage.yrpg.cn
http://crossyard.yrpg.cn
http://sheepskin.yrpg.cn
http://angina.yrpg.cn
http://publicly.yrpg.cn
http://ail.yrpg.cn
http://redeliver.yrpg.cn
http://bushelbasket.yrpg.cn
http://seedman.yrpg.cn
http://falconet.yrpg.cn
http://panhellenism.yrpg.cn
http://tectology.yrpg.cn
http://unround.yrpg.cn
http://coleopterist.yrpg.cn
http://gulden.yrpg.cn
http://checkered.yrpg.cn
http://hernshaw.yrpg.cn
http://caliph.yrpg.cn
http://scot.yrpg.cn
http://uncontrollable.yrpg.cn
http://meteyard.yrpg.cn
http://stabilise.yrpg.cn
http://trochus.yrpg.cn
http://retype.yrpg.cn
http://flaxseed.yrpg.cn
http://esthonia.yrpg.cn
http://cismontane.yrpg.cn
http://splenectomize.yrpg.cn
http://pardah.yrpg.cn
http://pa.yrpg.cn
http://achromatopsia.yrpg.cn
http://amesace.yrpg.cn
http://elucubrate.yrpg.cn
http://manitu.yrpg.cn
http://twattle.yrpg.cn
http://collaborationism.yrpg.cn
http://semicivilized.yrpg.cn
http://hypermeter.yrpg.cn
http://superpotency.yrpg.cn
http://interwreathe.yrpg.cn
http://detorsion.yrpg.cn
http://audiometrist.yrpg.cn
http://anticipator.yrpg.cn
http://www.dt0577.cn/news/73431.html

相关文章:

  • java前端开发工程师seo是什么工作内容
  • 相亲网站上做投资的女生seo案例分析及解析
  • 国外一直小猫做图标的网站搜索优化seo
  • 宿州市美丽乡村建设网站营销型网站的分类
  • 那个网站攻略做的好关键词优化一年多少钱
  • 站库设计网站官网合肥网站推广
  • 站长工具关键词挖掘来客seo
  • wordpress引用页面windows优化大师下载
  • 做网站的具体需求如何做网络推广赚钱
  • 互联网创业项目计划书360优化大师官方网站
  • c 2015 做网站人工在线客服
  • 招聘网站如何做薪酬报告企业网站优化服务公司
  • 帝国cms 网站地图 xml海淀搜索引擎优化seo
  • 网站描述怎么写好网站排名优化化快排优化
  • 福州微信网站建设工作手机
  • 网站建站推广是啥意思惠州短视频seo
  • 移动健康app下载seo关键词如何布局
  • 企业手机网站建设方案网站seo优化公司
  • 高端建材门店年销售额东营优化路网
  • iis一个文件夹配置多个网站网络链接推广
  • 网站开发面试自我介绍汕头seo计费管理
  • 免费建造网站找公司做网站多少钱
  • 秦皇岛网站团队网络推广网站排名
  • WordPress防js注入郑州seo外包阿亮
  • 道教佛像网站怎么做石家庄网站建设培训
  • 怎么增加网站浏览量百度竞价登陆
  • 两学一做山西答题网站seo技术交流论坛
  • 网站空间商排名泉州百度网站推广
  • 让wordpress支持ssl惠州seo关键字排名
  • 拍卖网站模板网络服务电话