Software Slicing

Program slicing adalah teknik analisis program untuk menyederhanakan program dengan cara memfokuskan pada aspek tertentu yang dipilih dari semantik. Sepanjang proses slicing, akan dilakukan penghapusan beberapa bagian dalam program yang sudah diketahui tidak akan berdampak pada semantik yang diinginkan. Slicing dapat diaplikasikan pada beberapa aspek seperti testing dan debugging, re-engineering, pemahaman suatu program, dan software measurement.

Sebagai contoh, dalam debugging, fokus seorang debugger pada saat menganalisis tentunya hanya pada bagian – bagian dari program yang mungkin mengandung kesalahan dan bisa menyebabkan bug, bukan pada bagian – bagian yang sudah pasti benar dan tidak mungkin muncul bug dari bagian itu, disini Program Slicing berperan dengan menghilangkan bagian – bagian yang sudah pasti benar tersebut. Contoh teknisnya, adalah ketika seorang programmer meng-klik salah satu statement yang perlu untuk diperhatikan, contohnya karena nilai variabel yang salah, program slicer (tool untuk melakukan program slicing) akan menandai (highlight) semua statement dalam program yang mungkin menyebabkan nilai yang salah tersebut dalam bentuk hubungan antar entity dalam program seperti definisi variabel dan penggunaannya akan divisualisasikan

Kegunaan

Kegunaan utama dari program slicing, senada dengan ide pembuatan konsep ini, yaitu untuk membuat program sesederhana mungkin yang tetap menjaga tujuan / fungsi program tersebut dibuat dengan memperhatikan kriteria slicing-nya. Selain kegunaan utama tersebut, banyak kegunaan lain dari program slicing, dan dapat dibagi menurut penggunaannya, seperti debugging, pengukuran tingkat kohesi, pemahaman suatu program, maintenance dan re-engineering, restrukturisasi program, diferensiasi program, testing, spesialisasi program dan penggunaannya kembali, dan validasi keamanan

  • Dapat membantu programmer menemukan lokasi kesalahan dalam program saat proses debugging. Idenya adalah hasil potongan program akan berisi line – line yang salah saja dan bukan yang lain
  • Dapat membantu programmer menemukan variabel – variabel yang saling terkait pada fungsi – fungsi yang berbeda dengan melihat tugas suatu fungsi dari sisi komputasinya terhadap suatu variabel, jika banyak fungsi yang ketika menjalankan tugasnya, variabel – variabel didalamnya banyak yg terkait, maka dapat disimpulkan bahwa tingkat kohesi dalam program tersebut cukup tinggi
  • Dapat membantu programmer memahami code yang kompleks, contohnya adalah backward slice pada suatu line tertentu dalam code, programmer dapat mengetahui semua bagian dari code diatasnya yang mempengaruhi line tersebut, dan sebaliknya pada forward slicing, programmer dapat mengetahui bagian code mana saja yang akan ikut berubah jika suatu line dalam code diubah
  • Ketika proses maintenance, re-engineering pasti akan banyak ditemukan pada beberapa kasus, metode conditioned slicing dapat digunakan untuk meng-extract code sesuai dengan kondisi yang diinginkan. Idenya adalah mengisolasi beberap fungsionalitas sehingga dapat dipisahkan dan digunakan kembali
  • Slicing dapat mengisolasi “computational thread” yang membantu dalam mengidentifikasi komponen logika, contohnya adalah jika dalam suatu program yang bertujuan untuk menghitung jumlah karakter dan baris pada suatu tulisan, ketika di-slice maka akan ada dua thread yang dihasilkan dan dapat dibuat sebagai program terpisah, dan itu berarti merubah struktur program
  • Slicing juga dapat dipakai sebagai diferensiasi program karena hasil slice dapat dibandingkan untuk mengidentifikasi perubahan secara semantik, bukan hanya textual, atau syntactic
  • Slicing juga dapat digunakan untuk testing suatu program, dengan metode yang hampir sama seperti forward dan backward slicing, ketika kita ingin mengetahui apakah suatu aspek dalam program sudah benar atau belum, kita bisa melihat semua kaitannya dengan bagian lain
  • Hasil slicing berupa slice yang dapat dieksekusi (executable) dapat dianggap sebagai program yang terspesialisasi, dan juga slice tersebut dapat dimanfaatkan untuk proses reuse yang lebih efisien daripada me-reuse semua bagian pada program, lebih baik hanya me-reuse yang perlu saja, yg sudah diidentifikasi perlu di-reuse
  • Slicing membantu proses inspeksi untuk validasi software – software yang menitikberatkan pada aspek keamanannya, karena setiap aliran data benar – benar diperhatikan
  • Static Slicing

