Saya sedang membaca buku "Pemrograman Fungsional untuk Dunia Nyata". Ini dimulai dengan perbandingan antara bahasa pemrograman imperatif dan fungsional. Dan itu menyatakan bagaimana 'nilai' dan 'ekspresi' dalam pemrograman fungsional berbeda dari 'variabel' dan 'fungsi' pemrograman imperatif. Dari diskusi saya semacam mengembangkan ide bahwa -
Bahasa pemrograman fungsional memiliki lebih banyak kesempatan untuk melakukan kompilasi optimasi waktu daripada rekan-rekan imperatif mereka.
Apakah itu benar
sumber
Bahwa pada prinsipnya ada lebih banyak kompilasi kemungkinan optimisasi waktu untuk bahasa fungsional daripada rekan imperatif mereka mungkin benar.
Namun yang lebih menarik adalah, jika mereka benar-benar diimplementasikan dalam kompiler saat ini dan seberapa relevan optimasi ini dalam praktik (yaitu kinerja akhir dari kode 'kehidupan nyata (TM)' idiomatik dalam lingkungan produksi, dengan pengaturan kompiler yang dapat diprediksi secara apriori).
mis. pengajuan Haskell untuk Game Benchmarks Bahasa Komputer yang terkenal (seburuk mungkin - tetapi tidak seperti itu - saat ini - sesuatu yang jauh lebih baik di luar sana) memberikan kesan bahwa sejumlah besar waktu telah dihabiskan untuk optimisasi manual, yang dihadapkan dengan klaim tentang "kemungkinan optimisasi kompiler karena
insert some property about FP languages here
" membuatnya tampak seperti optimisasi (saat ini setidaknya) lebih dari kemungkinan teoretis daripada kenyataan yang relevan.Saya akan senang meskipun terbukti salah tentang hal ini.
sumber
Dalam gaya fungsional, aliran nilai melalui suatu program sangat, sangat terlihat (baik bagi kompiler maupun pemrogram). Ini memberi kompiler banyak kelonggaran untuk memutuskan di mana menyimpan nilai, berapa lama menyimpannya, dan sebagainya.
Dalam bahasa imperatif, kompiler menjanjikan pemrogram model di mana sebagian besar variabel sesuai dengan lokasi aktual dalam memori yang tetap ada selama masa hidup yang ditentukan. Secara potensial, pernyataan apa pun dapat membaca dari (atau menulis ke!) Salah satu dari lokasi ini, sehingga kompiler hanya dapat mengganti lokasi memori dengan alokasi register, menggabungkan dua variabel menjadi satu lokasi penyimpanan, atau melakukan optimasi serupa setelah melakukan analisis yang teliti dari mana lain di program variabel yang dapat dirujuk.
Sekarang, ada dua peringatan:
Tetapi untuk menjawab pertanyaan umum, ya, sebuah paradigma fungsional memberi kompiler banyak kebebasan untuk mengoptimalkan yang tidak ada dalam pengaturan imperatif.
sumber
main
adalah fungsi yang mentransformasikan keadaan daripada sesuatu yang menggunakan keadaan itu sendiri.