- Tail Call: pemanggilan fungsi yang dilakukan tepat sebelum fungsi melakukan return. Jika optimasi Tail Call terjadi, instruksi
jmp digunakan sehingga mengurangi call stack.
- Kelebihan:
- Mengurangi penggunaan memori stack dari O(n) menjadi O(1).
- Menghilangkan overhead kinerja dari pemanggilan fungsi sehingga bisa digunakan sebagai struktur kontrol perulangan yang efisien.
Masalah pada loop interpreter
- Masalah:
- Semakin besar fungsi dan semakin kompleks alur kontrolnya, semakin sulit mempertahankan data penting di register.
- Jika jalur cepat dan jalur lambat bercampur, kualitas kode menurun.
Peningkatan loop interpreter dengan memanfaatkan Tail Call
- Solusi: gunakan Tail Call untuk memisahkan setiap tugas menjadi fungsi-fungsi kecil, lalu setiap fungsi memanggil tugas berikutnya dengan Tail Call.
- Kelebihan:
- Alokasi register dapat dikendalikan.
- Jalur cepat dan jalur lambat dapat dipisahkan untuk menjaga kualitas kode.
- Urutan instruksi yang independen dapat dioptimalkan.
Keterbatasan
- Masalah saat ada non-Tail Call: jika ada non-Tail Call, stack frame akan dibuat dan data disimpan ke stack sehingga kinerja menurun.
- Penanganan eksepsi yang kompleks: jika penanganan eksepsi rumit, duplikasi kode dan kompleksitas meningkat.
- Masalah portabilitas: atribut
musttail bukan standar, sehingga tidak didukung oleh semua compiler.
Ringkasan GN⁺
- Optimasi Tail Call berperan penting dalam peningkatan kinerja, terutama menunjukkan hasil besar pada parsing Protobuf.
- Teknik ini juga dapat diterapkan pada interpreter bahasa utama yang ditulis dalam C (Python, Ruby, PHP, Lua, dll.).
- Masalah portabilitas atribut
musttail adalah tantangan yang perlu diselesaikan.
- Proyek dengan fungsi serupa mencakup LuaJIT dan interpreter WebAssembly wasm3.
1 komentar
Komentar Hacker News
Proposal standar C mencakup tail call dalam bentuk
return goto (expression);[[musttail]], cara ini menjamin masa hidup objek lokal sehingga tidak memerlukan analisis escape yang luasUntuk para penggemar Rust, pernah ada RFC lama untuk menambahkan kata kunci
becomeDi C++, cara interpreter meningkatkan kecepatan umumnya adalah dengan menggunakan computed goto
Masalah berpindah konteks dengan menggunakan tail call memerlukan fungsi yang memakai calling convention
Berharap atribut
[[musttail]]menyebar ke GCC, Visual C++, dan compiler populer lainnya[[musttail]]sedang dalam proses ditambahkan ke GCCMenyebut dukungan C++, sambil menunjukkan bahwa di C++ hampir tidak ada tail call
Bertanya-tanya apa yang terjadi jika melempar exception di fungsi C++
[[musttail]]Menyebut bahwa contoh sederhana tidak memerlukan
__attribute__((musttail))untuk menghasilkan kode yang baikPenasaran dengan kecepatan pendekatan yang memakai trampolin, di mana function pointer yang dikembalikan dipanggil oleh loop eksternal
Ada permintaan untuk memperjelas contoh jalur exception yang dibungkus dengan
[[musttail]][[musttail]]mencegah pembentukan stack frame dan register spilling