PEMROGRAMAN TINGKAT RENDAH -...

20
PEMROGRAMAN TINGKAT RENDAH

Transcript of PEMROGRAMAN TINGKAT RENDAH -...

Page 1: PEMROGRAMAN TINGKAT RENDAH - elearning.gunadarma.ac.idelearning.gunadarma.ac.id/docmodul/pengantar_rekayasa_perangkat_lunak/bab5.pdf · algoritma yang secara komputasional mahal bila

PEMROGRAMAN TINGKAT

RENDAH

Page 2: PEMROGRAMAN TINGKAT RENDAH - elearning.gunadarma.ac.idelearning.gunadarma.ac.id/docmodul/pengantar_rekayasa_perangkat_lunak/bab5.pdf · algoritma yang secara komputasional mahal bila

PEMROGRAMANTINGKATRENDAH

Pemrograman tingkat rendah adalah pemrograman pada tingkat ekspresi,statemen,dan fungsi.Sebaliknyapemrogramantingkatrendahadalahpada tingkat

modulcompiledan sis~m. Booini meneruskanpembahasanpraktekpemrogramanC, yang menekankanpemrogramanpadatingkatrendah ;bab berikutnyamembahastentang pemrograman tingkat tinggi.

5. 1. PARAMETERISASI

Program tergantungpada nilai seperti nama file, search string, ukuran tabel,fount dan sebagainya. Nilai semacam ini dapat dilakukan hard code kedalamprogramataudapatdikirimkankedalamprogramsebagaiparameter.Parameterisasimemiliki keuntungan yang besar : Kode yang diberi parameter lebih mudahperawatannya, bersifat portable dan dapat dipakai kembali karena kita dapatmeningkatkandan menyesuaikannyadenganmengubahparameter.Kelemahannyaadalah bahwa pa~ameterisasi memerlukan usaha yang lebih banyak pada

.permulaannya, serta mungkin dapat masalah unjuk kerja. Proses ini memerlukanusaha yang lebih banyak untuk memilih parameter argoritma serta struktur data

dap kemudian menempatkannya kedalam kode. Mungkin terdapat unjuk kerjabila diperlukan komputasi tambahan untuk mendapatkan atau membuat nilai yang

\ '

berparameter. Parameterisasi memiliki manfaat; meskipun diperlukan pekerjaanyang banyak pada tahap awal, usaha yang banyak dapat dihindari kemudiandalam tahap-tahap pembuatan sistem, serta pinalti unjuk kerja biasanya keeil.

5.1.1. APA YANG HARUS DI PARAMETERISASI

Para disainer bahasa pemrograman kadang-kadang mengatakan bahwabilangan yang akan muncul dalam bahasa ialah 0 dan 1 serta tak terhingga(infinity). Hal yang sama dapat dikatakan dari kode sumber, dimana idealnyabilangan yang digunakan seharusnya hanyalah 0 dan 1 (dan bahkan 0 dan 1sebaiknyadihindari untuk kepentingankemudahanbaca pada nama-namasepertiNOLL, 1RUE dan FALSE).Namun sayangnyakode sumbersering menimbulkanpermasalahandengan"bilanganmagic"yangmenunjukkanciri lingkungan,aplikasi

88

Page 3: PEMROGRAMAN TINGKAT RENDAH - elearning.gunadarma.ac.idelearning.gunadarma.ac.id/docmodul/pengantar_rekayasa_perangkat_lunak/bab5.pdf · algoritma yang secara komputasional mahal bila

dan implementasi. Bilangan magic yang umum dalam program C meliputi :

. Nilai aplikasi khusus. Nilai ini meliputi kode wama, ukuran field, nilaimaksimum dan minimum yang diperbolehkan,dan sebagainya.

. Nilai lingkungankhusus. Nilai ini.meliputiukuran.kata, ukuran tipe, ukuranblok file dan nilai lain yang tergantung pada mesin atau compiler khusus.

. Nilai tuning. Nilai ini meliputi ukuran baffer, ukuran blok faktor loadingtaOOldan sebagainya.

. Batas tipe data. Batas ini meliputi-32768 dan 32767 sebagai nilai minimumdan maksimum dari tipe short, sebagai contoh :

. Batas struktur data. Batas ini meliputi $ array dan ukuran taOO!.

. Kode internal. Kode ini digunakan untuk menyajikan obyek khusus ataumenyatakan secara khusus pada implementasi. Contoh dari kode internalmeliputi nilai pilihan menu, tipe token yang dikembalikanoleh parsel sertakode kembalianfungsi.Nilai-nilaiinikhususnyaOOrsifatmagicsebabmerekatidak memiliki makna diluar program tempat mereka muncu!.

. Mask bit. Mask bit ini dipakai untuk mengolah $ bit.

. Offset. Offset merupakan lokasi field dalam file, baffer, taOOlatau struktur.

BILANGAN MAGIC MERUPAKAN CALON UNTUK PARA-METERISASI

Nilai aplikasi khusus hendaknya dibuat kedalam parameter untukmempermudah perawatan. BeOOrapabilangan magic yang dijamin tidak akanmengubah lokasi tampilanoutput,kode karakterASCn dan sebagainya,mungkintidak perlu di parameterisasikan( meskipun sulit untuk menjarnin bahwa nilaitersebut tidak akan OOrubah). Kita hendaknya selalu membuat parameter darinilai-nilai lingkungan khusus batas struktur data, offset, serta nilai lainnya yangcenderung akan OOrubahjika program akan dipindah. Mask bit, kode internal,batas tipe data dan nilai-nilailain yang dapat membingungkanpembaca programhendaknya di parameterisasi sehingga mudah dibaca.

Merupakan hal yang baik untuk memparameterisasitipe data. UNIX dan Cterdapat pada mesin yang OOrbedajenisnya dari mikro komputer sampai superkomputer. Tipe-tipe data harns sering diubah untuk menyesuaikan denganlingkungan tersebut misalnya, program untuk mikro komputer deng~ memoriyang terbatas dan bus 8 bit mungkin memerlukan variabel integer yang dideklarasikan Unsigned Char bukan sort atau Int agar program menjadi cepat

89

Page 4: PEMROGRAMAN TINGKAT RENDAH - elearning.gunadarma.ac.idelearning.gunadarma.ac.id/docmodul/pengantar_rekayasa_perangkat_lunak/bab5.pdf · algoritma yang secara komputasional mahal bila

