MANAJEMEN PROYEK PERANGKAT LUNAK
3.9 ILMU PERANGKAT LUNAK HALSTEAD—TEKNIK ANALITIS
Ilmu perangkat lunak Halstead adalah teknik analisis untuk mengukur ukuran, upaya pengembangan, dan biaya pengembangan produk perangkat lunak. Halstead menggunakan beberapa parameter program primitif untuk mengembangkan ekspresi untuk semua panjang program, volume minimum potensial, volume aktual, tingkat bahasa, upaya, dan waktu pengembangan. Untuk program tertentu, biarkan:
• h1 adalah jumlah operator unik yang digunakan dalam program,
• h2 adalah jumlah operan unik yang digunakan dalam program,
• N1 adalah jumlah total operator yang digunakan dalam program,
• N2 menjadi jumlah total operand yang digunakan dalam program.
Meskipun istilah operator dan operan memiliki arti intuitif, definisi yang tepat dari istilah ini diperlukan untuk menghindari ambiguitas. Namun, sayangnya kita tidak akan dapat memberikan definisi yang tepat dari kedua istilah tersebut. Tidak ada kesepakatan umum di antara para peneliti tentang cara yang paling berarti untuk mendefinisikan operator dan operan untuk bahasa pemrograman yang berbeda. Namun, beberapa panduan umum mengenai identifikasi operator dan operan untuk bahasa pemrograman apa pun dapat disediakan. Misalnya, penugasan, aritmatika, dan operator logika biasanya dihitung sebagai operator. Sepasang kurung, serta blok awal —pasangan akhir blok, dianggap sebagai operator tunggal. Label dianggap sebagai operator, jika digunakan sebagai target pernyataan GOTO.
Konstruksi if ... then ... else ... endif dan while ... do dianggap sebagai operator tunggal.
Operator urutan (penghentian pernyataan) ';' dianggap sebagai operator tunggal. Deklarasi subrutin dan deklarasi variabel terdiri dari operand. Nama fungsi dalam pernyataan pemanggilan fungsi dianggap sebagai operator, dan argumen pemanggilan fungsi dianggap sebagai operan. Namun, daftar parameter fungsi dalam pernyataan deklarasi fungsi tidak dianggap sebagai operan. Dibawah ini saya cantumkan himpunan operator dan operan untuk bahasa ANSIC. Namun, harus disadari bahwa ada ketidaksepakatan yang cukup besar di antara berbagai peneliti dalam hal ini.
Operator dan Operan untuk bahasa ANSI C
Berikut ini adalah daftar operator yang disarankan untuk bahasa ANSI C:
( [ . , -> * + - ~ ! ++ -- * / % + - << >> < > <= >= != == & ^ | && || = *= /= %= += -= <<=
>>= &= ^= |= : ? { ; CASE DEFAULT IF ELSE SWITCH WHILE DO FOR GOTO CONTINUE BREAK RETURN and a function name in a function call
Operand adalah variabel dan konstanta yang digunakan dengan operator dalam ekspresi. Perhatikan bahwa nama variabel yang muncul dalam deklarasi tidak dianggap sebagai operan.
Contoh 3.3 Perhatikan ekspresi a = &b; a, b adalah operand dan =, & adalah operator.
Contoh 3.4 Nama fungsi dalam definisi fungsi tidak dihitung sebagai operator.
int func ( int a, int b ) {
. . . }
Untuk kode contoh di atas, operatornya adalah: {}, ( ) Saya tidak menganggap fungsi c, a, dan b sebagai operan, karena ini adalah bagian dari definisi fungsi.
Contoh 3.5 Perhatikan pernyataan pemanggilan fungsi: func (a, b);. Dalam hal ini, fungsi ' ,' a n d ; dianggap sebagai operator dan variabel a, b diperlakukan sebagai operan.
Panjang dan Kosakata
Panjang program seperti yang didefinisikan oleh Halstead, mengkuantifikasi penggunaan total semua operator dan operan dalam program. Jadi, panjang N = N1 + N2. Definisi Halstead tentang panjang program sebagai jumlah total operator dan operan secara kasar setuju dengan gagasan intuitif tentang panjang program sebagai jumlah total token yang digunakan dalam program. osakata program adalah jumlah operator dan operan unik yang digunakan dalam program. Jadi, kosakata program h = h1 + h2.
Volume Program
Panjang program (yaitu, jumlah total operator dan operan yang digunakan dalam kode) tergantung pada pilihan operator dan operan yang digunakan. Dengan kata lain, untuk masalah pemrograman yang sama, panjangnya akan tergantung pada gaya pemrograman.
Jenis ketergantungan ini akan menghasilkan ukuran panjang yang berbeda untuk masalah yang pada dasarnya sama ketika bahasa pemrograman yang berbeda digunakan. Jadi, saat menyatakan ukuran program, bahasa pemrograman yang digunakan harus dipertimbangkan:
V = N log2 h
Mari kita coba memahami ide penting di balik ungkapan ini. Secara intuitif, volume program V adalah jumlah bit minimum yang diperlukan untuk mengkodekan program.
Sebenarnya, untuk mewakili h pengidentifikasi yang berbeda secara unik, kita membutuhkan setidaknya log2 h bit (di mana h adalah kosakata program). Dalam skema ini, kita membutuhkan N log2 h bit untuk menyimpan program dengan panjang N. Oleh karena itu, volume V mewakili ukuran program dengan kira-kira mengkompensasi efek dari bahasa pemrograman yang digunakan.
Potensi Volume Minimum
Volume minimum potensial V* didefinisikan sebagai volume program yang paling ringkas di mana suatu masalah dapat dikodekan. Volume minimum diperoleh ketika program dapat diekspresikan menggunakan instruksi kode sumber tunggal, misalnya pemanggilan fungsi seperti foo();. Dengan kata lain, volume terikat dari bawah karena fakta bahwa sebuah program akan memiliki setidaknya dua operator dan tidak kurang dari jumlah operan yang diperlukan. Perhatikan bahwa operan adalah item data input dan output. Jadi, jika suatu algoritma beroperasi pada data input dan output d1, d2, ... dn, program yang paling ringkas adalah f(d1, d2, ..., dn); dimana, h1= 2, h2 = n. Oleh karena itu, V* = (2 + h2) log2 (2 + h2). Tingkat program L diberikan oleh L = V*/V. Konsep tingkat program L telah diperkenalkan dalam upaya
untuk mengukur tingkat abstraksi yang disediakan oleh bahasa pemrograman. Dengan menggunakan definisi ini, bahasa dapat diurutkan ke dalam level yang jug a tampak benar secara intuitif.
Hasil di atas menyiratkan bahwa semakin tinggi level suatu bahasa, semakin sedikit upaya yang diperlukan untuk mengembangkan program menggunakan bahasa tersebut. Hasil ini sesuai dengan gagasan intuitif bahwa dibutuhkan lebih banyak upaya untuk mengembangkan program dalam bahasa rakitan daripada mengembangkan program dalam bahasa tingkat tinggi untuk memecahkan masalah.
Usaha dan Waktu
Upaya yang diperlukan untuk mengembangkan program dapat diperoleh dengan membagi volume program dengan tingkat bahasa pemrograman yang digunakan untuk mengembangkan kode. Jadi, usaha E = V /L, di mana E adalah jumlah diskriminasi mental yang diperlukan untuk melaksanakan program dan juga usaha yang diperlukan untuk membaca dan memahami program. Dengan demikian, upaya pemrograman E = V2/V* (karena L = V*/V) bervariasi sebagai kuadrat volume. Pengalaman menunjukkan bahwa E berkorelasi baik dengan upaya yang diperlukan untuk pemeliharaan program yang ada. Waktu programmer T
= E/S, di mana S adalah kecepatan diskriminasi mental. Nilai S telah dikembangkan secara empiris dari penalaran psikologis, dan nilai yang direkomendasikan untuk aplikasi pemrograman adalah 18.
Estimasi Panjang
Meskipun panjang program dapat ditemukan dengan menghitung jumlah total operator dan operan dalam suatu program, Halstead menyarankan cara untuk menentukan panjang program dengan menggunakan jumlah operator dan operan unik yang digunakan dalam program. Dengan menggunakan metode ini, parameter program seperti panjang, volume, biaya, usaha, dll., dapat ditentukan bahkan sebelum dimulainya aktivitas pemrograman apa pun. Metodenya diringkas di bawah ini. Halstead berasumsi bahwa sangat tidak mungkin bahwa suatu program memiliki beberapa bagian yang identik—dalam terminologi bahasa formal, substring identik—dengan panjang lebih besar dari h(h menjadi kosakata program). Faktanya, begitu sepotong kode muncul secara identik di beberapa tempat, biasanya dibuat menjadi prosedur atau fungsi. Dengan demikian, kita dapat dengan aman mengasumsikan bahwa setiap program dengan panjang N terdiri dari N/h string unik dengan panjang h. Sekarang, merupakan hasil kombinatorial standar bahwa untuk sembarang alfabet dengan ukuran K, terdapat tepat Kr string yang berbeda dengan panjang r. Dengan demikian,
𝑁 𝜂 ≤ 𝜂𝜂 Atau
𝑁 ≤ 𝜂𝜂 +1
Karena operator dan operan biasanya bergantian dalam suatu program, kita dapat menyempurnakan batas atas lebih lanjut menjadi N hh1h1 h2h3. Selain itu, N harus mencakup tidak hanya himpunan elemen N yang terurut, tetapi juga harus mencakup semua kemungkinan subset dari himpunan terurut tersebut, yaitu himpunan daya dari N string (Alasan khusus Halstead ini sulit untuk dibenarkan!). Karena itu,
2𝑁 = ηη1η1η2η2 Atau mengambil logaritma di kedua sisi,
𝑁 = log 2 𝜂 + log 2 (ηη1η1η2η2) Jadi, kita mendapatkan,
𝑁 = log 2 (ηη1η1η2η2) 𝑘𝑖𝑟𝑎 − 𝑘𝑖𝑟𝑎, 𝑑𝑒𝑛𝑔𝑎𝑛 𝑚𝑒𝑛𝑔𝑎𝑏𝑎𝑖𝑘𝑎𝑛 log 2 𝜂
Atau,
𝑁 = log 2η1η1+ log 2η2η2
= 𝜂1log 2 𝜂1+ 𝜂2log 2𝜂2
Bukti eksperimental yang dikumpulkan dari analisis sejumlah besar program menunjukkan bahwa panjang yang dihitung dan yang sebenarnya sangat cocok. Namun, hasilnya mungkin tidak akurat ketika program kecil dipertimbangkan secara individual.
Contoh 3.6 Mari kita perhatikan program C berikut:
main() {
int a,b,c,avg;
scanf("%d %d %d",&a,&b,&c);
avg=(a+b+c)/3;
printf("avg= %d",avg);
}
Operator uniknya adalah: main, (), {}, int, scanf, &, “,", “;”, =, +, /, printf
Operan uniknya adalah: a,b,c,&a,&b,&c,a+b+c,avg,3,”%d %d %d”, “rata-rata=%d”
Sehingga,
η1 = 12, η2=11
Perkiraan Panjang = (12 * log 12 + 11 * log 11)
= (12 * 3.58 + 11 * 3.45) = (43 +38) = 81 Volume = Panjang * log(23) = 81 * 4.52 = 366
Kesimpulannya, teori Halstead mencoba memberikan definisi formal dan kuantifikasi atribut kualitatif seperti kompleksitas program, kemudahan pemahaman, dan tingkat abstraksi berdasarkan beberapa parameter tingkat rendah seperti jumlah operan, dan operator yang muncul dalam program. Ilmu perangkat lunak Halstead memberikan perkiraan kasar properti dari kumpulan besar perangkat lunak, tetapi meluas ke kasus individu agak tidak akurat.