Sepanjang section ini kita menyebut frasa “binary native” berulang kali, dan sekarang saatnya membuktikannya sendiri. Memahami jalur kompilasi menjelaskan banyak hal yang akan kita temui nanti: mengapa kesalahan type tertangkap sebelum program berjalan, mengapa binary Go berukuran megabyte, dan mengapa satu file hasil go build cukup untuk menjalankan program di mesin tanpa Go. Pada chapter ini kita bedah perjalanan tersebut, lalu mengulanginya sebagai demonstrasi nyata.

Perjalanan Kode: dari Teks ke Binary #

Compiler Go membaca source code, memeriksa aturan type dan nama, menerjemahkan seluruh program menjadi machine code, lalu membundel hasilnya bersama runtime Go (termasuk garbage collector dan penjadwal goroutine) ke dalam satu file binary. Rangkaian pendeknya tampak seperti ini:

Setelah binary terbentuk, sistem operasi dapat menjalankan file tersebut persis seperti program C++ yang sudah dikompilasi. Compiler bawaan yang melakukan pekerjaan ini bernama gc; alternatif gccgo juga tersedia bagi lingkungan yang memilih toolchain GCC, tetapi jalur standar sehari-hari adalah gc. Detail sintaks program di bawah ini akan kita bahas tuntas pada section Program Pertama ; fokus kita sekarang adalah perjalanan file-nya.

Demonstrasi Nyata: dari halo.go ke Binary #

Kita mulai dengan program paling sederhana yang masih bermakna. Simpan kode berikut sebagai berkas /tmp/halo.go:

go
package main

import "fmt"

func main() {
        fmt.Println("Halo dari binary Go!")
}

Cara tercepat menjalankannya adalah go run, yang mengompilasi ke direktori sementara lalu langsung mengeksekusi hasilnya:

bash
go run /tmp/halo.go

Output yang Dihasilkan:

text
Halo dari binary Go!

Binary sementara tersebut dihapus begitu program selesai, sehingga go run terasa seperti menjalankan skrip. Untuk menghasilkan binary permanen, kita pakai go build:

bash
go build -o /tmp/halo /tmp/halo.go

Perintah yang berhasil tidak mencetak apa pun — keheningan berarti sukses. Mari kita periksa file yang dihasilkannya:

bash
ls -lh /tmp/halo

Output yang Dihasilkan:

text
-rwxrwxr-x 1 z z 2.3M Oct 13 07:24 /tmp/halo

Kemudian periksa jenis file-nya:

bash
file /tmp/halo

Output yang Dihasilkan:

text
/tmp/halo: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, Go BuildID=0GfZgAINvW3sL_AnAnwm/I9xN8lP3ehjzD055Ubgu/0gWWR3tawksDRXaErxlK/a-h_1rDLxmwW32NuQa9e, BuildID[sha1]=f97175b58cf8f41bc5b259fd3dba5ea11120dd59, with debug_info, not stripped

Tiga informasi pada keluaran file di atas layak digarisbawahi. Frasa statically linked berarti seluruh kebutuhan program — runtime, package fmt, kode kita — sudah terbundel di dalam satu file, tanpa pustaka eksternal yang dicari ke sistem saat dijalankan. Frasa not stripped menandakan binary masih membawa informasi debug, sedangkan nilai Go BuildID adalah identitas unik hasil kompilasi. Nilai BuildID, tanggal, dan jam akan berbeda di mesin Anda karena mengikuti waktu build. Sekarang pengujian pamungkas — jalankan binary itu langsung tanpa perintah go:

bash
/tmp/halo

Output yang Dihasilkan:

text
Halo dari binary Go!

Berkas /tmp/halo dapat kita salin ke server mana pun dengan arsitektur yang sama — meski di sana tidak ada Go sama sekali — dan program tetap berjalan.

Mari kita telaah baris demi baris berkas halo.go di atas:

  1. Baris 1 (package main): menandakan berkas ini membentuk program yang dapat dieksekusi, bukan pustaka; titik masuknya dicari pada fungsi main.
  2. Baris 3 (import "fmt"): memuat package fmt dari standard library agar fungsi cetaknya dapat dipakai.
  3. Baris 5 (func main()): mendefinisikan fungsi main, lokasi pertama yang dieksekusi runtime ketika binary dijalankan.
  4. Baris 6 (fmt.Println(...)): mencetak satu baris teks ke standard output, diikuti tanda baris baru.

Tiga Perintah Utama Toolchain #

PerintahHasilKapan dipakai
go runBinary sementara, langsung dieksekusi, lalu dihapusIterasi cepat saat belajar dan mengembangkan
go buildBinary permanen di lokasi yang kita tentukanMembangun artefak untuk didistribusikan
go installBinary dipasang ke direktori binary Go (mis. $HOME/go/bin)Memasang alat CLI agar dapat dipanggil dari mana saja

Kompilasi Silang Lintas Sistem Operasi #

Toolchain Go dapat menghasilkan binary untuk sistem operasi dan arsitektur lain dari mesin yang sama, cukup dengan mengubah variabel lingkungan GOOS dan GOARCH. Target kompilasi saat ini dapat dilihat dengan go env:

bash
go env GOOS GOARCH

Output yang Dihasilkan:

text
linux
amd64

Dari mesin Linux ini kita dapat langsung membangun binary Windows:

bash
GOOS=windows GOARCH=amd64 go build -o /tmp/halo.exe /tmp/halo.go
bash
file /tmp/halo.exe

Output yang Dihasilkan:

text
/tmp/halo.exe: PE32+ executable for MS Windows 10.00 (console), x86-64, 16 sections

Compiler gc menuliskan machine code untuk target Windows tanpa memerlukan Windows, compiler C, atau mesin virtual — file .exe inilah buktinya. Kemampuan inilah yang membuat rilis alat Go lazim menyediakan binary untuk Linux, macOS, dan Windows sekaligus.

Referensi #

  • Dokumentasi resmi Go — panduan resmi instalasi, struktur kode, dan toolchain.
  • Perintah go — rujukan resmi seluruh subperintah go, termasuk run, build, dan install.
  • Go FAQ — latar belakang resmi arsitektur compiler dan runtime Go.

Kita telah menyaksikan sendiri utuhnya perjalanan tersebut: tujuh baris teks berubah menjadi binary statis lintas sistem operasi. Seluruh konsep pada section Pengantar ini — identitas bahasa, sejarah, penimbangan kelebihan dan batasan, wilayah pemakaian, serta cara kerja kompilasi — kini sudah kita pegang. Tinggal satu hal yang belum ada: peta perjalanan belajar yang menghubungkan semuanya, dan itulah chapter penutup section ini.