Mekanisme kerja

Adalah bentuk paling sederhana dari teknik slicing. Karena itu, bentuk – bentuk lainnya dapat dikatakan sebagai perkembangan dari static slicing.

Slice disusun dengan cara menghapus bagian – bagian program yang tidak berhubungan dengan nilai yang disimpan di beberapa set variabel yang dipilih pada titik tertentu. Dan titik tersebut, biasanya diidentifikasi dengan menandai program pada line tertentu yang mengandung tiap statement primitif dan tiap node cabang

Titik tersebut juga akan ditandai dengan menambahkan comment pada program. Umumnya, slice disusun oleh sekumpulan variabel, tapi ada juga yang disusun oleh satu variabel saja. Gambarannya seperti ini, jika ada variabel “v” dan jumlah titik “n”, sebuah slice akan disusun untuk v sejumlah n. Tapi, hal ini tidak mengikat, karena slice dari sekumpulan variabel V dapat dibentuk dari sekumpulan slice pada tiap variabel yang ada di variabel tersebut

Setelah kita memilih kriteria untuk slicing, kita dapat memilih untuk membuat salah satu dari dua macam metode : backward atau forward slice. Backward slice mengandung statement dari program yang dapat mempengaruhi kriteria slicing yang dipilih, sebaliknya forward slice mengandung statement – statement dari program yang dipengaruhi oleh kriteria slicing yang dipilih.

Berikut adalah contoh dari backward slicing :

<br>void main() {<br>    int i = 1;     int sum = 0;<br>    while (i&lt;11) {<br>        sum = add(sum, i);<br>        i = add(i, 1);<br>    }<br>    printf("sum = %d\n", sum);<br>    printf("i = %d\n", i);<br>}<br>static int add(int a, int b)<br>{<br>    return(a+b);<br>}<br>

Figure 1. Backward slice pada titik printf(“i = %d\n”, i); dimana semua statement yang mempengaruhi output dari variabel i ditandai

Berikut adalah contoh dari forward slicing :

<br>void main() {<br>    int i = 1;     int sum = 0;<br>    while (i&lt;11) {<br>        sum = add(sum, i);<br>        i = add(i, 1);<br>    }<br>    printf("sum = %d\n", sum);<br>    printf("i = %d\n", i);<br>}<br>static int add(int a, int b)<br>{<br>    return(a+b);<br>}<br>

Figure 2. Forward slice dari sum = 0; dimana semua statement yang dipengaruhi dari inisialisasi variabel sum akan ditandai

 

  • Dynamic Slicing

Ketika kita men-debug suatu program, biasanya kita akan mengeksekusi program tersebut, dan mungkin menemukan bahwa ada outputnya yang kurang tepat, atau memunculkan nilai yang tidak mungkin, dan hal ini dikarenakan oleh suatu bug. Ide awal dari dynamic slicing adalah ketika kita membutuhkan teknik slicing untuk menemukan penyebab suatu bug pada program, daripada menggunakan static slicing, akan lebih baik untuk membuat slice yang menggunakan informasi yang tersedia mengenai inputnya yang dapat menyebabkan muncul bug pada program itu. Jadi, kenapa disebut dynamic, karena didasari dari kriteria teknik static slicing bersamaan dengan informasi yang dinamis

