Programming Language Concept Session 7
Dasar Subprogram
- Muncul karena penggunaan suatu kumpulan data berulang-ulang
- Tiap subprogram memiliki satu tempat masuk
- Program pemanggil ditangguhkan selama eksekusi dari subprogram yang dipanggil
- Kontrol selalu kembali ke pemanggil ketika eksekusi subprogram yang dipanggil berakhir
- Subprogram header, yang merupakan bagian pertama definisi, berfungsi dalam banyak hal:
– Menjelaskan bahwa unit sintaktik selanjutnya merupakan definisi subprogram dari berbagai macam tertentu
– Sebagai nama dari subprogram
– Menjelaskan daftar parameter
– Contoh di C:void adder (parameters)
- Formal parameter merupakan parameter yang berada di subprogram header
- Parameter yang berada di pemanggil subprogram disebut actual parameter
- Subprogram yang mengembalikan nilai disebut function
- Subrprogram yang tidak mengembalikan nilai disebut procedure
- Overloaded subprogram merupakan subprogram yang memiliki nama sama dengan subprogram lain di lingkungan alamat yang sama
- Generic subprogram merupakan subprogram yang komputasinya dapat diselesaikan di data dari tipe berbeda di panggilan yang berbeda juga
- Closure merupakan nested subprogram dan lingkungan pengalamatannya
Local Referencing Environment
- Variable local dapat berbentuk stack-dynamic
– Keuntungan : mendukung recursion, penyimpanan local bisa dipakai subprogram lain
– Kelemahan : alokasi/de-alokasi, pengalamatan tidak langsung, subprogram tidak history sensitive - Variable local dapat berbentuk static
– Keuntungan dan kelemahannya bertolak belakang dengan stack-dynamic
Parameter Passing
- Formal parameter yang dapat menerima data dari actual parameter yang tepat disebut in mode
- Formal parameter yang dapat mengirim data ke actual parameter disebut out mode
- Formal parameter yang dapat melakukan in dan out mode disebut inout mode
- Model parameter passing:
- Ketika suatu parameter passed by value (in mode), nilai dari actual parameter tersebut digunakan untuk menyatakan formal parameter yang sesuai
– Biasanya diimplementasi dengan meng-copy
– Dapat diimplementasikan dengan mengirim jalur akses namun tidak direkomendasi
– Keuntungan : lebih cepat di linkage cost dan waktu akses
– Kelemahan : memori tambahan diperlukan dan memerlukan harga yang tidak kecil (costly) - Ketika suatu parameter passed by result (out mode), tidak ada nilai yang dikirimkan ke subprogram, formal parameter yang sesuai bertindak sebagai local variable; nilainya dikirimkan ke actual parameter pemanggil ketika control dikembalikan ke pemanggil tersebut
– Membutuhkan lokasi penyimpanan extra dan duplikat operasi - Gabungan dari pass by result dan pass by value adalah pass by value-result (inout mode)
– Juga dikenal dengan pass by copy karena actual parameter dicopy ke formal parameter di tempat masuk subprogram dan kemudian dicopy kembali di akhir subprogram
– Kelemahan : sama seperti pass by result dan pass by value - Tak seperti pass by result-value yang meng-copy nilai data kembali dan kedepan, pass by reference (inout mode) hanya mengirimkan suatu acess path, biasanya alamat, ke subprogram yang dipanggil.
– Keuntungan : Efisien, waktu maupun tempat
– Kelemahan : akses ke formal parameter lebih lambat, berpotensi terjadi side effect yang tak diinginkan, alias yang tak perlu - Ketika pass by name (inout mode), actual parameternya secara tekstual diganti untuk semua formal parameter yang tepat di semua kejadian di subprogram
– Formal parameter diikat ke suatu metode akses saat pemanggilan, namun pengikatan sebenarnya ke suatu nilai atau alamat terjadi diwaktu assignment atau reference
– Kelemahan : terlalu kompleks sehingga mengurangi readability dan reliability, sulit diimplementasikan dan tidak efesien - Implementasi metode parameter-passing:
– Kebanyakan bahasa, komunikasi parameter terjadi di run-time stack
– Pass by reference merupakan yang paling sederhana untuk diimplementasikan karena hanya alamat yang diletakkan di stack
Function header: void sub(int a, int b, int c, int d)
Function call in main: sub(w, x, y, z)
(pass w by value, x by result, y by value-result, z by reference)
- Yang perlu diperhatikan dalam parameter passing:
– Efesiensi, data transfer one-way atau two way
– Namun keduanya saling bertolak belakang, programming yang baik menganjurkan pembatasan akses ke variable yang artinya one-way lebih baik, namun pass by reference lebih efesien untuk melemparkan struktur size yang signifikan - Terkadang lebih mudah untuk melemparkan nama subprogram sebagai parameter
– Shallow binding : lingkungan pernyataan pemanggil yang menetapkan subprogram yang dilempar (paling natural untuk bahasa dynamic-scoped)
– Deep binding : lingkungan define dari subprogram yang dilemparkan (paling natural untuk bahasa static scoped)
– Ad hoc binding : lingkungan pernyataan pemanggil yang melemparkan subprogram - Biasanya ketika ada beberapa subprogram yang mungkin dipanggil dan tidak diketahui yang mana hingga eksekusi, maka di bahasa C dan C++ pemanggilannya menggunakan function pointer
– Di C#, metode pointer diimplementasikan sebagai objek yang dikenal delegate
– Contoh:
Declaration:
public delegate int Change(int x);
Method:
static int fun1(int x) { … }
Instantiate:
Change chgfun1 = new Change(fun1);Dapat dipanggil dengan:
chgfun1(12);
- Delegate yang dapat menyimpang lebih dari satu alamat disebut multicast delegate
Overloaded, Generic, dan User-Defined Overloaded Subprogram
- Overloaded subprogram merupakan subprogram yang memiliki nama yang sama dengan subprogram lain di lingkungan pengalamatan yang sama juga
- Di c++, Java, C#, dan Ada terdapat predefined overloaded subprogram
- Di Ada, return type dari overloaded function dapat digunakan untuk menghilangkan pemanggilan ambigu
- Ada, Java, C++, C# memperbolehkan user menulis banyak versi subprogram dengan nama yang sama
- Generic atau polymorphic subprogram mengambil parameter berbeda tipe di berbagai aktivasi
- Overloaded subprogram menyediakan ad hoc polymorphism
- Subtype polymorphism berarti suatu variable dari tipe T dapat mengakses objek apapun dari tipe T atau tipe apapun yang diturunkan dari T
- Operator dapat di-overloaded di Ada, C++, Python, dan Ruby
– Contoh di Python:
def __add__ (self, second) :
return Complex(self.real + second.real,
self.imag + second.imag)
Closure
- Closure merupakan subprogram dan lingkungan pengalamatan dimana ia didefinisikan
- Lingkungan pengalamatan dibutuhkan jika subprogram dapat dipanggil dari tempat manapun di program tersebut
- Bahasa ber-static scope yang tidak memperbolehkan nested subprogram tidak memerlukan closure
- Closure hanya dibutkan jika suatu subprogram dapat mengakses variable di nesting scope dan ia dapat dipanggil darimanapun
- Untuk mendukung closure, implementasi mungkin dibutuhkan untuk menyediakan jangkauan tak terbatas ke beberapa variable karena suatu subprogram mungkin mengakses variable nonlocal yang biasanya tak lagi ada (no longer alive)
Coroutine
- Coroutine merupakan subprogram yang memiliki banyak tempat masuk (entry) dan mengontrolnya sendiri, didukung secara langsung di Lua
- Juga dikenal dengan symmetric control karena coroutine pemanggil dan yang dipanggil berbasis sama
- Panggilan (call) coroutine disebut resume
- Resume pertama dari coroutine merupakan ke permulaanya, namun pemanggilan selanjutnya masuk melalui tittik hanya setelah pernyataan yang sebelumnya dieksekusi di coroutine
- Coroutine secara berulang-ulang berlanjut satu sama lain, berkemungkinan selamanya
- Control eksekusi yang mungkin:
- Control eksekusi dengan loop yang mungkin:
Sumber:
- Concept of Programming Languages 10th. Ed / Robert W. Sebesta (Chapter 9)
- Subprograms / Binus Powerpoint Presentation