Flow Golang Compile


⚙️ 1. Quá trình Biên dịch (Build Process)

🔹 Từ Source code → Binary

Go là ngôn ngữ biên dịch tĩnh (statically compiled language):

go build main.go

Quá trình này:

  1. Phân tích cú pháp (Lexing & Parsing)

    • Chuyển source .go thành cây cú pháp (AST - Abstract Syntax Tree).

  2. Kiểm tra kiểu (Type Checking)

    • Phát hiện lỗi kiểu, không đúng contract interface, v.v...

  3. Biên dịch (Compilation)

    • Chuyển AST thành mã máy (machine code).

  4. Liên kết (Linking)

    • Gộp các package thành một binary duy nhất.

    • Tự động liên kết runtime, syscall, garbage collector, net/http, v.v...

🔥 Kết quả: Go tạo ra một self-contained executable binary (không phụ thuộc runtime ngoài như JVM, .NET, hay thư viện hệ điều hành).


2. Thực thi (Execution)

🧵 Go Runtime

Go đi kèm với một runtime nhẹ (~2–3MB), bao gồm:

  • Goroutine scheduler (G-P-M model)

  • Garbage Collector

  • Network poller (epoll/kqueue)

  • Timers

🔸 Mô hình G-P-M:

Thành phần
Vai trò

G: Goroutine

Task nhỏ cần chạy

P: Processor

Quản lý goroutines, điều phối

M: OS Thread

Giao tiếp trực tiếp với CPU

👉 Go runtime quản lý M:N scheduling, cho phép hàng triệu goroutine chạy hiệu quả chỉ với vài thread thực.


🧱 3. Binary là gì?

Go build ra một native binary:

  • Tùy theo OS: .exe (Windows), file không đuôi (Linux/macOS)

  • Có thể chạy trực tiếp, deploy không cần runtime đi kèm

  • Hỗ trợ cross-compilation:

GOOS=linux GOARCH=amd64 go build -o app-linux

🧪 4. Ưu điểm của quá trình biên dịch Go

Ưu điểm
Diễn giải

🔒 Type-safe

Phát hiện lỗi sớm từ lúc build

⚡ Nhanh

Build cực nhanh (Go build time < Rust < C++ < Java)

🚀 Deploy dễ

Chỉ cần copy binary, không cần VM

🐳 Phù hợp container

Binary nhẹ, đơn giản, rất thích hợp cho Docker/K8s


🔍 5. Một ví dụ cụ thể

File: main.go

package main

import "fmt"

func main() {
    fmt.Println("Xin chào Tài Titans!")
}

Biên dịch:

go build -o hello main.go

Thực thi:

./hello
# => Xin chào Tài Titans!

🧩 6. Điều gì xảy ra bên trong?

Khi bạn chạy ./hello:

  1. OS nạp binary vào bộ nhớ.

  2. Khởi động Go runtime (GC, scheduler).

  3. Thực thi hàm main.main().

  4. Khi xong, Go runtime dọn dẹp và thoát.


✅ Tổng kết

Bước
Mô tả

go build

Biên dịch source thành binary

Binary

Self-contained, chạy độc lập

Runtime

Nhẹ, hỗ trợ GC và scheduler

Ưu điểm

Nhanh, dễ deploy, không cần runtime ngoài


Last updated