Contohnya adalah seperti ini, kita akan menyusun slice yang dinamis yang berkaitan dengan 3 informasi. Dua dari informasi ini adalah variabel yang nilainya salah dan jadi titik penting di program (sama seperti konsep static slicing). Tapi informasi ketiga adalah urutan input yang diberikan ketika program dieksekusi. Secara kolektif, informasi ini disebut kriteria dynamic slicing. Dapat disebut juga kita menyusun slice dinamis untuk variabel v, pada titik n dan input i. Contohnya, i dedifinisikan sebagai <1,4,6> yang berarti bahwa, input pertama yang akan diproses dalam program adalah 1, lalu 4, dan terakhir 6.

Lebih jauh, pada kasus lain, ketika kita memiliki sejumlah test case, yang semuanya dapat menyebabkan kesalahan, kita harus memanfaatkan tool slicing untuk menentukan kapan penggunaan dynamic slicing dipakai. Berikut adalah contohnya :

read (n)

for I := 1 to n do
a := 2

if c1 then
if c2 then
a := 4

else
a := 6
z := a

write (z)
Input n is 1; c1, c2 both true
Criterion<n=1, c1=true,
c2=true; 101; z>

Metode/teknik yg sudah ada

  • Conditioned Slicing

Jika kita sebelumnya berbicara mengenai static dan dynamic slicing yang sangat berbeda dilihat dari penggunaan input program sebagai kriteria, maka teknik conditioned slicing berusaha untuk menjembatani perbedaan diantara kedua teknik tersebut.

Conditioned slicing didasari oleh conditioned approach, karena slice yang dihasilkan dikondisikan oleh pengetahuan mengenai kondisi dimana program akan dieksekusi. Conditioned slicing hanya mengurusi masalah – masalah yang dihadapi oleh orang – orang yang bertugas me-maintain program ketika harus memahami sebuah sistem legacy yang kompleks. Kadang – kadang, muncul pertanyaan seperti, “kita tahu bahwa x lebih besar dari y dan z nilainya 4, lalu statement mana yang akan mempengaruhi nilai variabel v pada line 38 di program”. Dengan menggunakan conditioned slicing, kita bisa tahu jawabannya. Sebuah slice akan dibuat untuk v, di line 38, pada x>y && z==4. Dengan menyusun kolase dari slice yang terkondisikan yang mengisolasikan aspek – aspek berbeda dari kebiasaan program, kita bisa dengan cepat mendapatkan gambaran bagaimana program bereaksi terhadap berbagai macam kondisi. Conditioned slicing benar – benar adalah bentuk tool-assisted dari pendekatan yang familiar terhadap pemahaman program dari sisi divide and conquer

  • Amorphous Slicing

Semua teknik slicing yang telah dibahas sebelumnya bersifat menjaga sintaks aslinya. Itu karena teknik – teknik tersebut disusun berdasarkan perubahan program melalui penghapusan statement. Statement yang berada di slice adalah subset syntatic dari program aslinya. Berbeda jauh dengan amorphous slice yang disusun dari berbagai macam bentuk transformasi program yang menyederhanakan program dan menjaga tujuan dibuatnya program dengan tetap memperhatikan kriteria slicing

Kebebasan syntatic ini membuat amorphous slicing dapat melakukan penyederhanaan yang lebih hebat dengan hasil amorphous slices yang ukurannya tidak pernah lebih besar dari teknik – teknik lain yang digunakan, biasanya lebih kecil

Amorphous slicing membuat slicing tool dapat mengekstrak semantik dari hal – hal yang penting, membantu pemahaman program, analisis, dan penggunaan kembali (reuse)

Contoh penggunaan

Banyak sekali contoh penggunaan teknik slicing, seperti yang sudah disebutkan sebelumnya, yaitu untuk memahami sebuah program, debugging , testing, parallelization, re-engineering, maintenance, program specialization and reuse, safety / security validation, cohesion measurement.

Tinggalkan Jejak

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s