290 likes | 544 Views
Bab 4. Paradigma Pengaturcaraan. 4.1. Bahasa Imperatif. Menurut Milulinovic (1989), bahasa pengaturcaraan boleh diklasifikasikan mengikut taksonomi arkitektur yang berpandukan kepada aliran pengiraan (computational flow) seperti berikut:
E N D
Bab 4 Paradigma Pengaturcaraan
4.1. Bahasa Imperatif • Menurut Milulinovic (1989), bahasa pengaturcaraan boleh diklasifikasikan mengikut taksonomi arkitektur yang berpandukan kepada aliran pengiraan (computational flow) seperti berikut: • Arkitektur aliran-kawalan atau berasaskan kawalan (control-driven) – jujukan arahan menentukan aktiviti pemprosesan, dan data dikumpul apabila arahan memerlukannya • Arkitektur aliran-data atau berasaskan data (data-driven) – aktiviti pemprosesan dikawal oleh kesediaaan atau kewujudan data, iaitu arahan dilaksanakan apabila data yang diperlukan oleh arahan tersebut bersedia untuk dioperasi • Arkitektur berasaskan permintaan (demand-driven) – suatu arahan disediakan (enabled) untuk dilaksanakan apabila hasil perlaksanaannya diperlukan, iaitu apabila operan bagi suatu arahan yang lain telah bersedia untuk dioperasikan.
4.1.1. Prinsip Rekabentuk Pengaturcaraan Imperatif • Bahasa imperatif adalah suatu implementasi arkitektur aliran-kawalan • Prinsip rekabentuk bahasa imperatif adalah berasaskan kepada konsep aliran kawalan perlaksanaan suatu aturcara yang digunakan dalam model Von Neumann • Dalam model ini, suatu aturcara terdiri daripada arahan-arahan ang disimpan dalam lokasi ingatan, dan suatu daftar (register) yang dikenali sebagai pembilang aturcara. Pembilang aturcara ini menentukan arahan yang mana yang perlu dulaksanakan seterusnya.
4.1.1. Prinsip Rekabentuk Pengaturcaraan Imperatif • Secara amnya, suatu bahasa pengaturcaraan dikategorikan sebagai bahasa imperatif sekiranya ia mempunyai ciri-ciri berikut: • Perlaksanaan arahan secara berjujukan • Menggunakan pembolehubah yang mewakili nilai suatu lokasi ingatan • Menggunakan pernyataan umpukan untuk mengubah nilai suatu pembolehubah dan membenarkan aturcara melakukan operasi terhadap nilai-nilai ini. • Bahasa imperatif juga dipanggil bahasa berprosedur(procedural language) atau bahasa berstruktur(structured language).
4.1.1. Prinsip Rekabentuk Pengaturcaraan Imperatif • Unit asas suatu bahasa imperatif adalah tindakan (action) yang boeh diklasifikasikan kepada 3: • Tindakan pengiraan (computational), seperti operasi aritmetik • Tindakan aliran-kawalan seperti perbandingan dan pernyataan gelung • Tindakan input-output seperti operasi tulis dan baca • Tindakan-tindakan ini mempunyai capaian ke atas storan umum yang mengandungi lokasi-lokasi ingatan.
4.1.1. Prinsip Rekabentuk Pengaturcaraan Imperatif • Setiap lokasi ingatan boleh berkeadaan seperti berikut: • Mengandungi data, bermakna lokasi ini telah diikat kepada suatu objek data (allocated), dan mengandungi data • Tidak didefinasikan, bermakna lokasi ini telah diikat, tetapi belum mengandungi data • Tidak digunakan, bermakna lokasi ini tidak diikat ke mana-mana objek data (not allocated) • Data yang disimpan di dalam lokasi ingatan berada dalam keadaan yang stabil selagi pengikatan tidak dimansuhkan (deallocated) atau data baru dimasukkan ke dalamnya.
4.1.1. Prinsip Rekabentuk Pengaturcaraan Imperatif • Perubahan boleh yang berlaku kepada suatu lokasi ingatan termasuk: • Penyimpanan data ke dalam suatu lokasi • Deallocation suatu lokasi ingatan mengubah keadaan suatu lokasi ingatan kepada ‘tidak digunakan’ (unused) • Allocation suatu lokasi ingatan suatu lokasi ingatan yang tidak digunakan dicari, dan menukarkan status lokasi tersebut kepada ‘allocated’. • Capaian suatu lokasi ingatan mendapatkan data semasa yang disimpan di dalam lokasi
4.1.2. Aliran Kawalan Pengaturcaraan Imperatif • Pengaturcaraan imperatif menggunakan prinsip aliran kawalan yang berstruktur. • Suatu aturcara dikatakan berstruktur jika aliran kawalannya jelas pada struktur sintaks teks aturcara. • Secara amnya, aliran kawalan atau jujukan perlaksanaan suatu aturcara imperatif adalah berasaskan konsep ‘single-entry and single-exit’ perlaksanaan aturcara dilakukan melalui struktur binaan (constructs) yang menentukan tindakan-tindakan tertentu, dan boleh dilihat pada dua paras: • Struktur berorientasikan-pernyataan (statement-oriented) • Struktur berorientasikan-blok (block-oriented)
Struktur Berorientasikan-Pernyataan • Merujuk kepada perlaksanaan suatu pernyataan yang membentuk komponen-komponen individu suatu aturcara. Contohnya: x = y; • Perlaksanaan pernyataan ini dilakukan dengan menggunakan suatu jujukan pernyataan seperti di bawah: temp = x; x = y; y = temp;
Struktur Berorientasikan-Blok • Merujuk kepada komponen individu aturcara yang sebenarnya adalah suatu blok – suatu koleksi pernyataan yang mana pembolehubah dan pernyataan adalah bersifat setempat • Contohnya, prosedur dan modul. • Dalam bahasa Ada, ALGOL-68, Modula, dan C, prosedur adalah binaan blok yang utama
4.1.3. Langkah Perlaksanaan Pengaturcaraan Imperatif • Secara amnya, perlaksanaan dilakukan seperti berikut: • Kompilasi – aturcara diterjemahkan kepada kod objek yang boleh di’relocate’ (relocatable)kod intermediate yang sesuai dengan sistem komputer yang sedang digunakan • Pemautan – Incorporate pustaka yang diperlukan kepada aturcara, yang mana pusataka ini telahpun dikompil • Pemuatan – kod objek tadi disimpan ke dalam ingatan untuk dilaksanakan kod objek ditukar kepada format yang sesuai untuk dilaksanakan, dan proses pengikatan berlaku • Perlaksanaan – aliran kawalan perlaksanaan aturcara berlaku mengikut jujukan pernyataan
4.1.4. Kelemahan Pengaturcaraan Imperatif • Terdapat beberapa masalah dalam pengaturcaraan imperatif: • Kesukaran dalam reasoning (difficulty in reasoning) • Rujukan yang telus (referential transparency) • Kesan sampingan (side effects) • Capaian yang bebas (Indiscriminate Access) • Capaian yang vulnerable (Vulnarability access) • Tiada tindanan takrifan (no overlapping definitions)
Kesukaran dalam reasoning (difficulty in reasoning) • Sukar untuk menyemak kebenaran (correctness) suatu atucara kerana ia bergantung kepada kandungan setiap lokasi ruang ingatan. • Untuk memahami perjalanan suatu aturcara, ia perlu dijejak secara mental menjadi suatu tugas yang remeh jika melibatkan banyak lokasi ingatan
Ketelusan rujukan (referential transparency) • Suatu sistem dikatakan telus rujukannya jika makna keseluruhan sistem boleh ditentukan dengan hanya melihat makna komponen-komponennya. • Misalnya, bagi ungkapan matematik F(x) + G(x), F(x) boleh ditukar dengan H(x) sekiranya diketahui H(x) menghasilkan nilai yang sama seperti (F(x). • Tetapi dalam bahasa pengaturcaraan imperatif, ini tidak dapat dipastikan kerana maksud suatu ungkapan bergantung kepada pengiraan yang telah berlaku ke atas subungkapannya. • Pernyataan umpukan, penghantaran parameter secara rujukan, dan pembolehubah sejagat adalah sebab utama kenapa bahasa imperatif tidak telus secra rujukannya menjadikan aturcara sukar untuk dibaca, modifikasi, dan ditentukan kebenarannya
Kesan sampingan (side effects) • Dalam bahasa imperatif, terdapat pernyataan yang diolah khusus untuk kesan sampingan yang dihasilkan oleh suatu pengiraan. Contohnya, penggunaan operasi tokokan dan susutan dalam C sum[i++] = total; • Pengoperasi ini mempunyai kesan sampingan disamping menghasilkan nilai tertentu, ia juga mengubah nilai pembolehubah yang digunakan • Walaupun penggunaan ini memudahkan, tetapi ia boleh menimbulkan masalah.
Kesan sampingan (side effects) • Contoh 1: class_list[index++] = class_list[index++] = 0; bergantung kepada bila index ditambah, penyataan boleh menghasilkan output yang berbeza adalah lebih selamat jika pernyataan dipecahkan kepada: class_list[index++] = 0; class_list[index++] = 0;
Kesan sampingan (side effects) – Contoh 2 Kesan sampingan fungsian berlaku apabila sautu fungs mengubah nilai pembolehubah sejagat int number = 10; int check_first() { number = 25; return 5; } void check-second() { number = number + check_first(); } void main() { check_second(); } nilai yang dihasilkan bergantung kepada bagaimana operan dalam pernyataan number = number + check_first(); dinilai hasil boleh menjadi 15 atau 30
Capaian yang bebas (Indiscriminate Access) • Berlaku apabila pengaturcara tidak dapat mengekang atau mengelak suatu pembolehubah atau struktur data dari dicapai secara bebas. • Contohnya, penggunaan timbunan dalam suatu aturcara ALGOL:
Capaian yang bebas (Indiscriminate Access) Begin Integer array S[1:100]; Integer TOP; Procedure PUSH(x); Integer x; Begin TOP = TOP + 1; S[TOP] = x; End; Procedure POP(x); Integer x; Begin POP = S[TOP]; TOP = TOP – 1; End; TOP = 0; : (penggunaan PUSH dan POP) end;
Capaian yang bebas (Indiscriminate Access) • S, suatu timbunan mesti diisytiharkan dalam blok yand sama seperti PUSH dan POP, supaya ia boleh ‘dilihat’ (dicapai) oleh kedua-dua prosedur ini • PUSH dan POP perlu dilihat oleh segmen yang menggunakannya perlu diisytiharkan dalam blok yang sama dengan penggunanya timbunan S juga ‘dilihat’ oleh pengguna PUSH dan POP • Masalahnya, tiada jaminan bahawa pengguna ini akan melakukan modifikasi terhadap timbunan S hanya melalui prosedur PUSH dan POP, sebaliknya mungkin mengubahnya secara langsung tanpa menggunakan PUSH dan POP
Capaian yang vulnerable (Vulnarability access) • Berlaku apabila suatu segmen aturcara tidak dapat mengawal andaian yang telah dibuat tentang perlaksanaannya. • Punca masalah adalah pengisytiharan baru yang boleh diselitkan di antara blok takrifan dan penggunaan suatu pembolehubah • Contohnya, pertimbangkan segmen aturcara ALGOL berikut: Begin Integer x; : begin real x; : x = x + 1; : end; : end;
Capaian yang vulnerable (Vulnarability access) • masalah timbul apabila secara tidak sengaja semasa penyelenggaraan, suatu pembolehubah setempat diperlukan dalam aturcara yang panjang • Secara amnya, kesan sampingan, capaian bebas dan vulnerable boleh disimpulkan sebagai hasil daripada konsep pewarisan implicit yang digunakan dalam bahasa pengaturcaraan imperatif skop suatu pembolehubah dipanjangkan kepada blok dalaman
Tiada tindanan takrifan (no overlapping definitions) • Masalah timbul apabila suatu aturcara yang besar ingin diubah ke bentuk bermodular • Contohnya, andaikan suatu aturcara terdiri daripada prossedur P1, P2, P3 dan P4, yang mana P1 dan P2 berkomunikasi melalui suatu struktur data yang dikongsi, DATA1, manakala P2, P3, dan P4 berkomunikasi melalui suatu struktur data yang dikongsi, DATA2. • Rajah • Hasilnya, secara tidak langsung, P1 boleh juga mencapai DATA2, dan P3 dan P4 boleh mencapai DATA1, sedangkan capaian ini tidak diperlukan boleh mengakibatkan masalah penyelenggaraan dan keselamatan data.
4.1.5. Kriteria yang Diingini dalam Pengaturcaraan Imperatif • Berikut adalah beberapa criteria yang dingini dalam bahasa imperative, yang dijangka dapat menghindari kebanyakan masalah yang telah dibincangkan: • Tiada pewarisan implicit • Terdapat perbezaan capaian ke atas struktur data • Bentuk Ungkapan yang natural • Penggunaan Kurungan untuk mengelak ambiguity • Memecahkan Ungkapan yang kompleks
Tiada pewarisan implicit • Secara default, skop suatu pembolehubah tidak dipanjangkan (diwariskan) kepada blok dalaman tiada pewarisan implicit • Ini boleh mengelak masalah kesan sampingan, capaian bebas, dan vulnerable
Terdapat perbezaan capaian ke atas struktur data • Terdapat jenis capaian data yang berbeza. • Contohnya, mungkin penggun ahanya boleh membuat capaian read-only manakala pengguna lain capaian read-write. • Ini juga boleh mengelak maslaah kesan sampingan san vulnerability
Bentuk Ungkapan yang natural • Ungkapan perlu ditulis dalam bentuk yang boleh difahami • Contohnya, ungkapan perbandingan yang mengandungi negasi sukar difahami : If ( !(block_id < block_1) || !(block_id >= block_2) ) Ungkapan ini boleh ditulis dalam bentuk positif seperti berikut: If ( ( block_id >= block_1 ) || ( ( block_id < block_2 ) )
Penggunaan Kurungan untuk mengelak ambiguity • Perlu gunakan kurungan apabila menggabungkan beberapa pengoperasi yang berbeza jenisnya • Misalnya dalam C, terdapat petua keutmaan, dan tanpa kurungan, kesilapan mudah berlaku If ( *&MASK == BITS) Bermaksud If ( * & (MASK == BITS) ) Kerana dalam C, pengoperasi bit seperti & dan | mempunyai keutamaan yang lebih rendah berbanding pengoperasi hubungan seperti == Oleh itu , ia perlu ditulis sebagai: If ( (*&MASK) == BITS)
Memecahkan Ungkapan yang kompleks • Bahasa C, C++ dan Java mempunyai ungkapan, sintaks dan pengoperasi yang boleh diperlbagaikan, membolehkan pengolahan ungkapan yang berbeza dalan satu binaaan tunggal • Contohnya: Y = m ? m * x + c : c; Pernyataan ini lebih mudah dibaca jika ditulis seperti berikut: if (m) y = m*x + c; else y = c;