Seri Tutorial Bahasa C – Bagian 1: Mengenal dan Memulai Membuat Program Sederhana dalam Bahasa C

Selamat datang di dunia C! Pada artikel ini akan ditunjukkan bagaimana cara membuat sebuah program C dalam teks, kemudian bagaimana cara mengkompilasinya ke dalam bentuk byte yang dapat dieksekusi.


Perkenalan Singkat Bahasa C

Bahasa C merupakan sebuah bahasa pemrograman komputer yang ringkas untuk tujuan-tujuan umum yang pada awalnya dikembangkan oleh Dennis MacAlistair Ritchie untuk sistem operasi Unix. Bahasa ini diimplementasikan pertama kali di komputer PDP-11 buatan Digital Equipment Corporation pada 1972.

Gambar 1. Dennis Ritchie di Japan Prize Foundation pada 2011 (© Wikimedia).
Gambar 1. Dennis Ritchie di Japan Prize Foundation pada 2011 (© Wikimedia).

Bahasa pemrograman baru ini dinamakan “C” yang tak lain merupakan kelanjutan dari bahasa pemrograman terdahulu yaitu bahasa “B” yang diperkenalkan pada sekitar 1970.

Sistem operasi Unix dan hampir semua aplikasinya ditulis dalam bahasa C. Namun demikian, C tidak dibatasi oleh platform tertentu dan program dapat dibuat pada mesin mana saja yang mendukung C, termasuk diantaranya yang menjalankan platform Windows.

Fleksibilitas dan portabilitas C membuatnya sangat populer dan bahasa tersebut dibakukan pada 1989 oleh ANSI (American National Standards Institute). Standar ANSI menjelaskan tanpa ambiguitas setiap aspek C, meniadakan ketidakpastian tentang sintaks yang tepat terkait bahasa tersebut. ANSI C telah dikenal sebagai standar untuk bahasa C dan dijelaskan serta akan ditunjukkan dalam contoh-contoh pada artikel ini.

Mengapa Belajar Pemrograman Bahasa C?

Bahasa C telah dikenal hingga saat ini seiring dengan diperkenalkannya bahasa-bahasa pemrograman yang baru seperti Java, C++, dan C#. Kebanyakan bahasa baru tersebut diturunkan atau setidaknya sebagian dari C dan ukurannya jauh lebih besar.

Begitu ringkasnya C menjadikannya cocok sebagai bahasa pemula karena ia mudah dipelajari. Untuk ke depan, akan sangat mudah untuk mempelajari bahasa-bahasa baru lainnya sekali saja prinsip-prinsip bahasa C telah dikuasai. Sebagai contoh, bahasa C++ merupakan sebuah ekstensi bahasa C dan seseorang mungkin bisa kesulitan untuk mempelajarinya kecuali Anda telah menguasai pemrograman bahasa C terlebih dahulu.

Terlepas dari fitur-fitur lebih yang tersedia dalam bahasa-bahasa terbaru, bahasa C tetaplah populer karena ia bisa melakukan banyak hal dan begitu efisien. Saat ini, ia digunakan juga pada banyak platform untuk segala hal mulai dari microcontroller hingga pada banyak sistem ilmiah yang paling maju. Para pemrogram di seluruh dunia menyarankan penggunaannya karena ia memperbolehkan kendali dan efisiensi maksimal dalam program-program mereka.

Pustaka-pustaka Standar Bahasa C

ANSI C menjelaskan sejumlah pustaka standar yang mengandung beberapa fungsi yang sudah dicoba dan diuji serta bisa digunakan dalam program-program C Anda. Pustaka-pustaka ada dalam berkas “header” yang masing-masingnya memiliki ekstensi berkas” .h“.

Nama-nama berkas header pustaka standar C disebutkan dalam daftar berikut dengan sebuah penjelasan mengenai kegunaannya:

Tabel 1. Pustaka-pustaka Standar Bahasa C.

