1 / 69

SUBPROGRAM DAN IMPLEMENTASINYA Pertemuan 7

SUBPROGRAM DAN IMPLEMENTASINYA Pertemuan 7. Matakuliah : KONSEP BAHASA PEMROGRAMAN Tahun : 2010. Outline Materi. Pendahuluan Konsep dasar subprogram Isu desain subprogram Lingkungan referensi lokal Metode pengiriman parameter Parameter yang berbentuk nama subprogram

Télécharger la présentation

SUBPROGRAM DAN IMPLEMENTASINYA Pertemuan 7

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. SUBPROGRAM DAN IMPLEMENTASINYAPertemuan 7 Matakuliah : KONSEP BAHASA PEMROGRAMAN Tahun : 2010

  2. Outline Materi • Pendahuluan • Konsep dasar subprogram • Isu desain subprogram • Lingkungan referensi lokal • Metode pengiriman parameter • Parameter yang berbentuk nama subprogram • Overloaded Subprograms • Generic Subprograms • Isu desain fungsi • User-Defined Overloaded Operators • Coroutine • Semantik call dan return • Implementasi ubprograms sederhana • Implementasi subprogram dengan variabel lokal stack-dynamik • Nested Subprograms • Blocks • Implementasi lingkup dinamik

  3. Pendahuluan • Tipe abstraksi • Abstraksi proses • Subprogram • Dikenal sejak awal pemrograman • Meningkatkan readability dengan mengekspose struktur logik sementara detilnya disembunyikan . • Abstraksi data • TDA • Dikenalkan dalam tahun 80-an • Terdiri dari data dan himpunan operasi • C int : +, -, *, / , %

  4. Fundamental Subprogram • Setiap subprogram mempunyai single entrypoint • Calling program (caller) ditunda selama eksekusi subprogram yang dipanggil • Kendali kembali ke caller saat ekseklusi called subprogram berakhir • Alternatif: • Co routines, subprogram dengan multi-entries • Concurrent unit • Metode OOP

  5. Definisi • Subprogram definition menguraikan antar-muka ke dan dari subprogram • Subprogram call adalah permintaan eksplisit agar subprogram dieksekusi • Subprogram header adalah bagian pertama dari definisi termasuk nama, tipe subprogram dan parameter formal • FORTRAN SUBROUTINE ADDER (parameter) • Ada procedure ADDER (parameter) • C void adder (parameter) • Parameter profile (i.e. signature) dari subprogram adalah banyak, urutan dan tipe parameter • Protocol adalah parameter profile subprogram dan jika ia fungsi, return type nya. • Subprogram declaration adalah protocol, tidak termasuk tubuh fungsi, dari subprogram • Deklarasi fungsi di C dan C++ kerap disebut prototypes

  6. Parameter • Isu • Akses ke non-lokal: mengurangi reliabilitas, atau • passing parameters: lebih luwes • Tipe parameter • Formal parameter adalah variabel dummy yang didaftar dalam subprogram header dan digunakan dalam subprogram • Actual parameter adalah nilai atau alamat yang digunakan dalam pemanggilan subprogram (call statement)

  7. Korespondensi Parameter Aktual-Formal • Posisional • Pengikatan parameter aktual ke formal melalui posisinya; parameter aktual pertama diikat ke parameter formal pertama dan seterusnya. • Aman dan efektif • Daftar parameter pendek • Keyword • Nama parameter formal dan formal diikat melalui kata kunci • Daftar parameter panjang • Parameter dapat muncul disembarang lokasi • Harus tahu nama parameter

  8. Nilai default Parameter Formal • Dalam bahasa tertentu (e.g., C++, Ada), parameter formal dapat mempunyai nilai default yang digunakan jika tidak ada parameter aktual di kirim • Di C++, parameter default harus muncul terakhir karena parameter adalah positionally associated. Tak ada keyword parameter • float computePay (float income, float taxRate, int exemption = 1); • C# dapat menerima banyak parameter bervariasi asalkan mereka sama tipenya.

  9. Prosedur dan Fungsi • Ada dua kategori subprogram • Procedures adalah koleksi pernyataan yang mendefinisikan komputasi berparameter; diaktifkan dengan pernyataan call ; menghasilkan nilai dengan cara • Mengubah parameter formal melalui transfer data • Mengubah nonlocal yang bukan parameter formal • Functions secara struktur mirip prosedur tetapi secara semantik dimodel pada fungsi matematika • Dipanggil melalui namanya dalam ekspresi • Hasil dikembalikan dan mengganti caller • Diekspektasi tidak ada efek samping • Prakteknya, fungsi mempunyai efek samping

  10. Isu Desain • Apa metode pengiriman parameter yang disediakan? • Apakah tipe parameter di-cek? • Apakah variabel lokal statik atau dinamik? • Dapatkah definisi subprogram muncul dalam definisi subprogram lain? • Dapatkah subprogram di-overload? • Dapatkan subprogram generik? • Kasus di C/C++ • Hanya fungsi tetapi perilaku seperti subprogram/prosedur • Tidak ada nilai balik didefinisikan sebagai void • S and alone call ke fungsi void adalah legal void sort (int list[ ], int listLen); … sort (scores, 100);

  11. Lingkungan Referensi Lokal • Didefinisikan dalam subprogram • Variabel lokal dapat stack-dynamic • Keuntungan • Mendukung rekursi • Ruang untuk lokal di-share diantara beberapa subprogram • Kerugian • Alokasi/de-alokasi, waktu inisialisasi • Pengalamatan tidak langsung • Subprogram tidak dapat history sensitive • C/C++: lokal adalah stack dynamic kecuali di-declare sebagai statik • Variabel lokal mungkin statik • Lebih efisien i.e. akses langsung • Tak ada run-time overhead • History sensitive • Tidak mendukung recursion

  12. Metode Pengiriman Parameter • Cara bagaimana parameter di-transmit ke dan/atau dari subprogram • Pass-by-value (mode in) • Pass-by-result (mode out) • Pass-by-value-result (mode inout) • Pass-by-reference (mode inout) • Pass-by-name (mode inout)

  13. Model Pengiriman Parameter

  14. Pass by Value • Nilai parameter aktual digunakan untuk inisialisasi parameter formal pasangannya. • Biasanya diimplementasikan melalui copying. • Data aktual di-transfer sehingga akses lebih efisien • Dapat diimplementasikan dengan mengirim jalur akses tetapi tidak dianjurkan • Jika copy digunakan, dibutuhkan tambahan ruang • Costly, i.e. tambahan ruang dan operasi copy

  15. Pass by Result • Jika parameter di passed by result, tak ada nilai dikirim ke subprogram; lokal dikirim balik ke caller • Parameter formal pasangannya berlaku sebagai variabel lokal; nilainya dikirim balik ke parameter aktual saat kendali dikembalikan ke caller. • Membutuhkan ruang tambahan dan operasi copy • Potensi masalah: parameter aktual collision procedure sub (y: int, z: int) … sub(p1, p1); apapun parameter formal yang di-copy balik akan menjadi nilai p1 nilai p1 tergantung pada urutan assignment di return; masalah portabilitas • Dua waktu berbeda untuk evaluasi alamat aktual • Pada waktu call, atau • Padawaktu return

  16. Pass by Value-Result • Kombinasi pass-by-value dan pass-by-result • Aktual di-copy ke formal dan kemudian copy balik. • Kadang-kadang disebut pass-by-copy • Parameter formal mempunyai local storage • Kerugian : • Sama dengan pass-by-result dan pass-by-value

  17. Pass by Reference • Kirim jalur akses biasanya alamat • Aktual di-share sehingga disebut pass-by-sharing • Proses pengiriman efisien (waktu, ruang, tak ada copying dan tak ada duplikasi storage) • Kerugian • Akses lambat, dibandingkan dengan pass-by-value, ke parameter formal • Potensi terjadi efek samping yang tak diinginkan • Potensi alias yang tak diinginkan

  18. Pass by Reference (lanjutan) • Meng-create alias • Parameter aktual collisions • void fun(int* first, int* second); • fun(&total, &total); • first dan second akan aliases • Elemen array collisions • fun(&list[i], &list[j]); // if i=j • Collision antara elemen array dan elemen array yang di-pass sebagai nama array • Fun1(&list[i], &list); • Collision antara formal dan non-local

  19. Pass by Reference (lanjutan) • int* global; void sub(int* local){ void main() { extern int* global; extern int* global; … … } sub(global); } • Dalam sub, lokal dan global adalah aliases • Kerugian dengan aliases: mengganggu readability sehingga mengganggu reliability • Gunakan pass by value result bukannya pass by reference untuk menghilangkan aliases

  20. Pass by Name • Substitusi tekstual ke formal • Formal diikat ke metode akses saat call, tetapi pengikatan aktual ke nilai atau alamat terjadi saat referensi atau penugasan • Memungkinkan fleksibilitas dalam late binding • Pengikatan dinamik dan polimorfisme (OOPL) • Lazy evaluation • Evaluasi short circuit dari B-ekspresi • Evaluasi semua ekspresi di bahasa fungsional Haskel • Semantiks • Jika aktual skalar, pass by reference • Jika aktual adalah ekspresi konstan, pass by value • Jika aktual elemen array, like nothing else • Jika aktual adalah ekspresi yang memuat variabel, like nothing else

  21. Implementasi Pengiriman Parameter • Dalam kebanyakan bahasa komunikasi parameter terjadi melalui run-time stack • Pass-by-reference yang paling sederhana untuk diimplementasikan; hanya alamat yang perlu diletakkan di stack • Eror fatal mungkin terjadi dengan pass-by-reference dan pass-by-value-result: parameter formal yang berpasangan dengan konstanta dapat secara tak sengaja diubah

  22. Implementasi Pengiriman Parameter (lanjutan) • Fortran • Selalu menggunakan model semantik inout • Sebelum Fortran 77: pass-by-reference • Fortran 77 dan berikutnya: skalar kerap menggunakan passed by value-result • C • Pass-by-value • Pass-by-reference dilakukan menggunakan pointers sebagai parameters tetapi tak ada yang dikirim balik • C++ • Tipe pointer khusus disebut reference untuk pass-by-reference; de-referensi secara implisit • Java • Semua parameter di passed by value • Parameter object di passed by reference • Skalar tak dapat di passed by reference karena variabel reference tak dapat menunjuk skalar dan Java tidak punya pointer

  23. Implementasi Pengiriman Parameter (lanjutan) • Ada • Tiga mode semantik pengiriman parameter : in, out, in out; mode default adalah in • Parameter formal yang di-declareout dapat di-assign tetapi tidak direferensi; yang di-declarein dapat direferensi tetapi tidak di-assign; parameter in out dapat direferensi dan di-assign • C# • Metode default : pass-by-value • Pass-by-reference dispesifikasi dengan cara parameter formal dan aktual didahului dengan ref • PHP: sangat mirip dengan C# • Perl: semua parameter aktual secara implisit diletakkan dalam predefined array named @_

  24. Pencekan Tipe Parameter • Sangat penting untuk reliability • FORTRAN 77 dan C asli : tidak • Pascal, FORTRAN 90, Java, dan Ada: selalu diperlukan • ANSI C dan C++: pilihan dibuat oleh pengguna • Prototipe • Bahasa-bahasa baru seperti Perl, JavaScript, dan PHP tidak memerlukan pencekan tipe

  25. Array Multidimensi sebagai Parameter • Jika array multidimensi dikirim ke subprogram dan subprogram dikompail secara terpisah, kompilator perlu mengetahui ukuran array yang dideklarasikan untuk menentukan ruang untuk fungsi pemetaan • Kasus di C/C++ • Pemrogram diharuskan untuk memasukkan semua ukuran deklarasi kecuali subskrip pertama dalam parameter aktual; untuk array dua dimensi kita perlu tahu banyak kolom bukannya banyak baris • Masalah : Tidak memungkinkan menulis fungsi yang dapat menerima array dengan banyak kolom berbeda sehingga tidak memungkinkan menulis program yang luwes. • Solusi: kirim pointer ke array dan ukuran dimensi sebagai parameter yang lain; pengguna harus memasukkan storage mapping function menggunakan aritmatika pointer

  26. Array Multidimensi sebagai Parameter di sejumlah bahasa • Pascal • Tak ada masalah karena ukuran deklarasi adalah bagian dari tipe array • Ada • Constrained arrays – seperti Pascal • Unconstrained arrays – ukuran deklarasi adalah bagian dari deklarasi obyek • Fortran • Parameter formal yang dipunyai array dideklarasi sesudah header • Untuk array dimensi satu, subscript tidak relevan • Untuk array multi-dimensi , subscripts menentukan storage-mapping function • Java dan C# : mirip ada • Array adalah obyek; mereka semua adalah dimensi satu tetapi elemennya dapat berupa array • Setiap array mewarisi named constant (length di Java, Length di C#) yang di-set ke panjang array saat obyek array di-create

  27. Isu Desain Pengiriman Parameter • Dua pertimbangan utama • Efisiensi • Transfer data: one-way atau two-way • Tetapi ada konflik pada pertimbangan di atas • Pemrograman yang baik menganjurkan akses terbatas pada variabel, yang berarti jika mungkin one-way • Tetapi pass-by-reference lebih efisien untuk mengirim struktur yang ukurannya signifikan

  28. Parameter berbentuk Nama Subprogram • Kadang-kadang menyenangkan untuk mengirim nama subprogram sebagai parameter • Isu: • Apakah parameter dicek tipenya? • Apa lingkungan referensi yang benar untuk subprogram yang dikirim sebagai parameter?

  29. Parameter berbentuk Nama Subprogram: Pencekan Tipe • C dan C++: fungsi tak dapat dikirim sebagai parameter tetapi pointer ke fungsi dapat dikirim; parameter dapat dicek tipenya • FORTRAN 95 cek tipe • Pascal versi akhir dan Ada tidak membolehlan subprogram sebagai parameter; sebagai alternatif diberikan melalui fasilitas Ada’s generik

  30. Parameter berbentuk Nama Subprogram: Lingkungan Referensi • Shallow binding: Lingkungan pernyataan call yang mempengaruhi pengiriman subprogram • Deep binding: Lingkungan dari definisi subprogram yang dikirim • Ad hoc binding: Lingkungan dari pernyataan call yang mengirim subprogram

  31. Overloaded Subprogram • Overloaded subprogram adalah subprogram yang mempunyai nama yang sama dengan subprogram lain dalam lingkungan referensi yang sama. • Setiap versi overloaded subprogram mempunyai protokol unik, i.e. harus berbeda dari yang lain dalam hal banyak, urutan atau tipe parameter atau tipe nilai balik jika berbentuk fungsi. • C++, Java, C#, dan Ada mencakup predefined overloaded subprograms • Di Ada, tipe balik dari overloaded function dapat digunakan untuk tidak membingungkan calls (jadi dua overloaded functions dapat mempunyai parameter yang sama) • Ada, Java, C++, dan C# memungkinkan pengguna untuk menulis banyak versi subprogram dengan nama yang sama

  32. Subprogram Generik • Generic atau polymorphic subprogram mempunyai tipe parameter berbeda pada aktivasi berbeda • Overloaded subprogram adalah ad hoc polymorphism • Subprogram yang mempunyai generic parameter yang digunakan dalam ekspresi yang menguraikan tipe parameter subprogram adalah parametric polymorphism

  33. Polimorfisme Parametrik : C++ • template <template parameter> • Definisi fungsi yang mencakup template parameter template <class Type> Type max(Type first, Type second) { return first > second ? first : second; } • Template di atas dapat di-instantiate untuk sembarang tipe untuk mana operator > didefinisikan int max (int first, int second) { return first > second? first : second; }

  34. Isu Desain Fungsi • Apakah efek samping dimungkinkan? • Parameter seharusnya selalu mode in untuk mengurangi efek samping seperti Ada • Tipe nilai balik apa yang dibolehkan? • Kebanyakan bahasa imperatif membatasi tipe balik • C membolehkan sembarang tipe kecuali array dan fungsi • C++ seperti C tetapi juga membolehkan tipe user-defined • Ada membolehkan sembarang tipe • Java dan C# tidak punya fungsi tetapi method dapat mempunyai sembarang tipe

  35. Operator Overloaded User-Define • Operator dapat di-overload di Ada dan C++ • Contoh Ada Function “*”(A,B: in Vec_Type): return Integer is Sum: Integer := 0; begin for Index in A’range loop Sum := Sum + A(Index) * B(Index) end loop return sum; end “*”; … c = a * b; -- a, b, and c are of type Vec_Type

  36. Co-routine • Coroutine adalah subprogram yang mempunyai multiple entries dan mengkontrol dirinya sendiri • Juga disebut symmetric control: caller dan called coroutines adalah setara basisnya • A coroutine call disebut resume • Resume pertama adalah keawal coroutine, tetapi call berikutnya masuk di titik sesudah pernyataan terakhir yang dieksekusi dalam coroutine • Coroutine mengulangi resume satu sama lain, mungkin seterusnya • Coroutines menyediakan quasi-concurrent execution dari unit program (the coroutines); ekselusinya interleave, tetapi tidak overlapped

  37. Ilustrasi Co-routine (1)

  38. Ilustrasi Co-routine (2)

  39. Ilustrasi Co-routine (3)

  40. Semantik Call dan Return • Operasi subprogram call dan return suatu bahasa bersama-sama disebut subprogram linkage • Subprogram call mempunyai berbagai aktivitas yang berasosiasi dengannya yaitu • Metode pengiriman parameter • Variabel lokal statik • Eksekusi status calling program • Transfer kendali • Subprogram nesting

  41. Semantik Call dan Return Program Sederhana • Call • Simpan status eksekusi dari caller • Lakukan proses pengiriman parameter • Kirim alamat kembali ke callee • Transfer kendali ke callee • Return • Jika digunakan pass-by-value-result, kirim nilai parameter formal ke parameter aktual pasangannya. • Jika fungsi , kirim nilai fungsi ke tempat caller dapat mengakssesnya • Restore status eksekusi dari caller • Transfer kendali kembali ke caller

  42. Implementasi Suprogram Sederhana • Dua bagian terpisah : bagian kode aktual dan nonkode (variabel lokal dan data yang dapat diubah) • Format dari bagian nonkode yang dieksekusi disebut activation record • Activation record instance (ARI) adalah contoh kongkrit dari record aktivasi (koleksi data untuk aktivasi subprogram tertentu) • Record aktivasi subprogram sederhana

  43. Kode dan Record Aktivasi Subprogram Sederhana • Kode dan record aktivasi program sederhana

  44. Implementasi subprogram dengan variabel lokal stack-dynamic • Record aktivasi lebih kompleks • Kompilator harus men-generate kode untuk melakukan alokasi dan de-alokasi variabel lokal secara implisit • Rekursi harus didukung dengan menambah peluang aktivasi multiple subprogram secara simultan

  45. Tipikal Record Aktivasi dengan Variabel Lokal Stack-Dynamic

  46. Record Aktivasi dengan Variabel Lokal Stack-Dynamic • Format record aktivasi adalah statik tetapi ukurannya mungkin dinamik • Dynamic link menunjuk top ARI caller • ARI dibentuk secara dinamik saat subprogram dipanggil • Run-time stack

  47. Contoh Fungsi C void sub(float total, int part) { int list[4]; float sum; … }

  48. Contoh Tanpa Rekursi void A(int x) { int y; ... C(y); ... } void B(float r) { int s, t; ... A(s); ... } void C(int q) { ... } void main() { float p; ... B(p); ... }

  49. Contoh tanpa Rekursi

More Related