Empat Pesan Galat yang Terasa Sama Padahal Berbeda Asal
Satu sore di depan terminal
Rani baru saja memasang Linux di laptopnya untuk mengikuti kelas ini. Program pertamanya sederhana: menghitung luas lingkaran dari jari-jari yang diketik pengguna. Sepuluh baris, tidak lebih. Ia menyimpannya sebagai luas.c, lalu mengetik satu perintah yang ia salin dari catatan kelas:
gcc luas.c -o luas
Dalam dua jam berikutnya ia bertemu empat pesan yang berbeda.
Pesan pertama:
luas.c:1:10: fatal error: matematika.h: No such file or directory
compilation terminated.
Pesan kedua:
luas.c:9:5: error: expected ';' before 'return'
Pesan ketiga:
/usr/bin/ld: /tmp/ccQk3aA.o: in function `main':
luas.c:(.text+0x3e): undefined reference to `sqrt'
collect2: error: ld returned 1 exit status
Pesan keempat muncul setelah program akhirnya berhasil dibangun:
$ ./luas
Segmentation fault (core dumped)
Bagi Rani, keempatnya terasa sama saja: programku gagal. Maka ia memperlakukan keempatnya dengan cara yang sama — menyalin pesan ke mesin pencari, lalu mencoba saran pertama yang muncul. Untuk pesan kedua ia beruntung; menambahkan titik koma memang menyelesaikannya. Untuk pesan ketiga ia membaca saran "tambahkan #include <math.h>", padahal baris itu sudah ada di berkasnya sejak awal. Ia menambahkannya sekali lagi. Tentu saja tidak ada yang berubah.
Yang belum diketahui Rani: keempat pesan itu dikirim oleh program yang berbeda, pada waktu yang berbeda, dan masing-masing hanya melihat sepotong kecil dari keseluruhan pekerjaan.
Satu perintah, lima pekerjaan
Perintah gcc luas.c -o luas terlihat seperti satu tindakan tunggal. Kenyataannya perintah itu memicu serangkaian pekerjaan yang dikerjakan bergantian:
- Ada bagian yang hanya mengurus teks: menyisipkan isi berkas lain, mengganti nama makro, membuang blok yang tidak terpakai. Bagian ini tidak paham apa itu fungsi.
- Ada bagian yang menerjemahkan kode C menjadi instruksi mesin, tetapi hanya untuk satu berkas sumber pada satu waktu. Ia tidak tahu berkas lain di proyekmu ada.
- Ada bagian yang baru melihat semua potongan sekaligus dan bertugas menyambungkannya, termasuk menyambungkan ke pustaka sistem.
- Ada bagian yang baru bekerja jauh kemudian — saat kamu mengetik
./luas— untuk memasukkan program ke dalam ingatan mesin. - Dan ada kernel, yang mengawasi program selama berjalan dan menghentikannya kalau program menyentuh alamat yang bukan haknya.
Empat pesan galat Rani berasal dari empat titik berbeda dalam rantai itu. Pesan pertama dari pengurus teks. Pesan kedua dari penerjemah. Pesan ketiga dari penyambung. Pesan keempat bahkan bukan galat pembangunan sama sekali — programnya sudah jadi dan sudah berjalan, lalu dihentikan paksa.
Kenapa ini dibahas paling awal
Ada alasan praktis dan alasan jangka panjang.
Alasan praktisnya: kalau kamu salah menebak tahap, kamu akan memperbaiki bagian yang sehat. Menambahkan #include untuk masalah penyambungan sama sia-sianya dengan mengganti oli untuk ban yang bocor. Keduanya pekerjaan bengkel, tetapi bukan pekerjaan yang sama.
Alasan jangka panjangnya: hampir semua topik lanjutan dalam pemrograman sistem berdiri di atas peta ini. Kenapa satu pustaka bisa dipakai banyak program tanpa disalin berulang. Kenapa sebuah program yang jalan di laptopmu menolak jalan di server. Kenapa mengubah satu berkas header memaksa proyek besar dibangun ulang hampir seluruhnya. Semua pertanyaan itu jawabannya berada di rantai yang sama.
Yang akan kamu kerjakan di modul ini
Kamu tidak akan sekadar menghafal urutan. Kamu akan membongkar satu program kecil menjadi berkas-berkas antara yang biasanya langsung dibuang, membacanya dengan alat pemeriksa simbol, lalu sengaja merusaknya dengan tiga cara berbeda dan mendiagnosis sendiri kerusakannya.
Di akhir modul, target yang wajar: diberi satu pesan galat yang belum pernah kamu lihat, kamu bisa menyebut tahap penyebabnya dalam hitungan detik — sebelum membuka mesin pencari.
Pertanyaan yang kita bawa
Simpan satu pertanyaan ini selama modul berjalan: ketika terminal menolak pekerjaanku, siapa sebenarnya yang sedang berbicara?
Selama kamu belum bisa menjawabnya, setiap perbaikan yang kamu lakukan hanyalah tebakan yang kebetulan kadang berhasil.