Garbage Collection bukan Panasea

Para mahasiswa yang belajar C setelah belajar beberapa bahasa lain (seperti PHP dan Java) biasanya akan kesulitan, karena di C alokasi memori harus diperhatikan dengan sangat detail. Bahkan setiap string harus dialokasi manual. Anda juga harus tahu dengan tepat apakah suatu objek berada di heap atau stack (dalam C *objek* adalah suatu lokasi memori yang bernama).

Detail-detail alokasi memori dan dealokasi memori biasanya tidak dibutuhkan lagi dalam aneka bahasa modern (Java, semua bahasa berhasis .NET, python, php, dsb) karena adanya fitur garbage collection. Tapi Anda akan salah jika menanggap pengetahuan mengenai alokasi dan dealokasi memori tidak diperlukan lagi.
Jika Anda memiliki sebuah list, tree, atau struktur data lain di mana satu objek merefer ke objek lain, dan objek tersebut merefer ke objek lain lagi, maka Anda mulai harus berhati-hati. Jika ternyata masih ada objek yang memegang reference ke “ujung” struktur data (root tree, atau elemen pertama list), maka seluruh elemen yang berhubungan tidak akan dilepaskan.

Garbage collection juga memiliki kelemahan: sifatnya tidak deterministik, kita tidak tahu kapan garbage collection akan dilakukan (sangat tergantung pada komponen yang melakukan garbage collection). Efek pengumpulan sampah di saat yang tidak diinginkan adalah kinerja aplikasi akan terganggu.

Efek lain yang buruk adalah: ketika garbage collection dilakukan, biasanya semua thread harus dihentikan sementara. Ini berarti bahwa kinerja aplikasi bisa sangat terganggu di saat yang tidak diharapkan.

Jadi jika Anda masih mempertanyakan kenapa harus belajar alokasi memori, dan mengapa mahasiswa masih perlu diajari bahasa C, berarti Anda belum paham benar mengenai garbage collection.

Pendidikan Pemrograman Yang Tidak Baik

Seperti telah saya tuliskan sebelumnya, belajar pemrograman secara formal itu perlu, tapi sayangnya beberapa tempat tidak mengajarkan pemrograman dengan baik. Berikut ini beberapa ciri pengajaran pemrograman yang tidak baik:

  1. Terlalu berfokus pada tools tertentu yang trend saat ini. Mahasiswa wajib memakai tools X (misalnya IDE-nya harus Microsoft Visual Studio, atau harus memakai Visual Prolog). Tools akan cepat sekali berganti. Ketika Anda diajari tools X, ketika lulus, tools tersebut mungkin sudah tidak ada, atau tidak didukung lagi. Ingin contoh? DBase dan Visual Basic. Dulu keduanya sempat menjadi tools yang “standar”, tapi sekarang tools tersebut tidak disupport lagi.
  2. Tidak mengikuti perkembangan zaman. Ini ekstreem sebaliknya dari yang pertama, ada yang masih mengajarkan kuliah C dengan standar Pre ANSI-C, dan menggunakan compiler Turbo C++ 2.0, yang dirilis kira-kira 20 tahun yang lalu, dan sudah tidak didukung lagi.
  3. Kurang mengajarkan aspek algoritma. Pada sebagian besar bahasa, sudah tersedia library standar untuk sorting, searching, dsb, tapi tanpa memahami kemampuan dan batasan setiap algoritma, Anda akan menemukan hambatan ketika memproses data dalam jumlah yang besar.
  4. Hanya mengajarkan paradigma tertentu. Umumnya paradigma yang dipakai sekarang adalah object-oriented yang digabung dengan procedural, tapi itu bukan satu-satunya cara menyelesaikan masalah.

Jangan heran jika ternyata lulusan sebuah sekolah/perguruan tinggi komputer tidak bisa memprogram jika pengajarannya tidak benar. Jika Anda ingin menyaring antara orang yang punya dasar pemrograman dan yang tidak, cobalah test sederhana ini.

Write a program that prints the numbers from 1 to 100. But for multiples of three print “Fizz” instead of the number and for the multiples of five print “Buzz”. For numbers which are multiples of both three and five print “FizzBuzz”.

