Nim mengompilasi kode sumber menjadi biner mesin tunggal, sehingga pemakai program tidak perlu memasang runtime, pustaka bahasa, maupun penerjemah apa pun. Topik ini membahas tahap akhir dari program Nim, yaitu build mode rilis, penautan statis agar biner mandiri dari pustaka sistem, kompilasi silang untuk platform lain, dan pemaketan hasilnya untuk didistribusikan. Program yang dipakai sepanjang topik adalah penghitung kata baris perintah sederhana.
Program yang akan dirilis#
Program berikut membaca satu argumen berupa nama berkas, atau masukan standar bila argumennya tidak diberikan, lalu mencetak banyak katanya. Pemisahan masukan memakai paramCount dan paramStr dari modul os, sedangkan perhitungan kata memakai splitWhitespace dari modul strutils.
import std/[os, strutils]
when isMainModule:
var teks = ""
if paramCount() == 1:
teks = readFile(paramStr(1))
elif paramCount() == 0:
teks = readAll(stdin)
else:
stderr.writeLine("penggunaan: penghitung_kata [berkas-teks]")
quit(1)
echo teks.splitWhitespace().lenJalankan programnya terlebih dahulu untuk memastikan perilakunya benar sebelum dirilis. Berkas contoh dibuat lewat printf, lalu nama berkasnya diberikan sebagai argumen program.
# buat berkas contoh, lalu kompilasi dan jalankan programnya
printf 'satu dua tiga\nempat lima\n' > contoh.txt
nim c --verbosity:0 -r penghitung_kata.nim contoh.txt5Mode rilis dan ukuran biner#
Kompilasi tanpa tambahan bendera menghasilkan build debug, yaitu build dengan optimasi minimal dan pemeriksaan waktu berjalan yang lengkap. Mode rilis diaktifkan dengan -d:release, yang menerapkan optimasi dan meredam sebagian besar pemeriksaan waktu berjalan, sedangkan bendera --opt:size mengarahkan optimasi pada kecilnya ukuran biner. Kombinasi keduanya adalah titik awal yang lazim untuk biner yang akan dibagikan.
# build mode rilis dengan optimasi ukuran, lalu uji hasilnya
nim c --verbosity:0 -d:release --opt:size --out:penghitung_kata penghitung_kata.nim
./penghitung_kata contoh.txt5Build statis agar biner mandiri#
Secara bawaan biner Linux menaut pustaka sistem secara dinamis, sehingga mesin sasaran harus memiliki pustaka yang sama, seperti libc dan libm. Opsi --passL:-static meneruskan bendera -static ke penaut, sehingga seluruh pustaka tersebut ditempelkan ke dalam biner. Konsekuensinya dapat diperiksa dengan ldd, yaitu perkakas yang mencantumkan kebergantungan dinamis sebuah biner, dan ukuran binernya bertambah karena pustakanya ikut dibawa.
# build statis, periksa kebergantungan dinamisnya, lalu uji hasilnya
nim c --verbosity:0 -d:release --opt:size --passL:-static --out:penghitung_kata-statis penghitung_kata.nim
ldd penghitung_kata-statis 2>&1
./penghitung_kata-statis contoh.txt not a dynamic executable
5Keluaran ldd yang berbunyi not a dynamic executable menegaskan bahwa biner tidak lagi menaut pustaka bersama apa pun, sehingga biner yang sama dapat disalin ke mesin Linux amd64 lain tanpa memasang pustaka tambahan. Meski begitu, penautan statis pada glibc bukan jaminan penuh untuk semua fungsi sistem, karena sebagian layanannya seperti resolusi nama tetap memuat pustaka dinamis saat berjalan. Untuk program yang hanya membaca berkas dan menulis keluaran, seperti contoh ini, biner statis berperilaku mandiri sepenuhnya.
Kompilasi silang untuk platform lain#
Biner yang dibangun di Linux hanya berjalan di Linux dengan arsitektur yang sama. Kompilator Nim memisahkan target dari mesinnya lewat opsi --os dan --cpu, sehingga kode sumber yang sama dapat diarahkan ke sistem operasi dan arsitektur lain tanpa perubahan. Karena Nim menghasilkan kode C, kompilasi silang menuntut rantai alat C sasaran, dan penamaannya mengikuti pola yang dijelaskan panduan kompilator, misalnya arm.linux.gcc.
Untuk Windows dari Linux atau macOS, panduan resmi merekomendasikan rantai alat MinGW-w64, dan perintahnya berupa bendera -d:mingw yang memilih pengaturan tersebut secara otomatis. Perintah berikut memerlukan rantai alat mingw-w64 yang tidak tersedia di lingkungan penulisan, sehingga tidak dapat dieksekusi di sini dan jalurnya diambil dari panduan kompilator resmi.
# tidak-dijalankan
# memerlukan rantai alat mingw-w64 yang tidak tersedia di lingkungan ini
nim c --os:windows --cpu:amd64 -d:mingw --out:penghitung_kata.exe penghitung_kata.nimTarget macOS menuntut rantai alat dan khususnya kit pengembangan Apple, sehingga lazim dilakukan langsung di mesin macOS. Nama biner hasil kompilasi silang diberikan lewat opsi –out, misalnya dengan akhiran .exe untuk Windows agar konvensi penamaan platform sasarannya terjaga.
Memaketkan hasil rilis#
Alur lengkap dari kode sumber sampai paket siap kirim dirangkum diagram berikut, yaitu kompilasi mode rilis menghasilkan biner tunggal, dengan taut statis dan kompilasi silang sebagai dua variasi bendera pada langkah kompilasi yang sama.
Isi paket yang layak dibagikan memuat biner, berkas README yang menjelaskan pemakaiannya, dan berkas LICENSE yang menyatakan lisensinya, lalu semuanya diarsipkan atau dikemas sesuai kebiasaan platform sasarannya. Beri nama berkas yang menyertakan nama program, versi, sistem operasi, dan arsitektur, misalnya penghitungkata-0.2.0-linux-amd64.tar.gz, agar penerima dapat memastikan kecocokannya tanpa mencoba terlebih dahulu. Perintah build yang menghasilkan paket itu sendiri disimpan pada berkas konfigurasi paket atau skrip build di repositori, sehingga rilis berikutnya cukup dijalankan ulang.
Banyaknya kombinasi bendera build sering menyulitkan pengetikan manual. Demo berikut menyusun perintah nim c dari kotak pilihan bendera, sehingga variasi build rilis, statis, dan silang dapat disusun lalu disalin.
Kesalahan umum#
Kesalahan pertama berupa membagikan biner hasil build bawaan tanpa -d:release. Biner semacam itu berukuran lebih besar dan berjalan lebih lambat karena optimasi belum diterapkan, sementara pemeriksaan waktu berjalannya justru membebani eksekusi. Selalu bangun biner rilis dengan -d:release dan uji biner hasilnya, bukan uji lewat nim c -r yang memakai build debug.
Kesalahan kedua berupa menyangka build statis membuat biner berjalan di sistem operasi lain. Opsi --passL:-static hanya menghilangkan kebergantungan pustaka dinamis pada platform yang sama, sedangkan sistem operasi dan arsitektur biner tetap mengikuti mesin build. Pindah platform tetap memerlukan kompilasi silang dengan --os dan --cpu.
Kesalahan ketiga berupa menyalin biner dinamis ke mesin dengan pustaka sistem yang lebih tua. Biner yang ditaut pada versi glibc lebih baru menuntut versi yang sama atau lebih baru di mesin sasaran, dan programnya umumnya menolak berjalan bila tidak terpenuhi. Build statis menghindari masalah ini untuk pustaka yang ikut ditempelkan, sehingga pilihan antara build statis dan dinamis sebaiknya ditetapkan berdasarkan lingkungan mesin sasaran.
Ringkasan#
- Mode rilis diaktifkan dengan
-d:releasedan dioptimalkan untuk ukuran dengan--opt:size, sedangkan-d:dangermematikan seluruh pemeriksaan waktu berjalan. - Opsi
--passL:-staticmenaut pustaka sistem ke dalam biner, yang dikonfirmasi ldd dengan keluarannot a dynamic executable. - Kompilasi silang memakai opsi
--osdan--cpubeserta rantai alat C sasarannya, misalnya-d:mingwdengan MinGW-w64 untuk Windows. - Paket rilis memuat biner, README, dan LICENSE, dengan nama berkas yang menyertakan versi, sistem operasi, dan arsitektur sasarannya.
Referensi#
- Nim Compiler User Guide — nim-lang.org — Opsi kompilasi, bagian cross-compilation, opsi passL, serta penjelasan bendera -d:release dan -d:danger.