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:
- Komunitas bahasa pemrograman telah menghabiskan (terbuang?) Banyak upaya selama lima puluh tahun terakhir untuk mengembangkan cara-cara cerdas untuk melakukan analisis ini. Ada trik-trik terkenal seperti pewarnaan register dan sebagainya untuk menyelesaikan beberapa kasus yang lebih mudah; tetapi ini membuat kompiler besar dan lambat, dan kompromi kompilasi yang konstan untuk kualitas kode yang dihasilkan
- Pada saat yang sama, sebagian besar bahasa pemrograman fungsional juga tidak sepenuhnya fungsional; banyak hal yang sebenarnya perlu dilakukan oleh program, seperti menanggapi I / O yang pada dasarnya tidak berfungsi, sehingga tidak ada kompiler yang bisa sepenuhnya bebas dari trik-trik ini, dan tidak ada bahasa yang menghindarinya sepenuhnya - bahkan Haskell, yang agak terlalu murni untuk seleraku (Your Mileage May Vary) hanya dapat mengontrol dan mematikan komponen-komponen kode Anda yang tidak berfungsi, tidak menghindarinya sama sekali.
Tetapi untuk menjawab pertanyaan umum, ya, sebuah paradigma fungsional memberi kompiler banyak kebebasan untuk mengoptimalkan yang tidak ada dalam pengaturan imperatif.