dan keeil. Pada mesin yang lebih besar beberapa variabel mungkin harns berupashort atau lot untuk memeeahkan masalah yang lebih besar.

Operasi juga dapat di parameterisasi. Sebuah sistem dapat menggunakanalgoritma yang secara komputasional mahal bila alat flowating point tersedia,atau algoritma yang lebih murah tetapi kurang akurat bila tidak ada pilihan.Pilihan diantara dua tersebut hendaknya di kodekan sebagai sebuah parameter.Demikian pula operasi untuk intervace pemakai, optimisasi, ukuran masalah,fonnat data dsb semuanya dapat di parameterisasi.

5.1.2. BERBAGAI CARA PARAMETERISASI

C memiliki banyak cara untuk melakukan parameterisasi. Cara yang palingumum adalah argumen fungsi. Sebagai contoh merupakan hal yang umum untukmenemukan sort atau search dengan batas struktur data hard coded, fungsi pesanpemakai dengan lokasi tampilan hard coded, format dan kode nilai, fungsi analisisdata dengan operasi analisis hard coded dan sebagainya. Argumen fungsimerupakan hal yang baik untuk membuat parameter nilai aplikasi khusus, tipedata dan, batasan struktur data serta operasi. Pada operasi-operasi khusus dilakukanpemeriksaan yang lebih karena sangat sedikit programer yang terbiasa memberikanfungsi-fungsi sebagai program serta mekanisme yang handal. Sebagai contoh,sort array dapat digeneralisasi dengan memberikan operasi perbandingan sertaukuran elemen array sebagai argumen. Hasil ini merupakan jenis yang bekerjapada semua jenis array dan sort pada semua order. Pelajarilah sort sisipan generalpurpose :

void Insertion_Sort( array, element_size, array_size, cOIIIp_func )

char *array; /* in/out:pointerto an arbitraryarray */int element_size, /* in: bytes used to make up an element */

array_size; /* in: elements in the array */

int (*caIIp_func){); /* in: TRUE iff arg1 bears order relation to arg2 */

{char *tmp;

register int i,j;

/* buffer for swapping array elements */

/* loop variables: i walks forward, j walks back */

/* Part 1: Allocate a swap buffer */tmp = malloc( (unsigned)element_size );

/* Part 2: Swap the smallest value into first place */

for ( i = element_size, j = 0;

i < (array_size*element_size);

i += element_size )

if ( (*cOlllp_func) (array+i, array+j) ) j = i;

II

Page 5: PEMROGRAMAN TINGKAT RENDAH - elearning.gunadarma.ac.idelearning.gunadarma.ac.id/docmodul/pengantar_rekayasa_perangkat_lunak/bab5.pdf · algoritma yang secara komputasional mahal bila

if(O<j){memcpy(memcpy(memcpy(}

trnp, array, element_size) ;

array, array+j, element_size );

array+j, trrp,element_size );

/* Part 3: Insert array elements starting from the third */for ( i = (2*element_size);

i < (array_size*element_size);

i += element_size )(

memcpy( trnp, arrray+i, element_size);

j = i;

while ( (*comp_func) (trnp,array+j-element_size) )(

memcpy( array+j, array+j-element_size, element_size );

j -= element_size;}

memcpy( array+j, trnp,element_size );}

/* Part 4: Deallocate the swap buffer */free ( tmp );

} /* Insertion_Sort */

Fungsi perbandingan menutup informasi tentang elemen array sertamenentukan cara memesan mereka. Oleh karena sort tidak harus mengetahuirincian ini maka dia akan bekerja baik dengan hasil yang dikembalikan olehfungsi komparasi.Kami telah mengujisort ini pada sistemkarni serta menemukanbahwa 4 jam lebih lambat dari versi non-generik.Turunnya unjuk kerja berasaldari panggilan fungsi diatas dalam perbandingan bergeraknya data, akan tetapibila jenis insersi mendekati (array dengan tidak lebih dari 30 elemen), turunnyaefisiensi ini mungkin tidak begitu penting atau dilihat.

Makrosi merupakan parameterisasi serta untuk .membuatkode yang lebihportable. Makro untuk nilai lingkungan serta nilai aplikasi khusus, nilai tuning,mask bit, offset serta bilangan magic yang non-portable dapat dipakai kedalamheader files. Kemudian bila port, fix, perubahan atau perluasan memerlukansuatu perubahan, merupakan hal yang mudah untuk mengubah definisi makro'dan mengkompile kembali. Kadang-kadang makro dipakai untuk kode internalataunilaidatabernamaflagataukeadaaninternal.Misalnyaculamsebuahkompilertipe token dikembalikan oleh piranti analisa lexical dap>!1diberi kode khusus.

91

Page 6: PEMROGRAMAN TINGKAT RENDAH - elearning.gunadarma.ac.idelearning.gunadarma.ac.id/docmodul/pengantar_rekayasa_perangkat_lunak/bab5.pdf · algoritma yang secara komputasional mahal bila

Kode token dapat didifinisikan sebagai makro berikut:

Meskipun hal ini dapat diterima namun merupakan hal yang lebih baik untukmenggunakan tipe dan anumerisasi berikut:

enum token_type {IDENTIFIER,

SEMI_COLON,

LEFT_BRACE,

RIGHT_BRACE,

INTEGER_LITERAL,

REAL_LITERAL,

etc.

} ;

Tipe anumerasi mempunyai dua keuntungan : Kita tidak harus mengisikembali bilangan kode bila daftar tersebut berubah dan kompiler dapatmelakukannya lebih baik dengan eara melakukan pemeriksaan.

Difmisi tipe merupakan mekanismeparameterisasiyang lain. Seperti halnyamacro. Difinisi tipe dapat ditempatkan pada beberapa file header, berubah biladiperlukan dan sistem tersebut akan di kompil ulang kita hendaknya selalumenggunakan definisi tipe bukan macro pada saat parameterisasi tipe. Pelajaricontohberikut:

#define CHAR_PTR char *

CHAR_PTR p, q;

92

#define IDENTIFIER 0

#define SEMI_COLON 1

#define LEFT_BRANCE 2

#define RIGHT_BRACE 3

#define INTEGER_LITERAL 4

#define REAL_LITERAL 5

etc.

