我的Go+语言初体验——学习Go+设计架构笔记合集 - Go语言中文社区

我的Go+语言初体验——学习Go+设计架构笔记合集


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
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2023-01-03 20:41:32
  • 阅读 ( 181 )
  • 分类:架构

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