【Go - 编译:浅尝辄止 】

1,为什么编译

编译 VS 不编译

在Go语言中,你可以选择go build编译代码生成二进制文件,或者直接使用go run命令运行代码。两种方式各有优缺点,

编译(go build

优点

  1. 性能:编译生成的二进制文件是机器码,运行时性能更高,因为不需要解释或编译代码。
  2. 独立性:生成的二进制文件是独立的,不依赖于Go编译器或其他外部库,可以在目标平台上直接运行。
  3. 分发:编译后的二进制文件可以方便地分发和部署到不同的环境中,而不需要在目标环境中安装Go编译器。
  4. 启动速度:编译后的二进制文件启动速度更快,因为不需要在运行时进行编译。

缺点

  1. 编译时间:编译过程需要时间,特别是对于大型项目,编译时间可能较长。
  2. 调试:在开发过程中,频繁编译可能会影响开发效率。调试时需要重新编译代码。

直接运行(go run

优点

  1. 快速迭代:不需要编译步骤,代码修改后可以立即运行,适合快速开发和调试。
  2. 简单:适合小型项目或脚本,减少了编译和生成二进制文件的步骤。

缺点

  1. 性能go run在运行时会先编译代码,然后再执行,性能不如直接编译生成的二进制文件。
  2. 依赖:需要在运行环境中安装Go编译器,不能像编译后的二进制文件那样独立运行。
  3. 启动速度:由于需要先编译再运行,启动速度较慢,特别是对于大型项目。

示例

假设你有一个简单的Go程序main.go

package main

import "fmt"

func main() {
    fmt.Println("Hello, World!")
}

使用go build编译

go build -o myapp main.go
./myapp

使用go run直接运行

go run main.go

小结

  • *编译(go build)**适合生产环境、分发和部署,提供更高的性能和独立性。
  • *直接运行(go run)**适合开发和调试阶段,提供更快的迭代速度和简便性。

根据具体的使用场景和需求选择合适的方式,可以更好地利用Go语言的特性。

2,编译过程

在Go语言中,编译过程将源代码转换为可执行的二进制文件。以下是Go的编译过程,以及编译后的产出。

编译过程

  1. 解析和语法检查
    • 编译器首先解析Go源代码文件,进行语法检查,确保代码符合Go语言的语法规则。
    • 如果有语法错误,编译器会报告错误并停止编译。
  2. 类型检查
    • 编译器进行类型检查,确保所有变量和表达式的类型正确。
    • 如果有类型错误,编译器会报告错误并停止编译。
  3. 依赖解析
    • 编译器解析代码中的依赖项,确定需要导入的包和库。
    • 编译器会检查这些依赖项是否存在,并确保它们没有循环依赖。
  4. 中间代码生成
    • 编译器将源代码转换为中间代码(Intermediate Representation, IR),这是一种抽象的低级表示形式。
    • 中间代码便于进行优化和代码生成。
  5. 优化
    • 编译器对中间代码进行各种优化,以提高生成代码的性能和减少代码大小。
    • 常见的优化包括常量折叠、循环优化、死代码消除等。
  6. 代码生成
    • 编译器将优化后的中间代码转换为目标平台的机器码。
    • 机器码是特定于目标平台的低级指令,可以直接在目标平台的处理器上执行。
  7. 链接
    • 编译器将生成的机器码与所需的库和依赖项链接在一起,生成最终的可执行文件。
    • 链接过程包括静态链接和动态链接。Go语言默认使用静态链接,将所有依赖项打包到一个独立的二进制文件中。

编译后的产出

编译后的产出是一个可执行的二进制文件。这个文件包含了所有必要的代码和依赖项,可以在目标平台上独立运行。

交叉编译示例

假设你在macOS上开发,但需要生成适用于Linux的二进制文件,可以使用以下命令:

GOOS=linux GOARCH=amd64 go build -o myapp-linux main.go

生成的myapp-linux二进制文件可以在Linux系统上独立运行。

3,问题

Q:编译的binary是否是二进制文件独立运行,不依赖其它,比如 python程序可以打包为binary,但是会将其解释器打包进去。

A:Go编译生成的二进制文件是独立运行的,不依赖于其他外部库或解释器。Go语言的编译器会将所有依赖项静态链接到生成的二进制文件中,从而使其可以独立运行。这与Python等解释型语言不同,Python程序通常需要将解释器打包进去。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值