Programmer yang baik akan bisa menuliskan solusinya di atas kertas (tanpa bantuan komputer), dalam beberapa menit.

Representasi Bilangan Desimal di Komputer

Dalam dunia komputer, biasanya kita menggunakan representasi floating point untuk menyimpan bilangan desimal. Namun itu bukan satu-satunya representasi yang ada. Ada beberapa representasi lain yang berupa fixed point, misalnya BCD (binary coded decimal), Chen-Ho, dan DCD (Densely Coded Decimal). Jika diperlukan Anda pun bisa membuat representasi sendiri, sesuai yang Anda mau.

Metode penyimpanan yang ada tersebut dibuat dengan tujuan yang berbeda-beda, misalnya tujuan utama representasi floating point adalah dapat menampung angka dalam range yang besar, tapi dengan presisi yang berkurang/terbatas. Floating point juga biasanya basis 2, sehingga lebih cepat dieksekusi di komputer yang memakai binary logic (perlu dicatat, tidak semua komputer memakai binary logic).

Representasi desimal yang lain bertujuan agar dapat merepresentasikan bilangan secara eksak, namun rangenya terbatas. Variasi representasi dibuat untuk berbagai tujuan, misalnya DCD dibuat agar memori yang diperlukan lebih sedikit.
Continue reading Representasi Bilangan Desimal di Komputer

Struct vs Union

Posting ini merupakan jawaban saya pada sebuah pertanyaan di milis linux-programming (Juli 2007). Saya posting di sini karena mungkin akan berguna bagi pemula dalam C.

Struct berguna untuk mengelompokkan data. Contoh: struktur mahasiswa mungkin memiliki NIM, nama, dst. Rasanya ini mudah dimengerti.

Union: untuk memberi beberapa nama untuk satu lokasi memori. Ini yang biasanya yang sulit dimengerti oleh yang baru belajar C. Saya berikan beberapa contoh:

#include <stdio.h>

union {
      int a;
      int b;
} a_dan_b;


int main() 
{
	a_dan_b.a = 5;
	printf("%d\n", a_dan_b.b);
	return 0;
}

Apa hasil keluaran program itu? Jawabnya adalah 5, karena a dan b menempati lokasi memori yang sama. Kita bisa menambahkan banyak variabel di union. Jika tipe variabel itu sama, maka nilainya akan sama. Kita bisa membuat union dari tipe yang berbeda juga, misalnya:

Continue reading Struct vs Union

Mengenal fitur bahasa: Tipe Enumerasi

Sebagian orang menganggap bahasa hanya sebagai alat, dan memakai bahasa apapun sama saja. Sebagian lagi fanatik terhadap suatu bahasa, dan menganggap bahasa yang lain itu jelek. Menurut saya yang benar ada di antara keduanya itu. Dalam banyak hal, memakai bahasa apa saja sama saja, tapi dalam kasus tertentu bahasa tertentu lebih baik dari bahasa yang lain.

Memprogram embedded system dalam C akan lebih mudah dibanding dengan menggunakan Pascal misalnya. Penggunaan C dalam embedded system juga menghemat memori, yang akan menghemat biaya produksi alat. Untuk dapat menggunakan suatu bahasa dengan baik, kita perlu mengetahui mengapa fitur tertentu ada di suatu bahasa, dan kapan sebaiknya kita memanfaatkannya.

Dalam kesempatan ini, saya akan membahas penggunakan tipe enumerasi (enum), yang jarang digunakan programmer pemula. Tipe ini banyak diajarkan di berbagai kuliah atau buku, tapi hal yang kurang dibahas adalah mengapa kita sebaiknya memakai tipe enumerasi dibandingkan menggunakan konstanta integer.

Tipe enumerasi adalah tipe di mana nilai yang mungkin disebutkan satu per satu oleh programmer. Misalnya tipe hari yang terdiri dari Senin, Selasa, Rabu, Kamis, Jumat, Sabtu, dan Minggu. Banyak bahasa pemrograman memiliki tipe enumerasi, misalnya C, Pascal, C#, Java 5 ke atas, Ada, dan Visual Basic.

Continue reading Mengenal fitur bahasa: Tipe Enumerasi