Go(包括 C++/C/Rust 等一大类语言),是编译型语言,首先由人or AI 把代码写出来,然后编译器把代码进行编译(通过词法分析和语法分析),生成可执行文件(其中包括:由0/1构成的机器指令,以及Go的垃圾回收器,Runtime)
然后,可执行文件被加载到操作系统进行执行,当程序被通过命令行执行后,经过编译器执行生成机器码。此后:
- OS的加载器Loader开始工作
- OS在内存中开始划分一块地盘,用于分配虚拟内存、堆、栈空间
- OS将机器码加载到内存的特定位置:代码段
- OS将CPU的程序计数器(PC寄存器)指向机器码的开头,CPU开始执行机器码
提到这边不得不说到 Java 的底层执行原理:
Go语言常见的一种设计模式,是通过通信的方式去共享内存。这和许多主流的编程语言不同,比如 Java主要通过共享内存的方式进行线程之间的通信,结果会造成很多并发安全问题。
Go语言提供的并发模型,称为通信顺序进程,即 CSP (Communicating sequential processes)。在Go编程中,Goroutine作为CSP中的实体,而channel作为传递信息的媒介。Goroutine之间通过channel来传递数据