Pinned

Standar Pemrograman Bahasa C

Berikut adalah tindakan yang dilakukan oleh Bahasa C ketika Program bahasa C memberikan hasil yang berbeda dari dua kompilator berbeda.

Standar Pemrograman Bahasa C
Ilustrasi Standar Bahasa C


Contoh, perhatikan kode bahasa C sederhana berikut.

void main() { }

Program berikut akan gagal dijalankan menggunakan gcc dengan return tipe dari fungsi main adalah void, tetapi program tersebut dapat berhasil dikompilasi jika dijalankan pada Turbo C. Bagaimanakah cara menentukan apakah program C dapat dijalankan atau tidak.

Perhatikan program berikut ini sebagai contoh selanjutnya. Hasil dari kode program tersebut akan menghasilkan hasil yang berbeda pada kompilator yang berbeda pula.

Contoh:

/* Standar pemrograman bahasa C */

#include<stdio.h>

int main()

{

int i = 1;

printf("%d %d %d\n", i++, i++, i);

return 0;

}

Output:
2 1 3 - jika menggunakan g++ 4.2.1 on Linux.i686
1 2 3 - jika menggunakan SunStudio C++ 5.9 on Linux.i686
2 1 3 - jika menggunakan g++ 4.2.1 on SunOS.x86pc
1 2 3 - jika menggunakan SunStudio C++ 5.9 on SunOS.x86pc
1 2 3 - jika menggunakan g++ 4.2.1 on SunOS.sun4u
1 2 3 - jika menggunakan SunStudio C++ 5.9 on SunOS.sun4u


Manakah diantara hasil kompilasi sebelumnya yang benar?
Jawabannya adalah tergantung dari standariasai bahasa C yang digunakan. Pada semua kasus dibutuhkan standar C untuk memahami output program yang dihasilkan oleh contoh.

Standar C
Standar C versi terbaru adalah ISO/IEC 9899:2018 (www.iso.org), juga dikenal sebagai C18 yang merupakan final draft yang dipublikasikan pada tahun 2018. Sebelum C18, ada standar lain bernama C11.

Behavior dari semua program dari standar C
Standar C mengeluarkan beberapa behavior dari banyak konstruktur C sebagai undefined dan beberapa sebagai unspecified untuk menyederhanakan spesifikasi dan memungkinkan fleksibilitas dalam implementasi. Contohnya, pada penggunaan bahasa C dari variabel outomatic apapun sebelum menghasilkan inisialisasi behavior undefined dan perintah evaluasi dari sub ekspresi yang tidak spesifik. Hal ini memungkinkan apapun cara yang  paling mudah ataupun paling efisien, seandainya bentuk program tersebut diajukan.

Apakah hasil dari dua contoh sebelumnya?
Dianggap bahwa contoh pertama adalah "void main()", maka standar dari bahasa c menyatakan bahwa:

The function called at program startup is named main. The implementation
declares no prototype for this function. It shall be defined with a return
type of int and with no parameters:
       int main(void) { /* ... */ }
or with two parameters (referred to here as argc and argv, though any names
may be used, as they are local to the function in which they are declared):
       int main(int argc, char *argv[]) { /* ... */ }
or equivalent;10) or in some other implementation-defined manner.

Jadi tipe return void tidak mengikuti standar dan hal ini dimungkinkan pada beberapa kompilator.

Catatan: bahwa statement pada Standar C ditandai sebagai unspesified behavior.

The order in which the function designator, arguments, and
subexpressions within the arguments are evaluated in a function
call (6.5.2.2).

Tindakan yang dilakukan program bahasa C yang undefined ataupun unspecified pada standar C
Sebagai programmer, bukanlah hal yang baik untuk menggunakan konstruksi program yang behavior-nya undefined ataupun unspecified, program seperti itu tidaklah harus digunakan karena hasil keluaran atau output dapat memberikan hasil yang berbeda pada compiler yang berbeda.


Artikel ini didedikasikan kepada: Amalia Lutfiana, Aniza Alaziz, Choirul Niken Khasanah, Cicilia Anisa Vionita Eka Sari, dan Deano Mahardian Sahari.