Page 7: PEMROGRAMAN TINGKAT RENDAH - elearning.gunadarma.ac.idelearning.gunadarma.ac.id/docmodul/pengantar_rekayasa_perangkat_lunak/bab5.pdf · algoritma yang secara komputasional mahal bila

Bila macro ini diperluas deklarasi tersebut membaca :

char *p, qi

Program ini mendeklarasikanp sebagai pointer bagi char tetapi q sebagaisebuah char dengan menggunakan type de! untuk CHAR_PTR memecahkanmasalah ini.

IIIJMerupakan ringkasan pembahasan parameterisasi.

Nilai aplikasi khusus

Nilai lingkungan khusus

Nilai TuningBatas struktur dan tipe dataMasks bitOffsetsKode Intemal

Operasi

Tipe

Argumen fungsi, makroMakro

Makro

Argumen FungsiMakro

MakroEnumerasi

Argumen fungsi

Definisi tipe

5.2. PREPROSESOR C

Preposesor C merupakan prosesor macro yang dijalankan pada kode sumberC sebagai tahap pertama kompilasi. Preprosesor tersebut akan menarik isi filelainnya kedalam file sumber sesuai dengan #inc1ude directiv, memperluas macrodan secara kondisional menyimpan atau menghapus bagian file sumber tersebut.Kita telah membahas bagaimana macro tanpa parameter meningkatkan portabilitasdan kemudahan perawatan. Bagian ini memberikan petunjuk lebih lanjut dalammenggunakan preprosesor. Satu kekeliruan pemakaian preprosesor C adalah

93

Page 8: PEMROGRAMAN TINGKAT RENDAH - elearning.gunadarma.ac.idelearning.gunadarma.ac.id/docmodul/pengantar_rekayasa_perangkat_lunak/bab5.pdf · algoritma yang secara komputasional mahal bila

menggunakannya untuk menyamarkan C sebagai bahasa lain.Misalnya difinisi

preprosesor berikut dibuat.

Menggunakan macro ini,perhatikan potongan kode berikut sebelum

preprosesing.

REPEAT

ch = getch () ;

IF ch < BLANK THEN ch = ESe;

~IL ( ch == BLANK );

Kode ini diubah oleh preprosesor kedalam berikut.

Potongan pertama kelihatan seperti pascal kecuali untuk pengisian dan

operator persamaan. Potongan kedua adalah kode C. Artikel ini menyediakan

instruksi lengkap untuk menyamarkan C sebagai pascal.

Mula-mula ide menyamarkan C kelihatan tidak begitu buruk - ada

kepandaian tertentu padanya pekeIjaan ini tidak banyak mengganggu unjuk keIja

kompiler, dan dapat memberikan dukungan untuk programer C yang barn yangmengetahui bahasa pemrograman lainnya. Akan tetapi dengan beberapa alasanmenyamarkan C merupakan hal yang buruk. Pertama bagaimanapun juga Cmemiliki model tersendiri dan penyamaran tersebut tidak akan pemah sempuma.Menyusun bahasa C dari bahasa lainnya akan selalu tidak tepat dan idiom C sertaoperasi akan mengalami keterbatasan dimana-mana. Misalnya tidak terdapat carauntuk menirukan operasi tipe Z pascal dengan menggunakan preprosesor C sebabtidak ada cara untuk membuat operator "+", "-", "*", dan "=" akan berlaku

94

#define if if

#define THEN#define REPEAT do

#define UNTIL ( b ) } while (! (b)

do {ch = getch () ;

if ( ch < BLANK ) ch = ESC;

while (! (ch -- BLANK) );

Page 9: PEMROGRAMAN TINGKAT RENDAH - elearning.gunadarma.ac.idelearning.gunadarma.ac.id/docmodul/pengantar_rekayasa_perangkat_lunak/bab5.pdf · algoritma yang secara komputasional mahal bila

sebagaimana mestinya dalam pascal. Sebagai akibatnya kode yang disamarkanmembingungkandua bahasa yang idiosenkratik,tidak terdokumentasiserta tanpadukungan. Kedua, menyamarkan C bagi programer C barn temyata akan lebihmerepotkan daripada membantu, oleh karena programer barn tersebut tidakmengetahui C dia tidak dapat menyebutkan C dari penyamaran tersebut. Olehkarena itu pada pelajaran C programer bam hams juga memilih ciri-ciri bahasaC dari ciri-ciriyangdisamarkan,dan bagianyangtidakterpelajaripadapenyamarantersebut akan disalahkan sebagai C. Ketiga, C dapat disamarkan bila dia tertulistetapi penyamaranitu akan terungkapselamakompilasi : Programyang dijalankantersebut program C, selama pembetulan, kita hams mengetahui secara tepat apayang dilakukanoleh program kita, maka kita hams memasukisemuapenyamaranuntuk melihat apa yang sebetulnya dijalankan oleh program C. Hal ini akanmembuat pekerjaan lebih sulit. Akhirnya penyamaran program C akanmengakibatkan program tersebut sulit dibaca. Tidak terdapat penyamaranstandard untuk C bila programer C membaca program yang disamarkan merekaterpaksa untuk mengetahui arti kode orang lain.

Masalah lain dapat digambarkan untuk mengecoh perbedaan antara macrodan fungsi.Macrobukanlahobyekprogrammelainkankependekanuntukpotongankode. Bila preprosesor dikerjakan dengan sebuah file maka semua macro akanlenyap hubungannya dengan definisi mereka. Sebaliknya fungsi tetap ada padaseluruh terjemahanprogramdan berfungsi sebagaientitas laindalam kode obyek.Hal ini membuat perbedaan yang besar. Argumen fungsi dievaluasi selamapelaksanaan program dan hasilnya diberikan ke fungsi tersebut tetapi argumenmacro seca("atekstural digantikan selama preprosesing. Macro dapat interaksidengan kode sekitamya dimana hal ini tidak dapat dilakukan oleh fungsi hal inisering mengejutkanpara programer.Sebagai contoh macroberikut dipakai untukmenghitung makna geometrik.

#define G_MEAN(a, b) sqrt (a * b)

Perluasan dari G_MEAN ( X+4, Y+2 ) adalah sqrt ( x+4 * y+2 )

Ekspansi ini tidak menghitung MEAN geometrik dan mungkin tidakmenghitung apa yang dikehendaki masalah ini dapat dengan mudah dibetulkan.Tempatkanparameterdalamdefinisimacrosebagaiberikut:

#define G_MEAN(a,b) (sqrt«a) * (b»)

95

Page 10: PEMROGRAMAN TINGKAT RENDAH - elearning.gunadarma.ac.idelearning.gunadarma.ac.id/docmodul/pengantar_rekayasa_perangkat_lunak/bab5.pdf · algoritma yang secara komputasional mahal bila

Aturannya, macro dan parametemya harns dipisahkan dengan (dalam definisimereka).

Masalah lain mungkin timbul dari perbedaan argumen macro dan fungsi.Pelajari definisi berikut untuk maksimum dua nilai :

#define MAX(a, b) « (a) > (b)) ? (a) : (b))

Definisi ini kelihatannya baik tetapi perhatikan MAX ( i++, j++) kita akanmengharapkan i dan j akan ditambah dan nilai dari ekspresi yang lebih besar darinilai aslinya i dan j. Lihat kode yang telah diperluas sbb.

« (i++) < (j++)) ? (i++) (j++) )

