Go+的安装教程
前面有分享,直达车:https://bbs.csdn.net/topics/603567061
Go+整体架构图
起点:Go+源代码
终点:一个可执行文件(软件) or 一个包(package)
过程:输入源代码,中间经过token流,经历AST抽象语法树,Dom Writer类似于一个容器,可以在里面灌东西,最后能形成Go的抽象语法树,通过go的命令行工具转换成可执行文件。
编译过程:
1)gop/token
- token是编译原理的概念类似于自然语言里面的词
- 源代码是字节流:[]byte
- 需要通过lex过程变成token流:[]token
2)gop/scanner
- scanner编译原理中的lex过程(词法分析)
- 它通常不需要我们主动调用,而是用parser调用
3)gop/parser
- 编译原理中的parser过程(语法分析),负责将token流转为DOM(即[]token => AST)
parser的使用方式:Go+与Go是一摸一样的原型
func(os.FileInfo)bool,mode Mode)(pkgs map[string]*ast.Package,first
error) ```
- fset:主要用来记录文件偏移offset与行列号line:col之间的关系
- path:源代码所在路径
- filter:过滤文件通途
- mode:一些控制parser过程的flags,可以传0
- pkgs:得到的AST
- first:在parser出错的时候,发生的第一个错误
4)gop/ast
- AST的全称是抽象语法树,是语言的DOM
- DOM在文本处理中是很经典的模式(XML/json等通用文档都有自己的DOM,这和语言有自己的AST实质相同)
5)gop/cl
- 编译(语法分析):负责把Go+AST转换为对gox DOM Writer的调用
- 这意味着cl实现的是从Go+AST DOM到另一种DOM的变换
cl的使用方式
*Config)(p *gox.Package,err error) ```
- pkgPath:要编译的目标Go+pkg的import路径
- pkg:要编译的目标Go+pkg的AST
- conf:编译用的配置
- p:生成的gox DOM Writer,已经调用其他接口完成了格式转换
- err:在编译过程中如果发生错误,则返回所有的编译错误
6)gox
- 是一个Go语言的DOM Writer组件,用来生成Go AST
- 所以cl+gox完成了Go+AST到Go AST的转换
gox的使用方式
一部分给cl灌数据,实现格式转换的,一部分是用来生成Go AST/Source的
7)go
- 有了Go AST/Source后,就可以用go tools来进行编译了
gop run .核心流程 (hello world 的实现过程)
fset:= token.NewFileSet()
pkgGops,err:= parser.ParseDir(fset,".",nil,0)
pfgFox,err:= cl.NewPackage("main",pkgGopx["mian"].nil)
err = gox.WriteFile("gop_autogen.go",pkgGox,false)
err = exec.Command("go","run","gop_autogen.go").Run()
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_42224055/article/details/121635154
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。