System programming

Banyak orang yang terkesima dengan orang yang memprogram di level kernel sistem operasi; banyak juga yang menganggap wilayah kompilasi atau interpretasi itu sesuatu yang rumit, dan sebaiknya diterima saja, tidak perlu dipelajari.

Sebagian orang bersifat tidak mau tahu. Misalnya ada yang bilang: mengapa belajar assembly atau C/C++, bahasanya nggak dipakai, mendingan belajar PHP, Ruby, Java atau .NET. Orang-orang tersebut tidak menyadari bahwa compiler dan atau runtime bahasa-bahasa tersebut dibuat dengan C dan C++. Sebagian besar library yang dipakai di berbagai bahasa juga diimplementasikan di C/C++.

Sebagian kemampuan prosessor juga tidak akan bisa dimanfaatkan secara maksimal oleh bahasa tingkat tinggi, tanpa bantuin assembly dan atau C/C++. Contoh terbaru adalah instruksi-instruksi STTNI (String & Text New Instructions) yang diperkernalkan di prosessor baru Intel dengan arsitektur Nehalem untuk mempercepat pemrosesan teks (dan parsing XML) tidak akan bisa dilakukan.

Bahkan jika Anda tidak memprogram dalam bahasa C sekalipun, pengetahuan tersebut bisa berguna, misalnya Anda bisa mengoptimasi penggunaan memori dan mengoptimasi kecepatan di PHP. Lihat juga posting saya mengenai Kritik PHP.

Sekarang pertanyaan berikutnya yang mungkin muncul adalah: bagaimana saya belajar pemrograman sistem?


System programming adalah aktivitas pembuatan software sistem. Ini cakupannya luas, dari mulai kernel sistem operasi, sampai compiler, dan aneka utility level sistem.

Untuk memahami system programming, belajarlah dari memakai bahasa C. Bahasa ini sangat dekat dengan mesin. Anda mungkin akan merasa stress harus mengatur semua hal sendiri (memori harus dialokasi dan dealokasi, menyalin string tidak bisa dengan sekedar tanda sama dengan, dan sebagainya).  Jangan terlalu memikirkan membuat aplikasi GUI, aplikasi mode teks sudah cukup.

Sistem operasi Unix atau turunannya sangat berguna, karena arsitekturnya terbuka, jadi Anda bisa melihat internalnya dengan mudah. Sekarang ini Anda dengan mudah bisa menginstall Linux, FreeBSD atau jika punya uang: OS X (walau bisa juga diinstall di desktop non-Apple dengan cara tertentu).

Ketika belajar C kali pertama mungkin Anda akan memanggil fungsi-fungsi milik library C (fopen, fprintf, dsb), berikutnya Anda bisa langsung memanggil layanan sistem operasi (open, write, close, dsb). Anda mungkin akan bisa melihat bahwa fopen/fwrite/fclose sebenarnya hanya membungkus system call tertentu.

Pelajari aneka algoritma dasar dan struktur data yang mungkin belum pernah Anda implementasikan. Di berbagai bahasa, hashtable/map sudah menjadi hal dasar, tapi di C Anda perlu mengimplementasikan sendiri. Anda mungkin tidak pernah memikirkan bagaimana sorting dilakukan di PHP, tapi di C Anda perlu melakukannya.

Memprogram dalam bahasa C seharusnya akan membuat Anda bisa melihat bagaimana sebenarnya aneka fungsi di bahasa tingkat tinggi hanya membungkus fungsi yang diberikan di sistem operasi atau library.

Setelah itu Anda bisa bermain-main, mengkompilasi kernel Anda sendiri. Sekarang ini mengkompilasi kernel Linux di komputer modern butuh waktu hanya beberapa puluh menit saja (tidak berjam-jam seperti dulu). Setelah bisa mengkompilasi, cobalah memodifikasi source yang ada. Anda bisa belajar membuat device driver juga. Ketika belajar ini, mungkin Anda akan membuat komputer Anda menjadi hang, jadi cobalah di virtual machine.

Seharusnya di level ini, Anda akan memiliki motivasi untuk mencari tahu sendiri bagaimana caranya melakukan X atau Y, atau mengapa Z tidak bisa berjalan.

Bagian yang sulit bagi saya adalah ketika memahami soal hardware. Saya tidak memiliki background elektronika. Untuk meningkatkan pemahaman saya, saya belajar dari tingkat yang sangat rendah: saya belajar sendiri microcontroller. Sebuah microcontroller adalah sebuah paket CPU dalam sebuah IC disertai dengan berbagai input/output serta periferal tambahan (misalnya UART controller).

 Microcontroller mengajarkan saya mengenai berbagai cara interkoneksi hardware, dengan general purpose IO pin, dengan SPI, dan sebagainya. Ini jauh lebih sederhana daripada sistem desktop yang rumit. 

Hal yang sangat membantu saya memahami sebuah sistem adalah ketika melakukan porting. Porting adalah proses untuk membuat software di suatu sistem berjalan di sistem lain. Menulis software dari nol akan sangat membosankan, dan butuh waktu lama, jadi porting merupakan aktivitas yang menarik karena memberi pengalaman dari dunia asal dan dunia tujuan . Ketika saya memporting pembaca Alkitab PalmBible plus ke Symbian, saya belajar bagaimana penanganan akses file, memori, dsb di Palm dan di Symbian. 

Pengalaman FreeBSD ke platform ARM baru memberikan pengalaman yang lebih banyak lagi. Diberikan sebuah hardware, dan sebuah sistem operasi yang jarang sekali saya pakai, saya harus belajar bagaimana inisialisasi kernel FreeBSD, bagaimana alokasi memori dilakukan, bagaimana FreeBSD menemukan hardware, dan sebagainya. Walau sampai sekarang masih ada sedikit misteri di beberapa bagian FreeBSD yang belum saya mengerti, saya yakin bahwa dengan ketekunan, saya akan bisa memahaminya.

Intinya adalah: jika ingin belajar system programing, Anda tidak perlu langsung lompat turun belajar assembly. Belajarlah dengan mempelajari satu level di bawah level abstraksi saat ini, lalu satu level lagi, dan seterusnya.

One thought on “System programming”

Leave a Reply

Your email address will not be published. Required fields are marked *