Go+的核心定位,融合了工程开发的Go、数据科学领域的Python、编程教学领域的Scratch,因此Go+有Go之心Python之型,更简单易上手,面向编程教育、工程开发和数据科学。
2020年诞生的静态语言,主要是七牛云在推动。
GO+ 愿景Vision:兼容Go;兼容Scratch的设计能力;兼容Python;
Go+ Playground: 在线体验
官网Tutorials: link~
开源repo:gop
语言介绍
Go+ 的源代码,通过扫描器 Scanner 转成一个 Go+ 的 Token,再通过一个 parser 变成 Go+ 的抽象的语法树,常见语言都是这么干的。Go+ 的抽象语法树转化后有两个分支,一个生成 Go 的代码从而使其可以静态编译,另外一个分支生成字节码解析执行,分支的多态是通过引入了一个叫 执行规范(exec.spec) 的东西,其实就是一个抽象的接口。
Go+ 执行规范的部分,其实是一种抽象的 SAX 接口,也就是基于事件驱动,有一个事件发送给接受方,接受方按自己的需要处理这个事件,这在文本处理里面比较常见。
之前Go+编译器设计的接口基本上是用事件驱动的模式来把不同组件连接起来。编译器把抽象语法树解析完发出一些事件,这些事件被两个代码生成的模块接收,按照自己的需求去干活。 这个模式代码还是有点难理解,尤其是编译器里面又做一些复杂的事情,让代码比较难理解。类型推导在 Go 里面比较复杂,Go+编译器的复杂性大部分也是由类型推导导致的。
目前Go+正在改进执行规范的实现逻辑,把执行规范部分变得不再是一个抽象的接口,而是一个标准实现的 DOM,这个 DOM 本身包含了类型推导的能力,从而使得编译器相对比较简单。
【所以截至目前,脚本引擎这部分似乎还没做好?】
【评价】对Go生态系统有益,有利于简化进入Go生态系统的难度(即第一门语言即是Go+)。
【看法】在没有python的时代如果有go+当然非常好,目前已经有python的情况下,go+的优势怎么凸显呢?另外go+做脚本引擎性能不会带来损失吗?最终脚本执行的性能如何?这条道路商业化艰难,七牛云能否对这件事情长期坚持下去也是需要考虑的。期待看到未来Go+生态出现更多重磅项目,目前暂时还很初步。
【看法2】go语言的设计哲学就是严谨,即使麻烦,比如不能有unused variable,type可以inference但是没必要,需要programmer explicit declaration,他不想学py/js那种weak type,go+又在这上面做了一层折中,跟py的感觉更像。
开发体验
Win10 安装Go+
注意:需要权限,管理员模式打开power shell
git clone https://github.com/goplus/gop.git
cd gop
all.bat
记得添加环境变量,我这里是D:\tmp\go\bin
gop run // 运行go+代码
gop repl // 在repl/控制台模式下运行go+
gop go [-test] // 将go+ 软件包转换go软件包,如果指定test,他会测试相关软件包
gop fmt // 格式化go+ 软件包(和go fmt 相似)
gop export // 导出go包
VSCode GO+插件
hello,world
如果没在 GOPATH 下新建Go+工程,就需要使用 Go Model来处理依赖,所以这里在工程目录下面执行下Go Model的初始化命令:这里 gop 是工程名字,可以随意。
go mod init gop
main.gop
package main
func main() {
println("hello")
}
和 Go 的代码很相似,但是 Go 的输出需要使用 fmt 包,在 Go+ 里面则不需要。实际上这里run的是go代码,gop对gop代码进行了翻译。
Go+ 语法特性
multitype slice
在 Go 里面除了 interface 类型外,一个切片只能存放一种类型。Go+支持多种。eg.
func main() {
a := [1, "abc", 2.3]
println(a)
}
列表解析表达式
func main() {
a := [1, 2.3, 45]
println([item*2 for item <- a])
}
错误处理
go+写法类似swift。
expr! // panic if err
expr? // return if err
expr?:defval // use defval if err
func ToInt(in string) int {
return strconv.Atoi(in)?:0
}
go的错误处理很麻烦
func ToInt(in string) int {
res, err := strconv.Atoi(in)
if err != nil {
return 0
} else {
return res
}
}
这里选了一些代表性的语法特性,更多的特性参考官网doc或者Ref.4中的举例。谢谢。