Pustaka Penjelasan
stdio.h Mengandung fungsi-fungsi masukan (input) dan keluaran (output), tipe-tipe dan definisi-definisi makro. Pustaka ini digunakan kebanyakan program C dan mewakili hampir sepertiga keseluruhan pustaka-pustaka C.
ctype.h Mengandung fungsi-fungsi untuk menguji karakter-karakter.
string.h Mengandung fungsi-fungsi untuk memanipulasi kalimat teks (strings).
math.h Mengandung fungsi-fungsi matematis.
stdlib.h Mengandung fungsi-fungsi utilitas untuk konversi bilangan, alokasi penyimpanan, dsb.
assert.h Mengandung sebuah fungsi yang bisa digunakan untuk menambahkan fungsi diagnostik ke dalam sebuah program.
stdarg.h Mengandung sebuah fungsi yang digunakan untuk menjejaki sederet argumen-argumen fungsi.
setjmp.h Mengandung sebuah fungsi yang digunakan untuk menghindari rangkaian panggilan dan kembalian yang wajar.
signal.h Mengandung fungsi-fungsi untuk menangani kondisi-kondisi eksepsional yang kemungkinan muncul dalam sebuah program.
time.h Mengandung fungsi-fungsi untuk memanipulasi komponen-komponen tanggal dan waktu.
limits.h Mengandung definisi-definisi konstanta untuk ukuran tipe-tipe data bahasa C.
float.h Mengandung definisi-definisi konstanta yang berhubungan dengan aritmetika bilangan titik-kambang (floating-point).

Memasang Compiler C

Program-program C awalnya dibuat sebagai berkas teks biasa, disimpan dengan ekstensi berkas “.c”. Ia dapat ditulis dengan menggunakan editor teks biasa seperti misalnya aplikasi Windows Notepad tanpa membutuhkan perangkat lunak khusus.

Untuk mengeksekusi sebuah program C maka ia harus dikompilasi terlebih dahulu menjadi kode byte yang bisa dimengerti oleh komputer.

Sebuah compiler C membaca versi teks asli program dan menerjemahkannya menjadi berkas kedua berupa format byte yang dapat dieksekusi dan dibaca oleh mesin. Apabila program teks mengandung kesalahan-kesalahan sintaks maka hal tersebut akan dilaporkan oleh compiler dan berkas yang dapat dieksekusi tidak akan dibuat.

Salah satu compiler C yang paling populer adalah GNU Compiler Collection (GCC) yang tersedia dengan bebas di bawah syarat-syarat General Public License (GPL). Ia diikutsertakan pada hampir semua sistem operasi Linux. GCC digunakan untuk mengkompilasi semua contoh dalam artikel ini ke dalam kode byte yang dapat dieksekusi.

Untuk mengetahui apabila Anda sudah memiliki GCC dalam sistem Anda silahkan mengetikkan gcc -v pada layar perintah atau command prompt. Bila tersedia maka compiler akan memberi respon berupa informasi mengenai versinya (Gambar 2).

Gambar 2. Memperoleh informasi versi GCC dalam layar perintah.
Gambar 2. Memperoleh informasi versi GCC dalam layar perintah.

Apabila Anda menggunakan sistem operasi Linux dan GCC tidak tersedia maka pasanglah dari CD atau repositori daring, atau mintalah kepada administrator sistem untuk memasangnya.

Jika Anda menggunakan sistem operasi Windows dan GCC belum tersedia maka Anda dapat mengunduh dan memasang paket MinGW (Minimalist GNU for Windows) yang mengikutsertakan GCC dengan mengikuti langkah berikut:

  1. Bukalah sebuah browser web dan kunjungilah halaman proyek MinGW di URL berikut: https://sourceforge.net/projects/mingw.
  2. Pada halaman proyek MinGW, klik pada tombol Download untuk mengunduh AMI (Automated MinGW Installer) versi terakhir — nama berkasnya berupa mingw-get-setup.exe.
  3. Klik ganda AMI yang telah diunduh dan setujui syarat-syarat lisensinya.
  4. Terima lokasi instalasi yang disarankan di C:\MinGW kemudian klik tombol Next untuk memulai proses pemasangan.

