Inside Go+ 之一: 宏观架构篇

今天我们将开启《Inside Go+》系列文章的第一篇,讲讲 Go+ 的宏观架构。后续我们将会一步步解剖 Go+ 的实现。

Go+ 是一门以 “数据科学” 为靶心的通用语言。它首先是一门通用语言,理论上你可以用它来解决绝大部分领域的问题。这一点和 Go 也很像。Go 也是一门通用语言,但以 “服务端编程” 为靶心。

以下是 Go+ 给人们的主要印象:

  • 它是一门静态类型语言;

  • 它完全兼容 Go 语言;

  • 它看起来像脚本,在数据科学领域有着比 Go 友好得多的界面。

例如,以下是一个 Go+ 的例子:

同样功能的程序,用 Go 需要这样写:

关于 Go+ 更详细的介绍,请参考 https://github.com/goplus/gop。

下面我们话题回到 Go+ 实现的解剖。为了方便大家理解整个 Go+ 代码的组织方式,我画了下面这样一幅图:

那么,应该怎么看这幅图呢?

首先,圆角长方形代表 Go+ 处理过程中涉及的对象实体(object entity),它们包括:

  • Go+ 源代码(Go+ Source);

  • Go+ Token 流(Go+ Token);

  • Go+ 抽象语法树(Go+ AST);

  • 后端接口规范(Executing Specification);

  • 字节码(Byte Code);

  • Go 源代码(Go Source);

  • 机器码形式的包或软件(Package/Software)。

后端接口规范(Executing Specification)这块比较特殊,它是一个抽象接口族构成的 DOM 树。它是一种抽象对象实体,和常规的对象实体有所区别,所以我们把它画成了特殊的形态。

整个 Go+ 处理的过程,你可以把它理解为其实只是在不同对象实体之间进行变换的过程。其中,整个变换的起点是 Go+ 源代码(Go+ Source),终点有两个分支,一个分支是字节码(Byte Code),一个分支是机器码(Package/Software)。为什么会有两个终点?因为 Go+ 是双引擎的,它既可以像脚本一样解释执行,也可以编译成机器码。

其次,蓝色加粗的文本代表我们接下来要剖析的 package,它们包括:

  • github.com/goplus/gop/token

  • github.com/goplus/gop/scanner

  • github.com/goplus/gop/parser

  • github.com/goplus/gop/ast

  • github.com/goplus/gop/format

  • github.com/goplus/gop/printer

  • github.com/goplus/gop/cl

  • github.com/goplus/gop/exec.spec

  • github.com/goplus/gop/exec/bytecode

  • github.com/goplus/gop/exec/golang

当然,这些 package 并不是 Go+ 完整的 package 列表,但它们是理解 Go+ 代码的关键,我们接下来会重点对它们进行介绍。

需要注意的一个细节是,我们有些 package 标在了对象实体(object entity)上,比如 tokenastexec.spec。这代表这类对象实体(object entity)是通过代码表达的,具体代码就在对应的 package 中。

另一些 package 标在了箭头上,比如 scannerparserclexec/bytecodeexec/golang。这通常代表它们是负责了从一种对象实体变换为另一种对象实体。比如 scanner 负责将 Go+ Source 变换 Go+ Token,cl 负责将 Go+ AST 变换为 exec specification。但 exec/bytecode 和 exec/golang 有点特殊,它们是实现了 exec specification,然后将结果输出为 Byte Code 和 Go Source。我们统一理解为对象实体的变换也是说得通的。

最后,我们解释以下箭头指向。大部分箭头指向都是一个对象实体,这些箭头,毫无疑问,表示实体变换。标在其上的 package 就是负责变换的实现代码。但有少量箭头是指向某个 package 的,比如 Go+ Token 有箭头指向 parserprinter 包有箭头指向 format。这些指向 package 的箭头代表内部依赖。以上两个这两个箭头,前者表示 scannertoken 这些实体和实体变换,都只是 parser 的内部过程,后者表示 format 内部依赖了 printer

有了以上这些信息,相信你对 Go+ 整体的组织有了非常宏观的理解。更详细的内容,我们下回分解。

要参与探讨 Go+,请加入以下 Go+ 用户群。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值