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

椰卤工程师 社区中级贡献者 2021-11-30 16:32:57

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是一摸一样的原型

function ParseDir(fset *token.FileSet,path string,filter 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的使用方式

func NewPackage(pkgPath string,pkg *ast.Package,conf *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()

 

...全文
150 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
椰卤工程师 社区中级贡献者 2021-11-30
  • 打赏
  • 举报
回复

1,017

社区成员

发帖
与我相关
我的任务
社区描述
Go+ 官方开发者社区。我们希望向广大的开发者和数据科学家介绍 Go+ 的定位和意义,并邀请更多开发者一起贡献代码、共建 Go+ 生态。 Go+ 官网:https://goplus.org/
其他 企业社区
社区管理员
  • Go+
  • 杨东杰
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

本社区为 Go+ 官方开发者社区。我们希望向广大的开发者和数据科学家介绍 Go+ 的定位和意义,并邀请更多开发者一起贡献代码、共建 Go+ 生态。

Go+ 官网:https://goplus.org/
GitHub地址:https://github.com/goplus/gop

试试用AI创作助手写篇文章吧