Ketika proses pemasangan sudah selesai maka GCC yang dapat dieksekusi bisa ditemukan di subdirektori C:\MinGW\bin. Anda bisa menambahkan lokasi ini ke dalam system path sistem operasi Anda sehingga compiler dengan mudah dijalankan dari sembarang direktori.

  1. Bukalah jendela dialog Environment Variables dengan mengeklik icon System pada Control Panel, kemudian pilihlah tab Advanced dan tekan tombol Environment Variables.
  2. Temukan variabel Path kemudian ubahlah baris pernyataan akhirnya dengan menambahkan ;C:\MinGW\bin;.

Untuk menguji ketersediaan GCC pada layar perintah ketikkan gcc -v kemudian tekan tombol Return atau Enter untuk melihat tanggapan compiler berupa informasi versinya.

Menulis Sebuah Program C

Dalam program-program C, pernyataan-pernyataan kode yang dieksekusi berada dalam wadah “fungsi-fungsi”, yang didefinisikan menggunakan format sintaks berikut:

tipe-data nama-fungsi () { pernyataan-yang-dieksekusi }

Setelah sebuah fungsi dipanggil dalam sebuah eksekusi pernyataannya, ia akan mengembalikan sebuah nilai kepada pemanggil (caller). Nilai tersebut harus berupa tipe data yang telah ditentukan di sebelum nama fungsinya.

Sebuah program bisa berisi satu atau banyak fungsi namun harus selalu memiliki sebuah fungsi yang dinamakan “main”. Fungsi main() merupakan titik awal semua program C dan compiler C tidak akan mengkompilasi kode kecuali ia menemukan sebuah fungsi main() dalam program.

Fungsi-fungsi lain dalam sebuah program boleh diberi nama sembarang yang Anda sukai menggunakan huruf, angka, dan karakter garis bawah namun nama tersebut tidak boleh dimulai dengan sebuah angka. Begitu juga kata kunci C (C keywords) yang akan dibahas dalam artikel lain seri tutorial ini harus dihindari.

Isi dalam tanda kurung () setelah nama fungsi boleh mengandung nilai-nilai masukan yang digunakan oleh fungsi tersebut. Nilai-nilai yang dimaksud mengambil bentuk sebuah daftar yang dipisahkan oleh tanda koma dan dikenal sebagai “argumen-argumen” fungsi.

Tanda kurung kurawal {} mengandung pernyataan-pernyataan yang dieksekusi ketika fungsi tersebut dipanggil. Setiap pernyataan harus diakhiri dengan sebuah tanda titik-koma ; (semicolon) sama seperti setiap kalimat tulisan yang pada umumnya diakhiri dengan tanda titik.

