BAB V Implementasi Dan Pengujian Bab ini membahas implementasi dari prototipe perangkat lunak c2p, pembahasan yang dicakup adalah lingkungan implementasi, batasan implementasi, dan pembahasan hasil implementasi. Pembahasan mengenai pengujian perangkat lunak juga dilakukan,
meliputi
metode pengujian dan hasil pengujian.
5.1
Implementasi Pembahasan mengenai implementasi mencakup lima aspek, yaitu lingkungan perangkat
lunak, lingkungan perangkat keras, batasan implementasi, implementasi struktur data dan implementasi modul. 5.1.1
Lingkungan Perangkat Lunak Deskripsi lingkungan perangkat lunak dari proses pengembangan aplikasi translator
adalah sebagai berikut : a. Sistem operasi : Open SuSe Linux 10.3 kernel 2.6.22.17-0.1 b. Parser generator : GNU Bison 1.875c c. Scanner generator : Flex 2.5.33 d. Kompilator C : GNU C Compiler GCC-4.1 e. Kompilator Pascal : Free Pascal Compiler ( FPC ) 2.2.0 f. Editor teks : Vim 7.1 g. Kakas perangkat lunak lainnya : GNU Make 3.81, GDB 6.6.50.20070706 5.1.2
Lingkungan Perangkat Keras Deskripsi lingkungan perangkat keras adalah sebagai berikut : a. Memori
: DDR1 512 MB Visipro
b. Papan induk : MSI V Class 63
64
c. Cakram keras : Seagate Barracuda 40 GB 5400 rpm
5.2
Batasan Implementasi Untuk membatasi kompleksitas, baik dalam tingkat kerumitan (kesulitan) implementasi
secara teknis dan skala/ukuran program, maka proses implementasi dibatasi. Tabel V-1 menampilkan batasan proses implementasi Tabel V-1 Batasan Implementasi
item
keterangan
Preprocessing
Hanya menangani pembuangan komentar
Penamaan ulang simbol
Tidak menangani penamaan ulang simbol yang clash dengan kata kunci bahasa Pascal
Deklarasi variabel
Translasi deklarasi variabel tipe dasar, struktur, pointer dan senarai
Deklarasi tipe dengan typedef
Translasi dari typedef ke type
Deklarasi enumerasi
Translasi dari enumerasi ke const
Deklarasi dan definisi fungsi
Translasi dari deklarasi dan definisi fungsi menjadi subrutin
Tipe String ( Pascal )
Tidak mengimplementasikan tipe string
Tipe kompleks
Tidak melakukan translasi tipe kompleks ( seperti pointer to pointer )
escape sequence
Tidak ditranslasi
Operator sizeof
Operator sizeof ditranslasi menjadi konstanta integer
Operator relasional
Translasi dilakukan
Operator aritmatika dasar
Translasi dilakukan
Operator logika
Translasi operator && dan | |
Operator increment dan decrement
Operator ditranslasi menjadi pustaka standar Pascal
Operator assignment
Hanya ada satu operator assignment yang ditranslasi, yaitu operator =
Operator casting
Tidak ditranslasi
65
Lanjutan Tabel V-1 keterangan
Item Operator bit
Tidak ditranslasi
Akses elemen senarai dan struktur
Translasi dilakukan
Pemanggilan fungsi
Translasi dilakukan
Pustaka standar
Hanya melakukan translasi printf dan scanf
Statement pengulangan
Hanya mengimplementasikan translasi while
Statement pemilihan
Hanya mengimplementasikan translasi if
Jump statement
Tidak ditranslasi
5.3
Implementasi Struktur Data Upa bab ini menguraikan implementasi dari rancangan stuktur data yang telah dibahas
pada bab sebelumnya. Semua implementasi dilakukan dalam bahasa C. 5.3.1
Implementasi tabel simbol Tabel simbol diimplementasikan sebagai tabel hash. Elemen paling penting dari tabel
hash adalah fungsi hash dan badan tabel. Fungsi hash melakukan kalkulasi saat pencarian string, sedangkan badan tabel menyimpan referensi ke obyek di memori. Tabel V-2 menampilkan implementasi tabel hash. Tabel V-2 Implementasi tabel hash
typedef struct BUCKET { struct BUCKET *next; struct BUCKET **prev; } BUCKET;
/*elemen dari list (collision chain).*/
typedef struct HASH_TAB { int sz, nmemb; unsigned (*hash_func)(); int (*cmp_func)(); BUCKET *data[1]; } HASH_TAB;
/*implementasi tabel simbol*/
/*pointer ke fungsi hash*/ /*data dari tabel hash*/
66
5.3.2
Implementasi simbol, struktur dan sistem tipe Simbol ditambahkan secara bebas ke tabel hash karena tabel hash bersifat generic. Tabel
V-3 menampilkan implementasi simbol. Tabel V-3 implementasi simbol dan sistem tipe
typedef struct symbol /*representasi simbol*/ { unsigned char name[ MAX_NAME ];/*nama simbol.*/ short unsigned level :13; /*blok level simbol dideklarasi*/ short unsigned implicit : 1; short unsigned duplicate: 1; /*flag bahwa simbol terduplikasi*/ short unsigned _auto : 1; /*simbol yang dibuat otomatis*/ struct link struct link struct symbol struct symbol struct object } symbol;
*dcl; *end;
/*sistem representasi tipe*/
*args; *next; *p_obj;
/* parameter fungsi atau initializer*/ /* implementasi cross link*/ /* pointer ke obyek PASCAL. */
typedef struct specifier { short unsigned noun short unsigned sclass short unsigned qualif short unsigned _long short unsigned _sign union { int unsigned long unsigned long float double struct structdef struct symbol } const_val; } specifier; typedef struct declarator { short unsigned nmemb short unsigned dclass } declarator; typedef struct structdef {
/*sistem tipe*/ : : : : :
4;/*tipe data*/ 3;/*storage class: static, extern, dll*/ 2;/*qualifier: const,volatile*/ 2;/*long atau short*/ 2;/*signed atau unsigned*/
v_int; v_uint; v_long; v_ulong; v_float; v_double; *v_struct; *v_tdef;
: 14;/*jumlah elemen (kasus array)*/ : 2; /*declarator: pointer, array, function*/
67
unsigned char name[ MAX_NAME ];
/*nama struktur*/
Lanjutan Tabel V-3 short unsigned _union short unsigned level symbol *fields; } structdef;
5.3.3
: 2 ; : 13;
/*flag penanda union*/ /*item dari struktur*/
Implementasi fungsi hash Spesifikasi fungsi hash diambil dari [GRU00]. Fungsi hash bergantung pada ukuran dari
tabel hash. Pada tugas akhir ini, ukuran tabel hash disesuaikan dengan spesifikasi fungsi hash, yaitu 1008. Tabel V-4 Implementasi fungsi hash
/*definisi fungsi hash dari "Modern Compiler Design"*/ #define K 613 /*K adalah bilangan pengali sebagai pengacak*/ unsigned hash_str( s )/*fungsi bekerja pada string*/ char *const s; { register unsigned long h = 0 ; unsigned i = 0 ; for( ; s[i] ; ) h= s[i++]*K + h ; return (h & ~(~0 << 30)); }
5.3.4
Implementasi AST Algoritma yang menelusuri pohon parsing tidak bersifat rekursif melainkan DFS iteratif
(Deep First Search), sehingga tiap simpul AST memiliki beberapa pointer yang memungkinkan proses traversal dapat kembali ke simpul sebelumnya yang sudah dikunjungi. Tabel V-5 Implementasi AST
typedef struct ast { short unsigned info; /*kode komponen parsing*/ union { int v_int; float v_float; symbol* v_symbol; ... } dnode; struct ast *par, *sibl,
68
*left, *right; } AST;
5.4
/**/
Implementasi modul Pada bab IV telah diuraikan struktur modul program secara global. Rincian implementasi
modul per berkas dapat dilihat pada tabel V-6 Tabel V-6 Detail implementasi modul
Nama modul
Berkas pendukung
Penganalisis leksikal
c.lex, lex.yy.c
Penganalisis sintaksis
c.y, c.tab.h, c.tab.c
Struktur data internal
symtab.h, symtab.c, hashtab.h, hashtab.c, ast.h
Pembangkit kode
decl.c, pascal.c
5.5
Pengujian Upa bab ini membahas pengujian perangkat lunak c2p. Hal yang dibahas meliputi dua
macam, yaitu : metode pengujian dan hasil pengujian. 5.5.1
Metode Pengujian Metode pengujian yang diterapkan pada tugas akhir ini adalah black box. Program
menerima berkas masukan, lalu menghasilkan berkas keluaran dan yang terakhir, berkas keluaran dievaluasi oleh kompilator pascal fpc. 5.5.2
Hasil Pengujian Upabab ini menyajikan hasil proses pengujian untuk masing-masing kasus uji. Tidak
semua pengujian berhasil, ada kasus uji dimana berkas keluaran hasil proses translasi gagal dikompilasi oleh kompilator fpc. Berkas masukan dan keluaran untuk masing-masing pengujian dapat dilihat pada lampiran E. Pengujian 1 Program pertama dalam pengujian ini adalah program helloworld, program sederhana
69
yang menjadi masyhur karena dikenalkan oleh Kernighan-Ritchie dalam buku “The C Programming Language”. Berkas masukan dan keluaran untuk pengujian 1 dapat dilihat pada tabel E-1. Berkas keluaran ( helloworld.pas ) lolos kompilasi oleh fpc dan kode hasil kompilasi dapat dieksekusi. Pengujian 2 Pengujian ini menampilkan proses translasi dari deklarasi variabel dari tipe dasar yang dapat ditangani oleh program. Berkas masukan dan keluaran untuk pengujian 2 dapat dilihat pada tabel E-2. Berkas keluaran ( type.pas ) lolos kompilasi oleh fpc. dan kode hasil kompilasi dapat dieksekusi. Pengujian 3 Pengujian ini menampilkan proses translasi enum pada C ke dalam konstanta bilangan bulat pada Pascal. Berkas masukan dan keluaran untuk pengujian 3 dapat dilihat pada tabel E-3. Berkas keluaran ( enum.pas ) lolos kompilasi oleh fpc dan kode hasil kompilasi dapat dieksekusi.. Pengujian 4 Pengujian ini mengenalkan penggunaan input pada program uji. Program menerima masukan dari user berupa lima nilai bilangan bulat, lalu menghitung nilai rata-rata ( average )nya. Berkas masukan dan keluaran untuk pengujian 4 dapat dilihat pada tabel E-4. Berkas keluaran ( avg.pas ) lolos kompilasi oleh fpc dan kode hasil kompilasi dapat dieksekusi.. Pengujian 5 Pengujian ini mengenalkan penggunaan subrutin pada program dan juga implementasi statement seleksi IF, pada subrutin max, yang menerima dua bilangan bulat dan menentukan mana nilai maksimum dari keduanya. Berkas masukan dan keluaran untuk pengujian 5 dapat dilihat pada tabel E-5. Berkas keluaran ( max.pas ) lolos kompilasi oleh fpc dan kode hasil kompilasi dapat dieksekusi.. Pengujian 6 Pengujian 6 mengenalkan translasi operator aritmatika mod. Program membaca masukan dari user berupa angka tahun, lalu menentukan apakah tahun tersebut kabisat atau bukan. Berkas masukan dan keluaran untuk pengujian 6 dapat dilihat pada tabel E-6. Berkas keluaran ( mod.pas ) lolos kompilasi oleh fpc dan kode hasil kompilasi dapat dieksekusi.. Pengujian 7
70
Pengujian ini mengenalkan implementasi statement pengulangan WHILE pada subrutin power, yang menghitung nilai perpangkatan dua bilangan bulat. Berkas masukan dan keluaran untuk pengujian ini dapat dilihat pada tabel E-7. Berkas keluaran power.pas lolos kompilasi oleh fpc dan kode hasil kompilasi dapat dieksekusi.. Pengujian 8 Pengujian 8 menampilkan proses translasi operator sizeof pada C menjadi bilangan bulat pada Pascal. Operator sizeof yang diimplementasikan pada tugas akhir ini hanya menangani tipe dasar. Operator sizeof yang menangani obyek program tidak diimplementasikan. Berkas masukan dan keluaran untuk pengujian ini dapat dilihat pada tabel E-8. Berkas keluaran sizeof.pas lolos kompilasi oleh fpc dan kode hasil kompilasi dapat dieksekusi.. Pengujian 9 Pengujian ini menampilkan proses translasi senarai multidimensi. Penggunaan senarai multidimensi pada program uji adalah untuk merepresentasikan matriks. Berkas masukan dan keluaran untuk pengujian ini dapat dilihat pada tabel E-9. Berkas keluaran ( matrix.pas ) lolos kompilasi dan kode hasil kompilasi dapat dieksekusi.. Pengujian 10 Pengujian 10 menampilkan proses translasi passing parameter tipe kompleks ( dalam hal ini adalah pointer to integer ) dari suatu subrutin. Subrutin yang dipanggil ( callee ) pada pengujian ini berfungsi menukar dua nilai bilangan bulat. Subrutin pemanggil ( caller ) melakukan passing parameter berupa alamat ( address ) dari dua variabel bilangan bulat. Berkas masukan dan keluaran untuk pengujian 10 dapat dilihat pada tabel E-10. Berkas keluaran ( swap.pas ) lolos kompilasi oleh fpc dan kode hasil kompilasi dapat dieksekusi.. Pengujian 11 Pengujian 11 menampilkan proses translasi struktur sederhana. Berkas masukan dan keluaran untuk pengujian ini dapat dilihat pada tabel E-11. Berkas keluaran ( simple_struct.pas ) lolos kompilasi oleh fpc dan kode hasil kompilasi dapat dieksekusi.. Pengujian 12 Pada pengujian 12, program uji menerima berkas masukan yang menggunakan tipe struktur kompleks, yaitu structure of structure. Penerjemahan struktur kompleks sendiri berhasil, tetapi berkas keluaran gagal dikompilasi oleh fpc karena dalam kode masukan, dilakukan operasi assignment antar struktur. ANSI C mendukung structure assignment namun Pascal tidak. Proses
71
assignment harus dipecah menjadi per member struktur. Tugas akhir tidak menangani hal ini. Kedua berkas (complx_struct.c dan complx_struct.pas) dapat dilihat pada tabel E-12. Pengujian 13 Program uji menerima masukan berkas berupa kode yang menggunakan UDT ( User Defined Type ). Program melakukan translasi dari UDT C ke UDT Pascal. Berkas masukan dan keluaran dapat dilihat pada tabel E-13. Berkas keluaran ( point.pas ) lolos kompilasi oleh fpc dan kode hasil kompilasi dapat dieksekusi.. Pengujian 14 Pada pengujian 14, berkas masukan berisi sekumpulan prosedur untuk mengurutkan senarai bilangan bulat dengan menggunakan metode shell sort. Berkas keluaran shell_sort.pas lolos kompilasi oleh fpc dan kode hasil kompilasi dapat dieksekusi.. Berkas masukan dan keluaran dapat dilihat pada tabel E-14. Pengujian 15 Pada pengujian ini, program masukan berisi implementasi desktop calculator sederhana. Program uji yang berupa kalkulator ini menggunakan seluruh fitur yang diimplementasikan pada program translator. Berkas masukan dan keluaran dapat dilihat pada tabel E-15. Berkas keluaran ( calc.pas ) lolos kompilasi oleh fpc dan kode hasil kompilasi dapat dieksekusi.