Linker pada Compiler
Static Linking
jadi inti dari static linking adalah mengimport semua external library menjadi satu executable. Jadi saat executable dijalankan tidak ada lagi pemanggilan fungsi dari luar karena librarynya sudah ikut ke compile. Hal ini berbeda dengan Dynamic linking dan Lazy Binding yang baru memanggil library external saat executable dijalankan.
Dynamic Linking & Lazy Binding
Lazy binding adalah teknik dalam pemrograman yang digunakan untuk menunda pemanggilan atau resolusi referensi simbol (seperti fungsi atau variabel) sampai saat pertama kali dibutuhkan saat eksekusi program. Teknik ini sering digunakan dalam konteks pemrograman dengan shared libraries (pustaka bersama) atau dynamic linking.
Penjelasan Lebih Lanjut tentang Lazy Binding
Dynamic Linking dan Lazy Binding: Dalam banyak program, terutama yang menggunakan external library (seperti pustaka .so di Linux atau .dll di Windows), program tidak langsung mengikat atau menghubungkan (bind) referensi fungsi dari pustaka tersebut ke dalam kode program saat compile. Sebaliknya, referensi ini diselesaikan dinamis saat program dijalankan.
- Dynamic Linking: Ini adalah proses di mana external library dipetakan ke ruang alamat memori program saat eksekusi, bukan saat compile. Sebagai contoh, sebuah program mungkin menggunakan fungsi dari external library seperti libc.so di Linux. Alih-alih menghubungkan fungsi tersebut secara langsung selama compile, program hanya menyertakan referensi untuk fungsi tersebut.
- Lazy Binding: Dalam lazy binding, referensi fungsi atau simbol yang belum terikat pada external library tidak akan diselesaikan hingga fungsi tersebut dipanggil pertama kali. Ini memungkinkan penghematan waktu dan sumber daya, karena hanya simbol yang benar-benar dipanggil yang akan diselesaikan dan dipetakan ke memori.
Contoh Proses Lazy Binding: Misalnya, sebuah program memanggil fungsi dari external library yang belum terikat pada saat pemuatan pertama kali. Program hanya menyimpan alamat stub (penunjuk) ke fungsi tersebut.
Ketika fungsi ini dipanggil untuk pertama kalinya:
- Resolver (seperti linker dinamis atau interpreter pustaka) akan mencari simbol yang sesuai dalam pustaka dinamis.
- Resolver kemudian akan memetakan fungsi ke alamat memori yang sesuai.
- Setelah resolusi pertama kali, alamat yang telah diselesaikan akan disimpan, dan pemanggilan selanjutnya ke fungsi ini akan langsung mengarah ke alamat yang telah dipetakan tanpa memerlukan resolusi ulang.
Keuntungan Lazy Binding:
- Efisiensi Waktu: Hanya fungsi yang dipanggil pertama kali yang akan diselesaikan. Jika fungsi tidak pernah dipanggil, maka tidak ada overhead untuk menyelesaikan simbol tersebut, yang menghemat waktu pemuatan awal aplikasi.
- Pengurangan Penggunaan Memori: Fungsi yang tidak digunakan tidak perlu dimuat atau di-resolve, yang membantu menghemat memori.
- Peningkatan Performa: Jika aplikasi hanya menggunakan sebagian kecil fungsi dari external library, teknik lazy binding dapat mengurangi waktu pemuatan awal dan penggunaan sumber daya.
Perbandingan dengan Eager Binding:
- Eager Binding adalah teknik di mana semua simbol atau fungsi yang diperlukan oleh program akan diselesaikan (linked) saat pemuatan awal, bahkan jika fungsi-fungsi tersebut tidak dipanggil. Ini dapat meningkatkan waktu pemuatan program, tetapi memberikan keuntungan bahwa semua referensi sudah terikat saat aplikasi dimulai.
- Lazy Binding, di sisi lain, menunda penyelesaian simbol sampai fungsi tersebut dibutuhkan, yang dapat mengurangi overhead di awal tetapi mungkin sedikit menambah waktu respons saat pertama kali memanggil fungsi yang belum terikat.
Lazy Binding dalam ELF: Pada format ELF (Executable and Linkable Format), lazy binding sering digunakan dalam konteks dynamic linking. Ketika program ELF dijalankan, simbol yang merujuk pada fungsi dalam pustaka eksternal tidak langsung diselesaikan. Sebaliknya, jika suatu fungsi dipanggil, sistem operasi akan melakukan pencarian di external library dan memetakan fungsi tersebut ke alamat memori yang sesuai.
Kesimpulan
Lazy binding adalah teknik di mana resolusi referensi simbol (fungsi atau variabel) dalam external library ditunda sampai saat pertama kali dibutuhkan saat eksekusi. Teknik ini meningkatkan efisiensi dengan mengurangi waktu pemuatan program dan penggunaan memori, karena hanya simbol yang digunakan yang akan diselesaikan.