Menurut tradisi yang umum, program pertama yang dibuat ketika mempelajari sembarang bahasa pemrograman adalah mencoba untuk menampilkan pesan sederhana “Hello World!”.

  1. Bukalah sebuah editor teks biasa, misalnya Notepad pada Windows atau GNU nano pada Linux kemudian ketikkan baris kode pada awal baris:
    #include <stdio.h>
    

    Program dimulai dengan sebuah instruksi kepada compiler C untuk mengikutsertakan informasi dari masukan/keluaran standar pada berkas pustaka stdio.h. Itu membuat fungsi-fungsi dalam pustaka tersebut tersedia untuk digunakan dalam program ini. Instruksi tersebut disebut sebagai sebuah “instruksi prapemroses” atau “preprocessor directive” dan harus selalu muncul pada awal baris sebelum kode aktual diproses.

  2. Dua baris setelah instruksi prapemroses, tambahkan sebuah fungsi main() kosong.
    int main()
    {
    }
    

    Fungsi ini mendeklarasikan bahwa sebuah nilai bilangan bulat (integer), yaitu tipe data int, seharusnya dikeluarkan oleh fungsi tersebut setelah selesai dieksekusi.

  3. Di antara kurung kurawal, tulislah sebuah baris kode yang memanggil salah satu fungsi dalam pustaka standar masukan/keluaran yang disediakan oleh instruksi prapemroses.
    printf ( "Hello World!\n" ) ;
    

    Fungsi printf() dalam fungsi tersebut mensyaratkan sebuah argumen kalimat tunggal di antara tanda kurungnya. Dalam pemrograman C, kalimat (strings) harus diapit dengan tanda petik-dua (double quotes). Kalimat tersebut mengandung teks Hello World! dan escape sequence berupa \nnewline” memindahkan kepala cetak ke marjin kiri pada baris berikutnya.

  4. Masih di dalam tanda kurung kurawal {}, masukkan baris kode akhir untuk mengembalikan sebuah bilangan bulat nol, seperti yang disyaratkan oleh deklarasi fungsi.
    return 0 ;
    

    Pada umumnya, mengeluarkan sebuah nilai nol setelah sebuah program dieksekusi mengindikasikan kepada sistem operasi bahwa program tersebut telah dieksekusi dengan benar.

  5. Periksalah bahwa kode program sudah tepat sama dengan apa yang ditulis berikut:
    #include <stdio.h>
    
    int main()
    {
        printf( "Hello World!\n" ) ;
        return 0 ;
    }
    

Program lengkap dalam format teks tersebut sekarang sudah siap untuk dikompilasi ke dalam format byte yang dapat dibaca oleh mesin menjadi sebuah berkas yang nantinya dapat dieksekusi.

Mengkompilasi Sebuah Program C

Berkas kode (source code) C untuk contoh-contoh dalam artikel ini disimpan dalam sebuah direktori dan untuk artikel ini penulis menyimpannya pada sistem operasi Linux di /home/user/kode-c/bab-001. Berkas kode hello.c tersebut nantinya menunggu untuk dikompilasi menghasilkan versi format kode byte yang bisa dieksekusi.

  1. Pada layar perintah ketikkan sebuah perintah cd yang diikuti dengan path ke direktori /home/user/kode-c/bab-001.
  2. Pada direktori /home/user/kode-c/bab-001 ketikkan gcc hello.c pada layar perintah kemudian tekan tombol Return untuk mengkompilasi program. Saat kompilasi tersebut berhasil maka compiler membuat sebuah berkas yang dapat dieksekusi di dalam direktori yang sama dengan berkas kode. Secara bawaan, berkas tersebut akan dinamakan a.out pada sistem Linux dan a.exe pada sistem Windows.

    Mengkompilasi kode C yang berbeda dalam direktori /home/user/kode-c/bab-001 akan menimpa berkas yang sudah ada tanpa peringatan. Itu tentu tidak memuaskan sehingga namanya harus ditentukan ketika mengkompilasi hello.c. Itu bisa dilakukan dengan menyertakan opsi -o yang diikuti dengan nama yang ditentukan pada perintah compiler.

  3. Pada layar perintah dalam direktori /home/user/kode-c/bab-001 ketikkan gcc hello.c -o hello kemudian tekan tombol Return untuk mengkompilasi program sekali lagi. Baik pada sistem Linux maupun Windows, sebuah berkas yang dapat dieksekusi bernama hello tercipta berdampingan dengan kode berkas C (Gambar 3).

    Gambar 3. Isi direktori yang menunjukkan berkas keluaran kompilasi program C.
    Gambar 3. Isi direktori yang menunjukkan berkas keluaran kompilasi program C.
  4. Pada layar perintah Windows ketikkan nama berkas yang dapat dieksekusi *.exe kemudian tekan tombol Return. Kalimat teks merupakan keluaran dan kursor ketik akan berpindah ke baris berikutnya. Sedangkan pada Linux karena sistem Linux secara bawaan tidak mencari di direktori saat ini untuk berkas yang bisa dieksekusi, kecuali diarahkan secara spesifik maka diperlukan prefiks pada nama berkasnya berupa ./ untuk mengeksekusi program.
  5. Pada layar perintah Linux ketikkan ./hello kemudian tekan tombol Return untuk menjalankan program maka akan keluar kalimat yang diikuti dengan berpindahnya kursor ke baris berikutnya (Gambar 4).

    Gambar 4. Mengeksekusi program hello pada sistem Linux.
    Gambar 4. Mengeksekusi program hello pada sistem Linux.

