Pinned

Volatile Bahasa C dan Fungsinya Tahap 2

Keyword volatile dimaksudkan untuk mencegah kompilator melakukan optimisasi pada object yang dapat mengubah proses yang tidak dapat ditentukan oleh kompilator.

Pemahaman Volatile Tahap 2 pada Bahasa C
Ilustrasi Volatile Tahap 2 Bahasa C

Sebelum memahami lebih dalam materi tentang Volatile Bahasa C dan Fungsinya Tahap 2, terlebih dahulu pelajari materi tentang: Volatile Bahasa C dan Fungsinya Tahap 1 [klik], Nilai Default Variabel Static Bahasa C dan Fungsinya [klik], dan Variabel Static Bahasa C dan Fungsinya [klik].

Deklarasi object sebagai volatile dihilangkan dari optimisasi karena nilainya dapat diubah oleh kode luar program dari kode program saat ini. Sistem selalu membaca nilai saat ini dari object volatile dari lokasi memori ketimbang mempertahankannya dalam register sementara pada titik dimana hal tersebut digunakan, meskipun isntruksi sebelumnya diminta untuk nilai dari object yang sama. Jadi pertanyaan sederhanyanya adalah, apakah nilai dari perubahan variabel yang sedemikian rupa tidak dapat diperkirakan oleh compiler. Perhatikan contoh kasus berikut ini untuk menjawab pertanyaan tersebut.
  • Variabel global dimodifikasi oleh pelayanan rutinitas interrupt dari luar scope: contoh, sebuah variabel global dapat merepresentasikan sebuah port data, biasanya berupa pointer global seperti pemetaan memori OP yang dilakukan pembaruan secara dinamis. Data yang membaca port kode harus dideklarasikan sebagai volatile dengan tujuan untuk mengambil data terakhir yang tersedia pada port. Jika mengalami kegagalan dalam pendeklarasian variabel volatile, maka kompilator akan mengomptimisasi kode program sedemikian rupa yang akan membaca port sekali saja dan menjaganya dengan menggunakan nilai yang sama pada register sementara untuk meningkatkan kecepatan program (speed optimization). Secara umum, ISR digunakan untuk melakukan pembaruan data port ketika terdapat interrupt terhadap ketersediaan data baru.
  • Penerapan variabel global dengan multi-threaded: Terdapat banyak cara untuk melakukan threads communicationvizmessage passingshared memorymail boxes, dan lain sebagainya. Sebuah variabel global adalah bentuk form sederhana untuk berbagi memori. Ketika dua threads berbagi informasi melalui variabel global, maka dibutuhkan kualifikasi dengan volatile. Ketika threads beroperasi secara sinkron, maka setiap pembaruan dari variabel global pada setiap threads harus ditambah oleh threads yang lebih baru. Kompilator akan membaca variabel global dan menempatkannya pada variabel sementara dari konteks threads saat ini. Untuk mengubahnya dalam bentuk null terhadap dampak dari optimisasi kompilator, seperti variabel global, maka harus dinyatakan dalam bentuk volatile.

Ketika tidak digunakan qualifier volatile, maka akan muncul beberapa bentuk masalah berikut:
  • Kode program mungkin tidak pekerja sesuai perkiraan ketika optimisasi diaktifkan.
  • Kode program tidak bekerja sesuai perkiraan ketika interrupt enabled dan berfungsi.