Ekspresi ini menambah satu untuk i dan dua kali untuk j, dan nilainya lebihbesar dari dua plus satu. Akibat sampinganyang menyebabkankejutan ini tidakdapat terjadi dengan parameter fungsi. Masalah akibat sampingan terdapat padabanyakmacro;hindaripenggunaanmacrodengancarnmemakaifungsisemaksimalmungkin.

Macro dengan definisi yang besar dapat menyebabkan masalah lain kodeobyek besar yang tidak diharapkan. Masalah ini tidak akan terjadi untuk fungsikarena hanya ada satu copy body fungsitidakperduli berapa kali fungsi tersebutdipanggiI.

Satu-satunya alasan yang baik dalam menggunakan macro sebagaipengganti fungsi adalah kecepatan : Oleh karena macro diperluas pada tempatkemunc..dan mereka dan tidak memiliki konteks lokal, maka macro tersebuttidal< memiliki panggilan dan kembali seperti yang ada pada fungsi. Padasebagian implementasi C panggilan fungsi dan kembalinya overhead adalahkecil namun kadang-kadang menggantikan fungsi dengan macro diperlukanuntuk mempercepat kode dalam memenuhi persyaratan. Bila demikiankembangkan dan koreksi program dengan fungsi serta menggantikan fungsidengan macro sebelum pengujian unit terakhir.

96

Page 11: PEMROGRAMAN TINGKAT RENDAH - elearning.gunadarma.ac.idelearning.gunadarma.ac.id/docmodul/pengantar_rekayasa_perangkat_lunak/bab5.pdf · algoritma yang secara komputasional mahal bila

5.1.PUSTAKAFUNGSIC

Tidak seperti bahasa-bahasa lain C tidak mempunyai operasi yang sudahdibuat dari pabrik untuk input dan output, manipulasi $ dan beberapa operasiaritmatik yang umum sepertipangkat.Konsekuensinyahampir semua program Chams menggunakanpustaka fungsi C. Banyak dari fungsi pustaka tersebut telahberstandard tinggi, khususnya sekarangdimana terdapat standard C ANSI, tetapilainnya tidak begitu standard,hanya terdapat dalam lingkungantertentu. Pustakafungsi C secara khusus meliputi hal-hal sebagai berikut :

. Fungsi input dan output. Fungsi ini untuk membuka dan menutup file,memeriksa status file, mencari dan mengulang file, serta membaca dan menulisfile. Semua implementasi C menyediakan fungsi core dalam pustaka I/Ostandard, yang sering diperlruat dengan fungsi lainnya pada lingkungan khusus.

. Fungsi manipulasi $. Fungsi ini adalah untuk mengcopy, menghubungkan,membandingkan, mencari, dan menemukan panjang $. Fungsi ini telahberstandard tinggi dan terdapat dimana-.mana. .

. Fungsi manipulasi dan alokasi memori. Fungsi ini adalah untukmengalokasikan dan membebaskan memori dari banyaknya tempatpenyimpanan yang kosong dan telah standard.Sebagian besar implementasijuga memberikanrutinuntuk mengcopydan mengosongkanmemori,mengujimemori kosong yang masih tersisa dan sebagai.nya.

. Fungsimatematis.Fungsiini merupakankumpulandari berbagaimacamfungsi matematis dalam katagori ini tidak kelihatan begitu banyak standarisasiuntuk fungsi akar kuadrat, logaritma dan pemangkatan.

. Fungsi conversi data. Fungsi ini adlah untuk mengirimkan data numerikdiantara penyajian karakter dan biner. Dalam pustaka ini terdapat sedikituniformity (kurangnya informasi).

. Fungsi pelayanan sistem operasi. Fungsi ini memberikanakses untuk inputtingkat rendah serta output tingkat rendah control piranti periperal, controlproses, dan tanggal, waktu serta informasi status sistem. Rutin ini telahstandard dalam lingkungan UNIX tetapi sangat beragam dalam lingkunganlainnya.

Beberapa programer menghinch!ri fungsi pustaka karena ingin menggunakanfungsi yang dikembangkan sendiri. cara ini merupakan praktek yang tidak baik.

97

Page 12: PEMROGRAMAN TINGKAT RENDAH - elearning.gunadarma.ac.idelearning.gunadarma.ac.id/docmodul/pengantar_rekayasa_perangkat_lunak/bab5.pdf · algoritma yang secara komputasional mahal bila

Porsi standard dari pustaka fungsi C khbususnya fungsi input output, telah dikenaloleh semua programer bahasa C yang berpengalaman. Kode yang menggunakannyalebih mudah dibaca karena berisikan elemen yang telah dikenal. Fungsi pustakadidokumentasikan oleh suplier compiler dan didukung bersama compiler tersebut.Bagian dari dokumentasi program serta perawatan diberikan oleh supliercompiler pada saat program menggunakan fungsi pustaka. Pustaka fungsi Cmemberikan pelayanan tingkat tinggi yang umum. Pelayanan ini yang membantumemisahkan program dari lingkungannya. Program yang tidak menggunakanfasilitas ini akan kurang portable. Fungsi pustaka C diuji secara luas, sehinggafungsi-fungsi tersebut lebih reliable daripada fungsi yang ditulis programer untukmereka sendiri. Lebih Ianjut fungsi pustaka telah dibuat untuk kepentingan efisiensiyang baik, sering oleh para ahli yang berpengalaman dengan menggunakan bahasarakitan untu,k mendapatkan unjuk kerja yang optimal. Akhirnya denganmenggunakan fungsi pustaka C dapat meningkatkan produktifitas programer.Tidak terdapat alasan untuk menulis, mendokumentasikan, mencoba, memperbaiki,memperluas, dan merawat puluhan, ratusan atau ribuan baris kode C bila fungsiyang sarna telah ada yang disediakan oleh compiler C. Disamping pustaka fungsiC yang terdapat bersama compiler, masih ada lagi pustaka lainnya yang dapatdipakai. Terdapat pasar substansial dalam pustaka fungsi C khusus, terutamauntuk micro komputer. Banyak produk ini memiliki kualitas yang tinggi. Untukkepeintingan tertentu pustaka-pustaka ini sesuai dengan standard seperti grafikkernel sistem atau sistem kernel grafik (GKS), standard grafik nasional. Pustakayang sesuai d~ngan standard terencana dengan baik serta terdokumentasi baikpula serta dapat dipindahkan oleh pustaka lain yang sesuai dengan staridard tersebut.