Anda sekarang sudah membuat, mengkompilasi, dan mengeksekusi program sederhana Hello World yang merupakan titik awal Anda dalam mempelajari pemrograman bahasa C. Semua contoh dalam artikel lanjutan nantinya akan dibuat, dikompilasi, dan dieksekusi dengan cara yang sama.

Memahami Kompilasi

Dalam menghasilkan sebuah berkas yang dapat dieksekusi dari sebuah berkas kode C, proses kompilasi sebenarnya menjalani empat tahapan yang terpisah dengan masing-masingnya menghasilkan sebuah berkas baru:

  1. Prapemrosesan (preprocessing)
    Prapemroses mengganti semua instruksi prapemroses dalam berkas kode “.c” dengan kode pustaka aktual yang menerapkan instruksi-instruksi tersebut. Sebagai contoh, kode pustaka disubstitusikan untuk instruksi #include. Berkas yang dihasilkan mengandung substitusi-substitusi berwujud teks dan memiliki ekstensi berkas “.i“.
  2. Penerjemahan (translating)
    Compiler menerjemahkan instruksi-instruksi tingkat tinggi dalam berkas “.i” ke instruksi bahasa tingkat rendah yaitu bahasa mesin atau assembly. Berkas translasi yang dihasilkan berupa teks dan memiliki ekstensi berkas “.s“.
  3. Perakitan (assembling)
    Assembler mengubah instruksi teks bahasa mesin dalam berkas “.s” menjadi kode mesin. Obyek konversi yang dihasilkan berbentuk biner dan berkasnya berekstensi “.o“.
  4. Pentautan (linking)
    Linker menggabungkan satu atau lebih obyek biner berkas “.o” ke dalam sebuah berkas tunggal yang dapat dieksekusi. Berkas biner yang dihasilkan memiliki ekstensi .exe pada sistem Windows.

Boleh dikatakan bahwa “kompilasi” yang dijelaskan pada tiga tahapan pertama di atas yang beroperasi pada sebuah berkas kode tunggal secara pasti menghasilkan berkas obyek biner tunggal. Saat kode program mengandung kesalahan-kesalahan sintaks, misalnya tidak terdapat sebuah tanda titik-koma ; sebagai penutup pernyataan atau lupa menutup dengan tanda kurung maka hal tersebut akan dilaporkan oleh compiler dan kompilasi akan gagal.

Linker, di lain sisi, bisa beroperasi pada beberapa berkas objek dan menghasilkan sebuah berkas biner. Hal tersebut mengijinkan dibuatnya program besar dari berkas-berkas objek yang berupa modul yang bisa jadi masing-masingnya mengandung fungsi-fungsi yang bisa digunakan ulang. Ketika linker menemukan fungsi dengan nama yang sama dalam beberapa berkas objek maka ia akan melaporkan sebuah kesalahan dan berkas yang dapat dieksekusi tidak dibuat.

