Musl

**musl** adalah penyedia pustaka C untuk sistem operasi standar kernel Linux yang dirilis di bawah lisensi MIT. Digunakan untuk perangkat sistem operasi Linux x86 (32/64), ARM (32/64), MIPS (32/64), PowerPC (32/64), S390X, SuperH, Microblaze, OpenRISC. Seperti Alpine Linux yang dibangun dengan menggunakan musl libc dan busybox. Dragora 3.0 Alpha 2 yang dibangun untuk mentransisi ke pustaka C musl.

## Tentang
Dikembangkan oleh Rich Felker untuk menulis implementasi pustaka C yang bersih, efisien dan sesuai dengan standar yang dijelaskan dalam standar ISO C dan POSIX yang digunakan pada sistem operasi kernel Linux. Sementara itu, kernel Linux mengatur akses ke perangkat keras, memori, sistem berkas dan hak istimewa untuk mengaksesnya adalah pustaka C.

musl dirancang untuk penautan statis yang dinamis dan efisien yang mampu menghindari penarikan kode atau data dalam jumlah besar. Penautan tersebut menyatukan implementasi utas, matematika dan bahkan penautan dinamis itu sendiri ke dalam satu objek bersama.

musl memperlihatkan implementasi utas POSIX pasca-NPTL untuk Linux yang didesain ulang untuk menghindari kondisi balapan pada desain NPTL asli. Demi efisiensi, musl memiliki berat 10-20k tergantung target dan pengaturan kompiler. Dirancang untuk memiliki ketahanan kode secara langsung, sehingga kondisi kehabisan memori tidak pernah berakibat fatal. musl juga tidak memiliki alokasi dinamis yang tidak perlu bahkan tidak ada kegagalan yang tidak dapat dipulihkan.

Lisensi MIT yang dimiliki musl bersifat permisif kompatibel dengan semua lisensi FOSS. musl juga ramah terhadap penautan statis sehingga penggunaannya mampu memaksimalkan penerapan aplikasi. 

Biner yang ditautkan pada musl bisa digunakan sebagai file biner tunggal yang tidak memiliki ketergantungan pada perangkat luar. Bisa dijalankan pada mesin apa pun dengan mengikuti instruksi yang sesuai. Mempelajari cara kerja musl bisa dilakukan dengan mudah karena musl memiliki tata letak sumber kode yang sederhana. Hal ini juga memudahkan untuk melacak penyebab munculnya bug.

## Sejarah
Pada 1990-an, Linux menggunakan fork dari pustaka GNU C (glibc) versi 1 yang tersedia beberapa versi (libc4, libc5). Distribusi dilanjutkan dengan mengadopsi glibc versi 2 yang dinamakan libc6. Selanjutnya, mulai bermunculan pustaka C khusus lainnya seperti uClibc dan dietlibc.

musl versi 1.1.10 menyediakan lokalitas UTF-8 C yang diizinkan oleh standar ISO. Namun, banyak pengkodean yang memproses data tidak valid. Pada 2013, Austin Group (penanggung jawab POSIX) memberi syarat untuk versi terbaru musl agar pustaka C bisa memperlakukan setiap byte sebagai karakter abstrak.

musl menggunakan Unicode dan ISO 10646 yang baru dari UTF-8. Penggunaan ini mendefinisikan pemetaan satu ke satu antara Unicode Scalar Values dan urutan 1-4 byte yang valid. Pengurutan sampai 4 byte ini memungkinkan hasil output UTF-8 dalam buffer.

Kemudian, pada versi 1.1.11, terdapat pustaka C yang khusus sehingga tiap byte diperlakukan sebagai unit karakter tanpa identitas yang sebenarnya. Tempat khusus ini dimaksudkan agar setiap rangkaian karakter bisa diproses byte per byte tanpa validasi.

Pada musl versi 1.1.17 terdapat perbedaan pemanggilan pada aplikasi terhadap beberapa pustaka tanpa menggunakan informasi pemanggilan yang tepat sehingga setelah semua pustaka dimuat hasilnya tidak praktis. Versi pertama memiliki pustaka dengan simbol-simbol yang tidak terselesaikan.

Merujuk tujuan awal dibuatnya musl untuk untuk keperluan umum yang baru, yang ringan, cepat, sederhana, gratis serta sesuai dengan standar keamanan. Maka, versi musl yang lebih baru mengimplementasikan pengikatan yang lebih tangguh hingga mampu melakukan pemanggilan terhadap simbol-simbol baru.

## Penggunaan
musl bisa digunakan pada Linux 2.6 atau yang lebih baru. Penggunaan musl bisa digunakan pada CPU yang didukung i386, x86_64, arm, mips, microblaze, atau powerpc. superh dan x32 (x86_64 32-bit ABI). musl bisa digunakan pada hampir semua kompilator C yang sesuai dengan standar (bahkan sebelum C99) dapat digunakan.

## Referensi