5.4. EKSPRESI

Oleh karena ekspresi digunakan lebih banyak dalam C daripada bahasapemrogramannya yang semacam maka ekspresi C bersifat kompleks, ekspresimerupakan sumber masalah dalam pemrogramanC tanda kurung. C memilikisatu operator ternary,34 operatorbiner dan 9 operatorunary yang tersusundalam15 tingkat hirarki presenden. Meskipun sebagian besar dari operator ini jarangdipakaiyangtingkat-tingkatpresendensepertitingkat-tingkatdalambahasa lainnya,susunan evaluasi dalam ekspresi yang kompleks masih dapat menyebabkankesalahan dan membingungkan. Cara terbaik untuk menghindari hal yangmembingungkan dan untuk menjarnin bahwa ekspresi dievaluasi sebagaimana

98

Page 13: PEMROGRAMAN TINGKAT RENDAH - elearning.gunadarma.ac.idelearning.gunadarma.ac.id/docmodul/pengantar_rekayasa_perangkat_lunak/bab5.pdf · algoritma yang secara komputasional mahal bila

yang kita kehendaki adalah dengan menggunakan tanda kurung. Tanda kurungyang banyak tidak mempengaruhi kompilasi serta efisiensi waktu, tetapimeningkatkan kemampuan baca dan reliabilitas.

Side effects. C mempunyai beberapa operator dengan side effects :operatorpenambahandan pengurangandan operatorpengisian(assignent).Banyakprogramer C menganggap side .effects ekspresi sebagai salah satu kemampuantertinggipada bahasaC; tetapikita menganhggaphal ini sebagaisuatukelemahan.Meskipun kode sumber dapat diperpendek dengan ekspresi side effects,kemamapuanbaca biasanyaakan menurundan kesalahanakan mengungkapolehkarena itu disarankanbahwaside effectse,kspresinyahendaknyadigunakandenganhati-hati.

Operasi Bitwise. Sebagaimanapendahulunyasebagaibahasapemrogramansistem, C menawarkan banyak variasi operasi untuk mengolah bit. Beberapaprogramer tertarik untuk menggunakan bit untuk bekerja dengan bit meskipunsebepamya tidak perlu, dengan menggunakan penggantian untuk perkalian danpembagian integer, menyimpangflagjamak atau counter dalam kata tunggal dansebagainya.

Kecualipada saat aplikasiatau tuntutanunjuk kerja memerlukannya,praktekseperti itu sebaiknya dihindari.

Ekspresi Boolean Kompleks. Sebagian besar orang bahkan programermudah bingung dengan operasiboolean kompleks. Kemudahanbaca, releabilitasserta kemudahan perawatan cenderung untuk naik bila operasi booleandisederhanakan. Metode untuk menyederhanakan ekspresi boolean didasarkanpada hukum DeMorgan sebagai berikut :