Perhatikan contoh program berikut untuk memahami bagaimana kompilator menginterpretasikan (interpreterkeyword volatile. Pada contoh berikut nilai dari object const dibuat nilainya menggunakan pointer dan dilakukan kompilasi kode tanpa pilihan optimisasi. Maka kompilator tidak akan melakukan proses optimisasi apapun yang akan mengubah nilai dari object const.


Contoh:

// Proses kompilasi program

// tanpa menggunakan optimi

// sasi oleh kompilator

#include <stdio.h>

 

int main(void)

{

const int local = 10;

int *ptr = (int*) &local;

 

printf("Inisialisasi nilai"

" variabel lokal : %d \n", local);

 

*ptr = 100;

 

printf("Modifikasi nilai "

"variabel lokal: %d \n", local);

 

return 0;

}


Ketika dilakukan kompilasi kode program dengan "-save-tempsoption dari gcc, maka akan dilakukan generate tiga output file:
  • Preprosesing kode program, yang menghasilkan ekstensi .i
  • Assembly kode program, yang akan menghasilkan ekstensi .s
  • Object code, yang akan menghasilkan ekstensi .0

Kode program dikompilasi tanpa melakukan tahap optimisasi, sehingga ukuran dari kode assembly yang dihasilkan akan menjadi lebih besar.

Output:
[narendra@ubuntu]$ gcc volatile.c -o volatile –save-temps
[narendra@ubuntu]$ ./volatile
Inisialisasi nilai variabel lokal : 10
Modifikasi nilai variabel lokal: 100
[narendra@ubuntu]$ ls -l volatile.s
-rw-r–r– 1 narendra narendra 731 2016-11-19 16:19 volatile.s
[narendra@ubuntu]$

Selanjutnya, lakukan kompilasi program dengan pilihan optimisasi. Pada code thr berikut ini, "local" dideklarasikan sebagai const (dan non-volatile), GCC kompilator melakukan optimisasi dan mengabaikan perintah untuk mengubah nilai dari object const. Dengan hasil nilai dari object const adalah sama.

Contoh:

// Kompilasi kode program de

// ngan tahapan optimisasi

#include <stdio.h>

 

int main(void)

{

const int local = 10;

int *ptr = (int*) &local;

 

printf("Inisialisasi nilai dari"

" variabel lokal : %d \n", local);

 

*ptr = 100;

 

printf("Modifikasi nilai dari var"

"iabel lokal: %d \n", local);

 

return 0;

}


Pada contoh sebelumnya, program melakukan optimisasi sehingga ukuran dari assembly code menjadi lebih kecil.

Output:
[narendra@ubuntu]$ gcc -O3 volatile.c -o volatile –save-temps
[narendra@ubuntu]$ ./volatile
Inisialisasi nilai dari variabel lokal : 10
Modifikasi nilai dari variabel lokal: 10
[narendra@ubuntu]$ ls -l volatile.s
-rw-r–r– 1 narendra narendra 626 2016-11-19 16:21 volatile.s

Selanjutnya dideklarasikan object const sebagai volatile dan kompilasi kode program dengan pilihan optimisasi. Meskipun dilakukan kompilasi kode program dengan pilihan optimisasi, nilai dari object const akan diubah, karena variabel dideklarasi sebagai volatile artinya adalah tidak melakukan optimisasi apapun pada program.

Contoh:

// Kompilasi kode program 

// dengan tahapan optimisaasi

#include <stdio.h>

 

int main(void)

{

const volatile int local = 10;

int *ptr = (int*) &local;

 

printf("Inisialisasi nilai var"

"iabel lokal: %d \n", local);

 

*ptr = 100;

 

printf("Modifikasi nilai var"

"iabel lokal: %d \n", local);

 

return 0;

}

Output:
[narendra@ubuntu]$ gcc -O3 volatile.c -o volatile –save-temp
[narendra@ubuntu]$ ./volatile
Inisialisasi nilai variabel lokal: 10
Modifikasi nilai variabel lokal: 100
[narendra@ubuntu]$ ls -l volatile.s
-rw-r–r– 1 narendra narendra 711 2016-11-19 16:22 volatile.s
[narendra@ubuntu]$

Catatan: Beberapa contoh program yang diberikan sebelumnya mungkin hanya bekerja pada beberapa compiler khusus, dimana tujuan dari penggunaan contoh program tersebut adalah untuk dapat memahami tujuan dari konsep volatile.

5 komentar:

  1. Secara umum, apa fungsi dari keyword volatile pada bahasa pemrograman?

    BalasHapus
    Balasan
    1. Dalam bahasa pemrograman komputer, khususnya dalam bahasa pemrograman C, C++, C£, dan Java, keyword atau kata kunci volatile digunakan untuk menunjukkan bahwa nilai variabel dapat berubah diantara akses program yang berbeda, meskipun kode program dari nilai variabel tersebut tidak dimodifikasi.

      Hapus
  2. Apa fungsi dari keywor volatile secara sederhana?

    BalasHapus
    Balasan
    1. Keyword volatile digunakan untuk mengubah nilai variabel dengan suatu thread yang berbeda. Dimana hal ini juga digunakan untuk membuat thread secara aman atau terlindungi. Dengan keyword volatile tersebut maka beberapa thread dapat menggunakan beberapa method atau fungsi dan instance kelas secara bersamaan tanpa muncul permasalahan atau pesan error apapun. Keyword volatile dapat digunakan baik pada tipe data objek ataupun tiped ataupun primitif.

      Hapus
    2. entahlah, sepertinya masih belum sederhana

      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 come from small things -