Skip to content

generals-space/lightgo

 
 

Repository files navigation

golang

项目目的

基于 golang v1.2 版本, 进行源码阅读与改造, 之后将 go 1.2 作为小项目的主语言, 不停迭代并深入挖掘其底层原理.

即使是早期版本, golang 也有诸多无可比拟的优点:

  1. 语法简单(极致简洁), 无过多黑魔法(指 python, js);
  2. 编译结果为单文件, 无需依赖包.
  3. cgo内嵌c, 可以混合编程;
  4. ...

为什么选择此版本

  1. 基于软件工程开发规律, golang v1.0 版本即进入稳定版本;
  2. v1.0 还不够完善, 主要是由于此版本还未实现 GMP 框架, 而 GMP 正是 golang 区别于其他语言的最大亮点;
  3. v1.5 版本实现自举, 使用 golang 编译器代替了 gcc 编译器, 隐藏了太多 clang 层面的细节;

golang演进历史

  • 0.x
    • 单线程调度器
    • 非稳定版本
  • 1.0
    • 多线程调度器(GMP系统还不完整, 只有 GM, 没有 P)
  • 1.1
    • 引入了处理器 P, 构成了目前的 GMP 模型
  • 1.2
    • 当前版本
  • 1.3
    • 优化GC流程, 并发清理(不过仍需要STW)
  • 1.4
    • 抢占调度
    • 连续栈
  • 1.5
    • 实现自举, 可用 go v1.4 编译生成 golang 环境
    • 优化GC流程, 引入三色标记
  • 1.6
    • 引入 vendor 本地库目录

为了研究更多底层细节(包括gcc编译, gdb调试, 汇编语言, 词法及语法分析规则等), 可以接受不完善的GC流程和调度框架, 因此最终选择了 go v1.2.

所做的变更

  • 源码阅读, 添加注释, 拆分过长的源文件;
    • GMP调度框架, 内存管理, GC流程
    • 类型系统, runtime/reflect
    • 原生类型底层实现, slice/hashmap/channel
    • 汇编语言
  • 放弃跨平台可移植性, 移除平台无关代码, 只保留linux amd64架构;
  • 补充标准库函数, 实现向后兼容(go v1.2+后续新增的"函数/方法/变量/结构"等, 被放在独立的_compatible.go文件中);
  • 借助bison语法分析器, 实现语法层面的向后兼容;

启动开发环境

golang v1.2 过于陈旧, 当前的 vscode go 扩展已经无法正确安装, 因此借助 docker 封装了一个远程容器开发环境, 集成了合适版本的扩展包.

首先启动容器环境

docker run -d --name golang-src.v1.2 --privileged -p 2222:22 -v /usr/local/go:/usr/local/go.v1.2 registry.cn-hangzhou.aliyuncs.com/generals-space/golang-src:latest

然后进入容器, 克隆当前仓库到/usr/local/go目录

git clone https://gitee.com/skeyes/gods.git /usr/local/go

上述容器中内置了sshd服务, 可使用 vscode 通过 remote ssh 插件连接进入.

然后在/usr/local/gopath_extension/vsix下寻找并安装vscode开发插件, 即可实现代码提示和补全.

编译golang源码

在当前目录下直接执行make即可, go二进制可执行文件将出现在bin子目录.

由于容器环境已经将/usr/local/go/bin加入了PATH环境变量, 因此可以直接执行go命令应用最新的二进制程序.

Releases

No releases published

Packages

No packages published

Languages

  • Go 73.4%
  • C 17.7%
  • HTML 5.1%
  • Assembly 1.2%
  • Perl 0.8%
  • Python 0.6%
  • Other 1.2%