! ( A && B

! ( A II B

is equivalent to

is equivalent to

!A II !B

!A && !B

Misalnya pelajari ekspresi boolean !«4<=A) && (A<=6». Ekspresi initerbaca: benar bila ekspresi tidak dalam kasus bahwa baik A paling tidak 4 danA tidak lebih dari 6. Dengan menggunakanhukum DeMorgan kita mendapatkan«A<4) II (6<A», yang terbaca sederhana : Benar bila A lebih kecil dari 4 ataulebih besar dari 6. Secara umum operasi boolean lebih mudah untuk dipaharniketika hukum demorgan dipakai untuk mengirimkannegasi didalam ekspresi -negasi yang ada cenderung akan membingungkan.

Mekanisme lain yang berguna dalam menyederhanakan ekspresi booleanyang kompleks (dan dalam mernformulasikanmereka secara benar dalam tempat

99

Page 14: PEMROGRAMAN TINGKAT RENDAH - elearning.gunadarma.ac.idelearning.gunadarma.ac.id/docmodul/pengantar_rekayasa_perangkat_lunak/bab5.pdf · algoritma yang secara komputasional mahal bila

pertama), merupakan tabel-tabel keputusan. Karnough memetakan pohonkeputusan,dan Marquandmemetakandiagram.Piranti-pirantiinijuga bermanfaatdalam memahami kondisionar yang kompleks.

Ekspresi boolean yang kompleks kadang-kadang merupakan sumber darikesalahan bit effects. Operator boolean C merupakan operator sirkuit pendek,sehingga evaluasi ekspressi akan terhenti secepat mungkin. Oleh karena itu biaA lebih kecil dari 4 dan operasi dari ekspresi boolean «A<4) II (6<A) berhentisetelah relasi pertama dievaluasi ( karena kemudian keseluruhan ekspresi harnsbenar ). Pekerjaan ini akan berjalan dengan baik selama tidak terdapat sideeffects. Apabila misalnya ekspresi (i<4) II(6<i++), kemudian i akan bertambahbila dimulai dengan 4 atau dengan yang lebih besar. Masalah ini akan dihindaribila ekspresi boolean kompleks tidak memiliki side effects.

Ekspresi Relasional. Disampingkesederhanaanmereka,ekspresirelasionaldapat membingungkan.Beberapaorang memikirkanbahwa relasi matematis caraspatiale, dengan membayangkan nilai-nilai dalam positif relatif pada bilangannomor. Kita membandingankandengan sebuah relasi ke ( X >= Y ). orang-orangsecara mental "flip" re1asike ( X >= Y ). Ibaratnya melakukan senam mentalbersama-sama dengan melihat apa yang terjadi pada suatu program adalahmerupakan pekerjaan yang sukar. Dengan menghindari operator rasional > dan>= dan menggantikanoperator < dan <= dapat memecahkan masalah ini denganmenghilangkansemuakeperluansemua operasiflip,dan lebih tepat dengan notasimatematis standard. Banyak programer C yang berpengalaman menunjukkansatu masalah yang menjengkelkan : salah ketik operator = sebagai operatorpengisian = pada ekspresi relasi rasional. Program dengan masalah ini akanmenunjukkan tingkah laku yang aneh, meskipun kode sumber akan kelihatanbetul - kita cenderung uniuk membaca kesalahan yang lalu, dengan melihatoperatorpengisiansebagaioperatorpersamaan.Satuprakteksederhanamengurangifrekuensi kesalahan ini ( menambahkan kemampuan baca kode ): Bilamanaperbandingan persamaan dibuat dengan konstanta, tempatkan konstanta tersebutpada sebelah kiri. Karena sebuah konstanta tidak dapat diisi dengan sebuah nilaimaka compiler akan menangkap operator persamaan yang diketik salah tersebutsebagai operator pengisian (assgignment operator). Ekspresi penghentian loop.Ekspresi ini diuji untuk menentukanapakah loop harns berhenti.Ekspresibooleandalam header dan loop while adalah operasi penghentian loop. Ekspresipenghentian loop secara umum menguji apakah variabel control loop telahmencapai nilai tertentu. Sebagai contoh :

for ( i = START_VALUE; i != STOP_VALUE; 1++ )

{ ... loop body ... }

100

Page 15: PEMROGRAMAN TINGKAT RENDAH - elearning.gunadarma.ac.idelearning.gunadarma.ac.id/docmodul/pengantar_rekayasa_perangkat_lunak/bab5.pdf · algoritma yang secara komputasional mahal bila

Hal ini dapat memenuhi kehendak programer serta dapat dibaca, tetapi kurangaman. Tidak ada jaminan bahwa i tidak berubah dalam bodi loop untuk melompatkebelakang STOP _VALUE, yang menyebabkan loop tak terhingga. Lebih baiksebagai berikut :

for ( i = START_VALUE; i <= STOP_VALUE; i++

{ . 0 ° loop body ° 0 0 }

Loop ini akan berhenti pada semua nilai dari i, paling tidak sebesarSTOP_VALUE, baik nilai yang dikendaki°tersebuttercapai atau tidak. Hal inilebih aman dengan memberikanekspresi penghentianloop kemungkinanterbesaruntuk gagal, yaitu, dengan membuatnyaselemah mungkin.HAl ini menyarankanaturan praktek lainnya membuat operasi penghentian loop selemah mungkin.Ekspresipenghentianloop hendaknyajuga harnslengkap,dalam arti bahwa semuatest untuk penghentianloop hendaknyateIjadidalam ekspresiloop tersebut,bukandalam bodi. Loop lebih mudah dipahami bila semua kondisi penghentiannyaditampilkan bersama-sama dan tempat konvensional untuk melakukan hal iniadalah ekspresi penghentian loop tersebut.

5.5. TIPE-TIPEDALAMC

Pemakaian tipe data yang buruk dapat membingungkan, kesalahan, danmasalah portabilitas dalam program C. Terdapat beberapa sumber masalah :seperti yang disebutkan dalam Bab 4, C adalah tipe kaya bukan strongly typeddan memiliki banyakmemiliki tipe konversi. KeduaC memberikanakses tingkat'rendah kedalam komputer, yang menyebabkanmasalah portabilitas tipe. Ketigadifinisi bahasa C memberikanciri kunci khusus (seperti ukuran tipe data) untukimplementasi, sekali lagi dapat menyebabkan masalah portabilitas. Kitamempertimbangkan semua masalah ini dalam mempelajari praktek-praktekpenggunaan tipe-tipe dalam pemrogramanC.

C memiliki beberapa tipe integral dalam rane nilai mereka. Pilihan diantaratipe-tipe ini tergantungpada memoriyang diperlukanuntuk menyimpannilai tipetersebut, kecepatanpelaksanaanoperasi akan digunakan pada nilai tipe tersebut,keamanan dan portabilitaskode yang menggunakantipe tersebut, dan range nilaidimungkinkanolehtipe ini.Hal yangpalingpentingadalahyangterakhirkhususnya

101

Page 16: PEMROGRAMAN TINGKAT RENDAH - elearning.gunadarma.ac.idelearning.gunadarma.ac.id/docmodul/pengantar_rekayasa_perangkat_lunak/bab5.pdf · algoritma yang secara komputasional mahal bila

karena range nilai yang diperbolehkan oleh suatu tipe membawa sebagian besarinfonnasi kedalam pembaca program tentang peran obyek program. Aturan berikutini dapat membantu membuat pilihan diantara tipe-tipe integral dalam C :

. Gunakan tipe signed dari tipe unsigned. C tidak dapat memberikanpemeriksaan kesalahan yang baik untuk tipe unsigned : Nilai negatif dapatberubah kedalam konteks unsigned, dan dapat diinterprestasikan sebagaikuantitas unsigned, serta menyebabkankesalahan. Bila variabel atau fungsidideklarasikandengan tipe signed, meskipun bila aturan mereka dianggapunsigned, pemeriksaan nilai-nilai negatif dapat disisipkan oleh programer,dan indikasi lain (sepertioutputnegatit) lebihcenderunguntuk menunjukkankesalahan. Kekecualian untuk aturan ini dibuat hanya bila menggunakanstring bit atau bila range nilai memerlukannya.

. Gunakan tipe char untuk data karakter. Bila kita mendeklarasikanvariabelatau fungsi sebagaichar sedangkandata yang terlibat sebenarnyabukan datakarakter maka hal ini akan membingungkan. Oleh karena itu tipe charhendaknya hanya dipakai bila datanya adalah data karakter.

. Bila nilai yang diberikan dapat disajikan dalam bit yang kUrangdari 16,gunakan tipe INT, jika tidak gunakan tipe LONG. Temyata bahwa nilai!NT hampir selalu disajikan paling tidak dalam 16 bit, dan nilai LONGhampir disajikan dalam bit yang lebih dari 16.Jadi pemindahan dari INT keLONG pada 16 bit lebih baik dipakai untuk menghindari maSalahporting.

. Jangan gunakantipeshort kecualijika keterbatasanmemori memerlu~annya.Nilai tipe short diubah kedalam nilai int dalam ekspresi integer yangmelibatkan data int dan dalam argumen fungsi. Pengubahan ini tidak selaludilakukan dengan baik oleh compiler.

Cara lainuntukmenanganimasalahportabilitasdari tipe integraladlah dengancarn menggunakan file header pedefinisian tipe standard. Dalam file ini tipeintegral diberikannama khusus yang menunjukkanukuran dan isinya.Bila sistemditempatkan pada lingkungan yang bam, maka hanya typedef dalam file headeryang perlu dirubah. Sebagai contoh file header semacam ini dapat berisikantypedef seperti berikut.

102

Page 17: PEMROGRAMAN TINGKAT RENDAH - elearning.gunadarma.ac.idelearning.gunadarma.ac.id/docmodul/pengantar_rekayasa_perangkat_lunak/bab5.pdf · algoritma yang secara komputasional mahal bila

Kesulitan dengan pemecahan cara ini adalah bahwa beberapa tipe mungkintidak ada, sehingga masalah portabilitas masih akan tetap muncul.

e menyediakan dua tipe floating point : float dan double, tetapi semuaoperasi floating point, dan semua oilai floating point yang diberikan sebagaiparameter, menggunakan nilai double. Variabel float menempati ruang yanglebih sedikit bila dibandingkan double, tetapi nilai variabel ini selalu diubahkedalam double sebelumdigunakannya.Kode yang diperlukan untuk mengubahfloat kedalam double memerlukan waktu untuk melaksanakannya, dan seringmenggunakan tempat yang lebih banyak daripada bila disave denganmendeklarasikan beber.apa variable float sebagal pengganti double.Konsekuensinyasemua variable dan floating point hams dideklarasikan sebagaidouble.

Oleh karena e memiliki pemeriksaan tipe yang lemah, tipe pOinterdapatdiubah dengan bebas, pointer dapat menunjukkandata pada saat setiap saat, danpointer dapat diubahkedalamtipe integraldan sebaliknya.Semua praktektersebuttidak tepat sehingga membuat kode lebih sulit dipahami serta menyebabkanmaslaah portabilitasyang serius.Pengubahanantara tipe pointer serta khususnyaantara tipe integral dan pointer hendaknyajangan sampai teIjadi dalam kode eyang baik. Bila hal ini teIjadi, maka dia hams ditandai dengan operator yangjelas.

Sumber laindari kesalahantipe keciladalahargumenfungsi.Argumenfungsimempunyai dua kelompok kesalahan (bug) tipe. Kelompok pertama teIjadi bilacompiler e tidak memeriksa tipe argumen fungsi. Pencegahanyang terbaik agartidak teIjadi kesalahan ini adalah dengan menggunakan prototipe fungsi, yangmerupakan tipe fungsi e ANSI yang memeriksa mekanisme. eara lain yangterbaik adalah lint, piranti pemerlksaan sintac e yang handal (lihat Bab 7).

103

typedef S_INI'_8 char; /* signed 8 bit integer */

typedef U_INI'_8 unsigned char; */ unsigned 8 bit integer */

typedef S_INI'_16 short; /* signed 16 bit integer */

typedef U_INI'_16 unsigned short; /* unsigned 16 bit integer */

typedef S_INI'_32 int; /* signed 32 bit integer */

typedef U_INI'_32 unsigned; /* unsigned 32 bit integer */

typedef S_INI'_64 long; /* signed 64 bit integer */

typedef U_INI'_64 unsigned long; /* unsigned 64 bit integer */

Page 18: PEMROGRAMAN TINGKAT RENDAH - elearning.gunadarma.ac.idelearning.gunadarma.ac.id/docmodul/pengantar_rekayasa_perangkat_lunak/bab5.pdf · algoritma yang secara komputasional mahal bila

Kelompok kesalahan tipe argumen fungsi yang kedua muncul dari perubahan(konversi) yang digunakan pada argumen fungsi pada saat fungsi tersebut dipanggil.Argumen fungsi diubah menurut "konversi aritmatik biasa" pada saat pemanggilan:Nilai short dan char diubah kedalam int, nilai Ooat diubah ke double. Kesalahanringan kadang-kadang terjadi pada saat parameter fungsi memiliki tipe yangberbeda dari target konversi aritmatik biasa. Biasanya kesalahan ini merupakankesalahan compiler (kita telah menemukannya dalam beberapa compiler). Caraterbaik untuk menghindari kesalahan seperti ini adalah dengan tidakmendeklarasikan parameter fungsi dengan tipe yang bukan merupakan target darikonversi aritmatik biasa. Secara khusus parameter fungsi hendaknya tidakdideklarasikan sebagai char, short atau Ooat.

5.6. PENINGKATANEFISIENSI

Program sering memiliki keterbatasan unjuk kerja dalam spesiftkasinyasehingga program hams dapat membuat kode menjadi efisien serta betul, tepat,reliabledan dapat diperbaiki. Optimisasiadalahkegiatansetelahmengubahsistemsehingga lebih cepat dan lebih kecil. Salah satu alasan terkenalnya C adalahbahwa bah~a ini memberikan fasilitas yang dapat membuat optimisasi kodelebih mudah.Optimisasirriemangsulit.Usahayangtidaktepatseringmenyebabkanmasalah yang serius. Pada bagian ini kita akan menjelaskanbeberapa kesulitanoptimisasi kode C dan menerangkan cara-cara menghindarinya.

Aturan pertama pada optimisasi program dengan menghindari optimisasibila mungkin. Kode yang ditulis untuk kepentingan efisiensi biasanya kurangmudah dibaca, kurang tepat, kurang portable, dan lebih susah perawatannyadibandingkan yang sebaliknyayaitu mudah dibaca, tepat, portabilitas,dan mudahdirawat yang merupakan hal yang lebih penting daripada kecepatan. Optimisasimemerlukanbanyakwaktudan dapatmenimbulkankesalahan-kesaIahan.Biasanyaprogram dapat berjalan cukup cepat sebagaimana yang tertulis. Bila terdapatmasalah unjuk kerja, pertimbangkanlah alternatif untuk optimisasi. Salah satualternatif adalah dengan mengupgrade perangkat hardware atau sistem operasi.Dengan menambahkan chip memori atau coprocessor floating point dapatrneningkatkanunjuk kerja. Sistem operasiyang bam sering menampilkanbanyakkemajuan dalam sistem secara keseluruhan. Alternatif lainnya adalah denganmengupgrade compiler kita. Versi bam compiler atau compiler optimisasi dapatmemberikan kode yang lebih cepat dan lebih kecil.

104

Page 19: PEMROGRAMAN TINGKAT RENDAH - elearning.gunadarma.ac.idelearning.gunadarma.ac.id/docmodul/pengantar_rekayasa_perangkat_lunak/bab5.pdf · algoritma yang secara komputasional mahal bila

Dari piranti hardware atau software yang telah ditingkatkan tidak ada makamungkin kita hams menggunakan teknik optimisasi. Pencapaian terbesar berasaldari peningkatan stmktur data dan algoritma sistem. Topik ini yang mempakanbagian inti dari ilmu komputer dengan literatur yang banyak, berada diluarpembahasan kita. Bila sistem yang menggunakan algoritma, dan stmktur datayang baik masih gagal memenuhi tujuan unjuk kerja maka peningkatan dapatdibuat dengan menggunakan teknik yang disebut oleh Bentley sebagai writingefficient code. Teknik ini menysun kembali kode sumber yang diterjemahkankedalam kode obyek yang lebih efisien. Praktek yang baik mempakan hal yangpenting bila digunakan teknik optimisasi ini. Studi-studi empiris menunjukkanbahwa program-program khusus, sebagian waktunya digunakan untukmelaksanakan bagian kecil dari kode tersebut. Oleh karena itu unjuk kerja secarakeselumhan ditingkatkan hanya bila bagian yang benar dari sebuah sistemditingkatkan. Namun sayangnya para programer kurang memiliki kemampuandalam menentukan bagian sistem yang mempakan penghambat. Banyak usahayang dilakukan dengan sia-sia karena mengoptimalkan bagian sistem yang salah.Lebih Ianjut para programer juga kurang memiliki kemampuan dalammemperkirakan efisiensi konstruksi program altematif - kadang-kadang kodelebih lamban setelah programer meningkatkannya.

Sehubungan dengan itu kita menyarankan untuk menggunakan metode yangdibahas oleh Bentley. Pertama kali buatlah sistem dengan menggunakan teknikengineering software yang baik tanpa mencoba untuk mengoptimisasi \code,denganmenekankan pada pengembangan : Untuk mencapai kemudahan b~ ~a,realibilitaskebenaran dan sebagainya. Apabila sistem telah selesai ukurlah Ijuk kerjanya.

Bila belum. memenuhi tuntutan maka pelajari sistem untuk. menemukanpenghambatnya. Oleh karena programer tidak memiliki kemampuan yang baikdalam menentukan keberadaan hambatan, maka unjuk keIja sistem harus diukurdengan menggunakan piranti analisis unjuk keIja, atau profilers. Beberapa pirantiprofiling UNIX dibahas dalam Bab 7. Pecahkanlah masalah program secarasistimatis dengan membuat perubahan secara langsung. Ukurlah sistem setelahdiadakannya sistem untuk mengetahui bahwa pembahan tersebut benar-benarmerupakan peningkatan. Oleh karena optimisasi sering menimbulkan kesalahanjuga, maka sistem hams juga mempakan regresi yang diuji setelah tiap-tiapperubahan dibuat ( lihat Bab 8 ). Bila unjuk kerja sistem telah meningkat sehinggadapat memenuhi tuntutan yang dikehendaki, maka optimisasi hendaknyadihentikan. Semua program sudstansial dapat ditingkatkan, tetapi peningkatanyang bermanfaat biasanya dibuat lebih awal.

Bentley membahas beberapa teknik optimisasi. Berikut adalah sebagian'darikemungkinan-kemungkinan :

105

Page 20: PEMROGRAMAN TINGKAT RENDAH - elearning.gunadarma.ac.idelearning.gunadarma.ac.id/docmodul/pengantar_rekayasa_perangkat_lunak/bab5.pdf · algoritma yang secara komputasional mahal bila

. Simpanlah hasil yang telah dihitung sebelumnya untuk menurunkan biayakomputasi ulang serta fungsi yang mahal.

. Cache biasanya memerlukandata untuk mengurangiwaktu akses dan waktusearch.

. Bila mungkin lakukanlahlazy evaluationadalah merupakancarn untuk tidakmenghitung suatu hasil sampai hasil itu diperlukan.

. Kodekan pergerakan loop. Tempatkan kalkulasi yang tidak perlu lagidikerjakan pada masing-masingiterasi loop diluar loop,dengan menghindarikomputasi ulang atas nilai yang diketahui.

. Bukalah loop. Sebagai pengganti pemakaian loop, tulislah steatment yangakan dilakukan loop dengan menghindari overhead control loop.

. Gabungkan loop. Bila dua loop saling berdekatan dan memiliki data yangsarna, maka gabungkanlah mereka sehingga dapat dihindari loop extra.

Teknik optimisasi kode ini adalah bahasa pemrograman yang independen.Teknik ini yang biasanya berguna bagi C meliputi :

. Compilelah tanpa flag pemeriksa path, didebugger, dan profiler. Hal inidapat mengurangi waktu eksekusi dalam ukuran program.

. Deklarasikanvariabelyangseringdiakses,sepertivariabelcontrolloopdengankelas penyimpangan register.

. Gunakanlah macro ditempat fungsi penghambat yang pendek. Hal ini secaraumum dapat meningkatkan waktu eksekusi, tapi juga dapat menimbulkanbahaya. ( lihat bab sebelumnya ).

. Gantilah operasi index array dengan operasi poiQterdengan menghindariaritmatik pengindeksian loop. Teknik optimisasi ini dapat mencapai hasilyang luar biasa.Bentleymemberikanbanyakcontoh dimanakecepatantinggiberkisar dar 2 sampai 200.

5.7. KESIMPULAN

Seperti yang ditunjukkandalam bab ini terdapat rincian yang sangat banyaktentang praktek pemrograman C yang hams dipelajari, khususnya pada tingkatsteatment, ekspresi dan macro. Meskipun kita belum menyebutkan semuanyadengan alat apapun kita mempelajaribagian yang terpenting. Daftar ini terdapatdalam apendix d yang mengumpulkan sebagian besar yang telah kita bahas.

106