22 komentar:

  1. Maksud dari standar bahasa C itu apa sih sebenernya?

    BalasHapus
    Balasan
    1. Standard C adalah dokumen yang digunakan untuk mengurangi variasi dari implementasi bahasa C antar kompilator yang berbeda. Merupakan dokumen teknis dan ditulis untuk implementasi kompilator. Programmer yang sudah berpengalaman sangat merekomendasikan untuk membaca dokumen standar tersebut, beserta standarisasi bahasa C yang sudah ditetapkan didalamnya. Terdapat beberapa jenis dokumen standar bahasa C, dengan aturan standar impementasinya disebut juga "standar C" atau "ISO C". Mematuhi aturan standar salah satu dokumen bukan berarti tidak bisa dilakukan penambahan implementasi dari standar lain.

      Beberapa contoh dokumen standar C:

      C89: Merupakan dokumen standar C pertama, dipublikasikan oleh American National Srandards Institute atau ANSI pada tahun 1989. Dapat dilakukan pemeriksaan juga terhadap kompilator pendukung dari ANSI C dengan memeriksa definisi dari _ANSI_ macro.

      C90: Standar C89 kemudian diadopsi oleh International Organitation fo Standardization (ISO) pada tahun 1990, yang kemudian dikenal dengan Standar C90.

      C95: Perluasan dari Standar C90 yang dipulikasikan pada tahun 1995. Pada standar ini dilakukan beberapa penambahan fitur seperti grafis dan pendukung multibyte. Juga dapat mendefinisikan macro _STDC_VERSION_ yang dapat diuji untuk mengukur versi dari ISO C pendukung kompilator saat ini.

      C99: Merupakan peningkatand dari Standar C95 seperti penambahan komentar satu baris C++ style, fungsi inline, dan penambahan lainnya dari header.

      C11: Dipublikasikan pada tahun 2011. Pada Standar ini dilakukan beberapa penambahan keyword seperti _Generic dan multi threading API. Juga dilakukan peningkatan pendukung Unicode.

      Hapus
  2. Jadi, standar C itu aslinya cuma dokumen yang dipake sebagai aturan standar untuk menulis atau membuat program dalam bahasa C, gitu

    BalasHapus
  3. Setiap bahasa pemrograman, itu adalah suatu kumpulan aturan sintak yang secara formal dapat dinyatakan sebagai suatu spefisikasi teknik. Namun berbeda dengan bahasa C, dalam sejarahnya aturan pengembangan bahasa C tersebut memiliki beragam gaya pembuatan sintak. Seiring dengan berjalannya waktu, lama kelamaan hal ini malah menimbulkan masalah besar karena kurangnya standarisasi yang menjadi dasar dari dialek bahasa yang ditak kompatibel. Selain itu, bahasa juga perlu ditingkatkan dengan penambahan beberap fitur bahasa baru beserta struktur sintaknya. Hal ini hanya dapat dicapai jika dilakukan pembaruan standar yang sudah ditetapkan, sehingga setiap vendor kompilator tahu bagaimana cara mengimplementasikan fitur-fitur tersebut. Inilah alasan kenapa dikembangkan suatu dokemen Standar C.

    BalasHapus
  4. Saat ini sebenarnya cuma ada satu Standar C, seperti yang dirujuk dalam ISO / IEC 9899:2018. Beberapa programmer ada yang memilih untuk tidak terikat pada aturan standar tersebut, jadi cukup ditulis kode program sesuai dengan target kompilator yang sedang populer. ISO menerbitkan standar C tersebut juga dengan meminta sedikit biaya publikasi.

    Latar belakang sejarah. Sebelum diterbitkannya suatu standar bahasa C seperti sekarang. Beberapa programmer masih ada tetap ada yang menggunakan ANSI C89 atau C99 ketika melakukan pembaruan target kode untuk kompilator tertentu dalam sistem operasi.

    BalasHapus
  5. Mengapa hasil yang diberikan pada setiap kompilator berbeda-beda?

    BalasHapus
    Balasan
    1. Bergandung pada standar bahasa c yang digunakan pada setiap kompilator.

      Hapus
  6. Bisa lebih dijelaskan mengenai konsep argc dan argv pada bahasa C?

    BalasHapus
    Balasan
    1. int main(int argc, char *argv[]) digunakan untuk argumen baris perintah dimana argc merupakan singkatan dari jumlah argumen dan argv vector argumen yang menunjuk pada alamat argumen yang dilewatkan, argc dan argv dapat berupa identifer valid apapun.

      Hapus
  7. Secara umum aturan apa yang harus diikuti untuk memecahkan kode program berikut jika pertanyaan yang ditanyakan dalam suatu tes muncul pertanyaan demikian?

    #include
    int main()
    {
    int i = 1;
    printf("%d %d %d\n", i++, i++, i);
    return 0;
    }

    Mohon Penjelasannya.

    BalasHapus
    Balasan
    1. 2 1 3 - menggunakan g++ 4.2.1 pada Linux.i686
      1 2 3 - menggunakan SunStudio C++ 5.9 pada Linux.i686
      2 1 3 - menggunakan g++ 4.2.1 pada SunOS.x86pc
      1 2 3 - menggunakan SunStudio C++ 5.9 pada SunOS.x86pc
      1 2 3 - menggunakan g++ 4.2.1 pada SunOS.sun4u
      1 2 3 - menggunakan SunStudio C++ 5.9 pada SunOS.sun4u

      they'll be impressed.

      Hapus
  8. Saya kurang paham kenapa output yang dihasilkan adalah 2 1 3?

    BalasHapus
    Balasan
    1. Karena program bekerja dengan ukuran eksekusi prioritas, secara umum kompilator bekerja untuk mengeksekusi program dari kanan ke kiri, namun jika kedua operator bernilai sama dan memiliki operator ++, -- yang sama, maka operator kemudian akan bekerja dari kanan ke kiri tetapi dengan memprioritaskan operator dengan prioritas lebih tinggi terlebih dahulu yaitu ++.

      #include
      int main()
      {
      int i = 1;
      printf("%d\n", i++);
      printf("%d\n", ++i);
      printf("%d\n", i++);
      printf("%d\n", i);
      printf("%d\n", i--);
      printf("%d\n", --i);
      printf("%d\n", i);
      i=i+5;
      printf("%d %d %d\n", i--, i++, ++i);
      printf("%d %d %d\n", i++, i++, i);
      printf("%d %d %d\n", i++, i, i++);
      printf("%d %d %d\n", i++, i++, i++);
      printf("%d %d %d\n", i, i++, i++);
      printf("%d %d %d\n", i--, i, i--);
      printf("%d %d %d\n", i--, i--, i);
      printf("%d %d %d\n", i, i--, i--);

      printf("%d\n", ++i);
      printf("%d\n", i++);
      return 0;
      }

      Hapus
    2. Karena argumen fungsi yang dievaluasi tidak ditentukan urutannya. Maka printf("%d %d %d", i++, i++ ,i); dapat mengikuti aturan urutan sebagai berikut, dimana i tengah pertama dievaluasi terlebih dahulu sehingga nilai tengah adalah 1, tetapi karena nilai i bertambah, yaitu, i=2, maka kode paling kiri berikutnya akan dievaluasi dan nilai 2 akan dicetak, dan selanjutnya bertambah menjadi 3, dan selanjutnya baris kode program yang paling kanan akan dicetak.

      Catatan: kompilator yang berbeda dapat mengikuti urutan apapun atau bahkan urutan acak untuk evaluasi argumen fungsi pada bahasa C.

      Hapus
  9. int i=1;
    printf("%d %d %d %d %d", i, ++i, i++,++i);
    Program tersebut memberikan saya hasil output: -4 4 2 4
    Ada yang bisa bantu jelaskan kenapa hasilnya demikian?

    BalasHapus
    Balasan
    1. Sesuai dengan standar bahasa C, urutan evaluasi argumen pada suatu fungsi tidak dapat ditentukan. Artinya argumen apapun dapat dipilih secara acak untuk dilakukan evaluasi. Juga, hal ini bergantung pada jenis kompilator yang digunakan.

      Karena bahasa program yang digunakan adalah bahasa C, maka harus dihindari penggunaan konstruksi pemrograman yang perilakunya tidak dapat ditentukan atau tidak dapat diprediksi, program semacam ini harus selalu dihindari penggunannya karena hasil output yang muncul dapat berbeda jika menggunakan jenis kompilator yang berbeda pula.

      Untuk contoh program tersebut selain menggunakan kompilator gcc menurut saya hasil yang akan dikeluarkan adalah 2 1 3.

      Hapus
  10. Apa perbedaan antara while loop dan do while loop pada bahasa C?

    BalasHapus
    Balasan
    1. Pada bahasa C while loop, kondisi diperiksa terlebih dahulu dan loop kemudian dieksekusi. Sedangkan pada do while loop, proses loop dieksekusi terlebih dahulu kemudian kondisi while diperiksa.

      Hapus
  11. Ada yang bisa bantu saya untuk memahami materi pada artikel ini....

    BalasHapus
    Balasan
    1. Pada artikel ini dijelaskan beberapa standar pada bahasa C, atau lebih tepatnya beberapa aturan. Dari aturan standar tersebut, beberapa kompilator kemudian mengikuti aturan atau perintah eksekusi suatu program, namun pada beberapa kompilator lain ternyata aturan tersebut tidak benar-benar diikuti sehingga hasil yang ditampilkan berbeda seperti yang dijelaskan pada contoh.

      Kesimpulan, hasil atau output yang akan ditampilkan dapat berbeda-beda sesuai dengan jenis kompilator yang digunakan. trima kasih.

      Hapus

Hubungi admin melalui Wa : +62-896-2514-6106

Respon komentar 7 x 24 jam, mohon bersabar jika komentar tidak langsung dipublikasi atau mendapatkan balasan secara langsung.

Bantu admin meningkatkan kualitas blog dengan melaporkan berbagai permasalahan seperti typo, link bermasalah, dan lain sebagainya melalui kolom komentar.

- Ikatlah Ilmu dengan Memostingkannya -
- Big things start from small things -