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:
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:
go run /tmp/halo.goOutput yang Dihasilkan:
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:
go build -o /tmp/halo /tmp/halo.goPerintah yang berhasil tidak mencetak apa pun — keheningan berarti sukses. Mari kita periksa file yang dihasilkannya:
ls -lh /tmp/haloOutput yang Dihasilkan:
-rwxrwxr-x 1 z z 2.3M Oct 13 07:24 /tmp/haloKemudian periksa jenis file-nya:
file /tmp/haloOutput yang Dihasilkan:
/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 strippedTiga 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:
/tmp/haloOutput yang Dihasilkan:
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:
- Baris 1 (
package main): menandakan berkas ini membentuk program yang dapat dieksekusi, bukan pustaka; titik masuknya dicari pada fungsimain. - Baris 3 (
import "fmt"): memuat packagefmtdari standard library agar fungsi cetaknya dapat dipakai. - Baris 5 (
func main()): mendefinisikan fungsimain, lokasi pertama yang dieksekusi runtime ketika binary dijalankan. - Baris 6 (
fmt.Println(...)): mencetak satu baris teks ke standard output, diikuti tanda baris baru.
Tiga Perintah Utama Toolchain #
| Perintah | Hasil | Kapan dipakai |
|---|---|---|
go run | Binary sementara, langsung dieksekusi, lalu dihapus | Iterasi cepat saat belajar dan mengembangkan |
go build | Binary permanen di lokasi yang kita tentukan | Membangun artefak untuk didistribusikan |
go install | Binary 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:
go env GOOS GOARCHOutput yang Dihasilkan:
linux
amd64Dari mesin Linux ini kita dapat langsung membangun binary Windows:
GOOS=windows GOARCH=amd64 go build -o /tmp/halo.exe /tmp/halo.gofile /tmp/halo.exeOutput yang Dihasilkan:
/tmp/halo.exe: PE32+ executable for MS Windows 10.00 (console), x86-64, 16 sectionsCompiler 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, termasukrun,build, daninstall. - 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.