Berkas-berkas sementara yang dibuat pada tengah tahapan proses kompilasi secara otomatis dihapus, namun berkas tersebut bisa diperoleh untuk inspeksi dengan mengikutsertakan opsi -save-temps dalam perintah compiler.

  1. Pada sebuah layar perintah dalam direktori /home/user/kode-c/bab-001, ketikkan gcc hello.c -save-temps -o hello kemudian tekan Return atau Enter untuk melakukan kompilasi ulang pada program dan menyimpan berkas-berkas sementara (Gambar 5).

    Gambar 5. Isi direktori /home/user/kode-c/bab-001 setelah kompilasi gcc menyertakan opsi -save-temps.
    Gambar 5. Isi direktori /home/user/kode-c/bab-001 setelah kompilasi gcc menyertakan opsi -save-temps.
  2. Bukalah berkas hello.i dengan menggunakan editor teks biasa, misalnya Notepad pada sistem Windows atau GNU nano pada sistem Linux yang penulis gunakan, untuk melihat kode C yang Anda tulis berada pada bagian akhir berkas yang di atasnya sudah disubstitusi dengan kode pustaka stdio.h.
  3. Sekarang bukalah berkas hello.s dengan editor teks yang sama untuk melihat terjemahannya ke dalam bahasa tingkat rendah kode assembly dan Anda dapat melihat betapa kode yang ada di dalamnya sudah begitu sulit dibaca oleh kita dibandingkan kode versi C-nya (Gambar 6).

    Gambar 6. Isi berkas hello.s yang merupakan terjemahan kode C menjadi bahasa assembly.
    Gambar 6. Isi berkas hello.s yang merupakan terjemahan kode C menjadi bahasa assembly.

Ringkasan

  • ANSI (American National Standards Institute) meletakkan dasar standar yang diakui untuk bahasa pemrograman C.
  • Bahasa pemrograman lain, seperti misalnya C++ dan C# sebagian diturunkan dari bahasa C.
  • Bahasa C memiliki sejumlah pustaka standar berisi fungsi-fungsi yang sudah diuji coba dan bisa digunakan di program C apa saja.
  • Pustaka-pustaka C terkandung dalam berkas header yang berkasnya berekstensi “.h“.
  • Program-program C dibuat sebagai sebuah teks biasa yang berkasnya memiliki ekstensi “.c“.
  • Compiler populer GNU C Compiler (GCC) diikutsertakan dalam paket Minimalist GNU for Windows (MinGW).
  • Menambahkan direktori sarang compiler ke dalam system path menjadikan compiler dapat dijalankan dari sembarang direktori.
  • Program-program memiliki sebuah atau lebih dari satu fungsi yang berisi pernyataan-pernyataan yang dieksekusi saat fungsi dipanggil.
  • Setiap program C harus memiliki sebuah fungsi main().
  • Sebuah deklarasi fungsi diawali dengan menentukan tipe data nilai yang dikeluarkan setelah fungsi tersebut dieksekusi.
  • Pernyataan-pernyataan yang dieksekusi diletakkan di dalam kurung kurawal { } dan setiap pernyataan harus diakhiri dengan sebuah tanda titik-koma ;.
  • Instruksi-instruksi prapemroses (preprocessor) diimplementasikan dalam kompilasi program tahap pertama dan akan mensubstitusikan kode pustaka.
  • GNU C Compiler dijalankan dengan perintah gcc dan bisa mengikutsertakan sebuah opsi -o untuk memberikan nama berkas keluaran.
  • Berkas-berkas yang sifatnya dibuat sementara (temporary files) selama proses kompilasi bisa diperoleh dengan menggunakan opsi -save-temps pada perintah compiler.

Daftar Pustaka

  1. Kernighan, Brian W. & Ritchie, Dennis M. (1988). The C Programming Language. New Jersey: Prentice Hall.
  2. Griffiths, David & Griffiths, Dawn (2012). Head First C. California: O’Reilly.
  3. McGarth, Mike (2012). C Programming: Grasp the Nuts and Bolts of Programming. Warwickshire: In Easy Steps Ltd.
  4. Stevanovic, Milan (2014). Advanced C and C++ Compiling: An Engineering Guide to Compiling, Linking, and Libraries using C and C++. California: Apress.
FacebooktwitterredditpinterestlinkedinmailFacebooktwitterredditpinterestlinkedinmail