[ HTML ] [ Java ] [ Bahasa C ]


Minggu, Mei 02, 2021

Pemahaman Volatile Tahap 1 pada Bahasa C

Pada level lebih tinggi, kompilator mengkonversi bahasa C menjadi bahasa kode sehingga program eksekusi yang dapat dijalankan tanpa kode program sesungguhnya. Sama dengan teknologi interpreter lainnya, teknologi kompilator juga telah mengalami perkembangan dalam hal konversi bahasa C. Ketika mengartikan sumber kode menjadi bahasa mesin, kompilator pada dasarnya mencoba melakukan optimisasi output sehingga kebutuhan bahasa mesin mejadi lebih sedikit untuk dieksekusi pada tahap akhir. Salah satu bentuk optimisasi yang dilakukan kompilator tersebut adalah menghilangkan bahasa mesin yang tidak perlu untuk mengakses variabel yang tidak berubah dari sudut pandang kompilator. Perhatikan potongan kode program berikut ini:

uint32 status = 0;

while (status == 0)
{
/* Diasumsikan bahwa status tersebut tidak akan berubah pada saat looping ataupun selama program dijalankan */

/* Selama nilai status adalah NOL, lakukan looping */
}

Pada proses tersebut kompilator melakukan optimisasi dalam memperlihatkan status yang tidak berubah pada saat loop. Sehingga tidak diperlukan akses status lagi dan lagi setiap kali melakukan iterasi dari pengulangan. Kompilator dapat mengkonversi perulangan menjadi infinite loop sehingga tidak perlu dilakukan proses pembacaan bahasa mesin. Catatan, bahwa kompilator tidak menyadari status khusus variabel yang dapat diubah dari luar program saat ini pada waktu apapun atau IO operasi terjadi pada perangkat peripheral untuk perangkat port IO yang telah dipetakan pada variabel. Pada kenyataannya, kompilator diharapkan untuk dapat mengakses status variabel setelah semua iterasi selesai, meskipun tidak dilakukan modifikasi ataupun perubahan pada program yang telah dikompilasi oleh kompilator tersebut.

Ketika ada pendapat yang mengatakan bahwa optimisasi kompilator dapat di turn-off untuk program, namun demikian hal tersebut belum tentu dapat dilakukan secara nyata karena beberapa hal berikut ini:

satu, Setiap implementasi kompilator berbeda sehingga bukan merupakan solusi yang portabel untuk dapat melaksanakan hal tersebut.
dua, Hanya karena satu variabel, bukan berarti harus mematikan semua proses optimisasi yang dilakukan oleh kompilator pada keseluruhan program.
tiga, Dengan mematikan semua proses optimisasi, program low level tidak dapat bekerja seperti yang diharapkan karena akan meningkatkan terlalu banyak ukuran dan penundaan eksekusi.

Untuk mengatasi permasalah tersebut, maka solusi yang dapat digunakan adalah menggunakan volatile.
Penggunaan "volatile", pada dasarnya, dibutuhkan untuk instruksi kompilator yang statusnya variabel khusus sehingga proses optimisasi tidak bisa dilakukan pada variabel tersebut. Untuk itu, akan didefinisikan jenis variabel seperti berikut ini:

volatile uint32 status = 0;

Untuk penyederhanaan penjelasan, disajikan contoh seperti yang diperlihatkan sebelumnya. Namun, secara umum penggunaan volatile adalah dengan pointer seperti berikut ini:

volatile uint32 * statusPtr = 0xF1230000

Berikut ini statusPtr melakukan pointer ke lokasi memori pada konten yang dapat berubah pada waktu tertentu dari beberapa perangkat peripheral. Perlu dicatat bahwa program yang dibuat mungkin tidak memiliki kontrol apapun atau pengetahuan apapun ketika memori mengalami perubahan, sehingga tujuan dari penggunaan "volatile" adalah agar kompilator tidak melakukan optimisasi untuk variabel volatile yang ditunjuk (pointer) oleh statusPtr tersebut.

Dalam hal ini "volatile" mengikuti standar dari ISO/IEC 9899 C11 - clause 6.7.3

“An object that has volatile-qualified type may be modified in ways unknown to the implementation or have other unknown side effects.”

“A volatile declaration may be used to describe an object corresponding to a memory-mapped input/output port or an object accessed by an asynchronously interrupting function. Actions on objects so declared shall not be ‘‘optimized out’’ by an implementation or reordered except as permitted by the rules for evaluating expressions.”

Pada standar C variabel "volatile" dapat diubah dari luar program dan karena hal inilah kompilator tidak seharusnya mengoptimisasi aksesnya. Sehingga dapat diperkirakan bahwa ketika memiliki banyak variabel "volatile" dalam suatu program maka dapat mengurangi beban optimisasi yang dilakukan kompilator.

5 komentar:

  1. Apa fungsi keyword volatile pada bahasa C?

    BalasHapus
    Balasan
    1. Keyword atau kata kunci volatile pada bahasa C adalah suatu kualifikasi yang diterapkan ke suatu variabel tertentu ketika variabel tersebut dideklarasikan. Dengan menggunakan keyword volatile tersebut maka kompilator dapat mengetahui bahwa nilai variabel tersebut dapat berubah kapan saja tanpa tindakan apapun yang diambil oleh kode program yang ditemukan kompilator selama proses kompilasi.

      Hapus
  2. Keyword volatile dapat diubah dari luar kode program yang dikompilasi oleh kompilator. Contoh, sebuah program dapat memetakan variabel volatile ke register yang dipetakan oleh memori, dimana dalam hal ini kompilator tidak akan menerapkan optimisasi apapun ke dalam kode program yang menangani variabel volatile tersebut.

    BalasHapus
  3. Kapan keyword volatile dapat digunakan?

    BalasHapus
    Balasan
    1. Keyword volatile dapat digunakan ketika ingin mencegah kompilator untuk menerapkan suatu optimisasi apapun pada objek yang dapat berubah dengan cara yang tidak dapat ditentukan atau diprediksi oleh kompilator. Dimana objek yang dideklarasikan sebagai volatile tersebut akan dihilangkan dari proses optimisasi karena nilainya dapat diubah oleh kode program diluar dari cakupan kode program itu sendiri dan kapan saja.

      Hapus

Respon komentar 7 x 24 jam, so please be patient :D