Skip to content

generals-space/lightgo

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

18,140 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

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%