Memahami sejarah C membantu kita memahami kenapa bahasa ini berbentuk seperti sekarang. Banyak keputusan desain yang tampak aneh bagi pemula hari ini sebenarnya merupakan jawaban rasional terhadap keterbatasan mesin dan compiler pada era 1970-an. Pada Chapter ini kita akan menelusuri jalur C dari bahasa BCPL dan B di Bell Labs, lalu melihat bagaimana sintaks lama berbeda dengan sintaks modern, dan mengapa standar ISO terus diperbarui.
Dari BCPL ke B ke C #
Akar bahasa C bermula dari BCPL, sebuah bahasa yang dibuat oleh Martin Richards pada tahun 1967 untuk menulis compiler. Ken Thompson di Bell Labs kemudian menyederhanakan BCPL menjadi bahasa B sekitar tahun 1969 untuk mesin PDP-7. Bahasa B tidak memiliki tipe data: semua nilai disimpan sebagai word tanpa pembedaan antara angka, alamat, atau karakter. Keterbatasan ini membuat B tidak cocok untuk mesin baru seperti PDP-11 yang memiliki tipe data byte dan word berbeda.
Dennis Ritchie mengembangkan bahasa C pada sekitar tahun 1972 dengan menambahkan sistem tipe dan struktur data ke ide-ide yang sudah ada di B. Tujuan utamanya adalah menulis ulang kernel Unix dari bahasa assembly ke bahasa tingkat tinggi yang lebih portabel. Mari kita lihat ringkasan timeline C dalam program:
#include <stdio.h>
int main(void) {
printf("Timeline singkat C:\n");
printf(" 1969 : Bahasa B oleh Ken Thompson\n");
printf(" 1972 : Bahasa C oleh Dennis Ritchie\n");
printf(" 1978 : Buku K&R pertama terbit\n");
printf(" 1989 : Standar ANSI C89\n");
printf(" 1999 : Standar C99\n");
printf(" 2011 : Standar C11\n");
printf(" 2018 : Standar C17\n");
printf(" 2024 : Standar C23\n");
return 0;
}Output yang Dihasilkan:
Timeline singkat C:
1969 : Bahasa B oleh Ken Thompson
1972 : Bahasa C oleh Dennis Ritchie
1978 : Buku K&R pertama terbit
1989 : Standar ANSI C89
1999 : Standar C99
2011 : Standar C11
2018 : Standar C17
2024 : Standar C23Mari kita telaah baris-baris kode di atas:
- Baris 3 (
int main(void)): titik masuk program; tandavoidmenyatakanmaintidak menerima argumen. - Baris 4-11 (
printf(...)): setiap pemanggilanprintfmencetak satu baris teks yang diakhiri karakter newline\n. - Baris 12 (
return 0;): mengembalikan kode keluar0ke sistem operasi sebagai tanda program berakhir sukses.
Era K&R dan Buku Pertama #
Pada tahun 1978, Brian Kernighan dan Dennis Ritchie menerbitkan buku The C Programming Language, yang sering disebut “K&R”. Buku ini sekaligus berfungsi sebagai spesifikasi informal bahasa C selama lebih dari satu dekade. Sintaks yang didokumentasikan buku ini kemudian dikenal sebagai “K&R C” dan memengaruhi banyak compiler komersial pada era 1980-an.
Salah satu perbedaan paling mencolok antara K&R C dan C modern adalah cara mendeklarasikan parameter fungsi. K&R menempatkan tipe parameter di baris terpisah setelah tanda kurung tutup, sedangkan ANSI C (sejak 1989) menempatkannya langsung di dalam kurung. Mari kita bandingkan keduanya:
#include <stdio.h>
/* Deklarasi gaya K&R (lama): tipe parameter di baris terpisah */
int jumlah_kr(a, b)
int a;
int b;
{
return a + b;
}
/* Deklarasi gaya ANSI (modern): tipe parameter di dalam kurung */
int jumlah_ansi(int a, int b) {
return a + b;
}
int main(void) {
printf("K&R : %d\n", jumlah_kr(3, 4));
printf("ANSI : %d\n", jumlah_ansi(3, 4));
return 0;
}Output yang Dihasilkan:
K&R : 7
ANSI : 7Mari kita telaah baris-baris kode di atas:
- Baris 4 (
int jumlah_kr(a, b)): deklarasi gaya K&R; nama parameter terlebih dahulu tanpa tipe, daftar parameter kemudian dijelaskan baris-baris berikutnya. - Baris 5-6 (
int a; int b;): definisi tipe parameteradanb, masing-masing bertipeint. - Baris 8 (
return a + b;): mengembalikan hasil penjumlahan. - Baris 11 (
int jumlah_ansi(int a, int b)): deklarasi gaya ANSI modern; tipe parameter ditulis langsung di dalam kurung. - Baris 16-17 (
printf(...)): kedua fungsi dipanggil dengan argumen3dan4; hasil7dicetak dua kali.
Era Standar ISO #
Pada tahun 1983, ANSI membentuk komite X3J11 untuk membuat standar formal C. Standar ini disetujui tahun 1989 sebagai ANSI C89, lalu diadopsi ISO tahun 1990 sebagai ISO/IEC 9899:1990 (C90). Sejak itu, ISO menerbitkan beberapa revisi besar: C99 menambahkan tipe _Bool, komentar //, dan deklarasi variabel di tengah blok; C11 menambahkan dukungan thread dan atomic; C17 hanya berisi perbaikan cacat; C23 yang disetujui tahun 2024 menambahkan banyak fitur modern seperti constexpr dan bool bawaan.
Compiler modern mengekspos makro __STDC_VERSION__ yang berisi versi standar yang dipakai saat kompilasi. Kita bisa mencetak nilai makro ini untuk memeriksa versi standar:
#include <stdio.h>
int main(void) {
printf("__STDC_VERSION__ = %ldL\n", (long)__STDC_VERSION__);
return 0;
}Output yang Dihasilkan (dengan flag -std=c11):
__STDC_VERSION__ = 201112LOutput yang Dihasilkan (dengan flag -std=c17):
__STDC_VERSION__ = 201710LMari kita telaah baris-baris kode di atas:
- Baris 4 (
__STDC_VERSION__): makro prapemroses yang didefinisikan compiler bila mode standar ISO dipakai; nilainya berupa long integer literal. - Baris 4 (
(long)__STDC_VERSION__): nilai makro di-cast ke tipelonglalu dicetak dengan format specifier%ld. - Baris 4 (
...L\n): akhiranLpada literal201112Lhanya sebagai contoh format; nilai aktual datang dari makro.
C Hari Ini dan Masa Depan #
Setelah lebih dari lima puluh tahun, C tetap menjadi bahasa yang dipakai untuk menulis kernel, sistem tertanam, database engine, dan library kritis. Komite ISO C (WG14) terus merilis revisi: C23 disetujui pada tahun 2024 dan membawa fitur seperti constexpr, bool bawaan tanpa header <stdbool.h>, serta atribut [[noreturn]] dan [[deprecated]]. Memahami sejarah C membantu kita membaca kode warisan (legacy code) yang mungkin masih memakai sintaks K&R, sekaligus mengapresiasi kenapa fitur-fitur modern hadir terlambat dibanding bahasa-bahasa yang lebih baru.