कार्यात्मक शैली में, एक कार्यक्रम के माध्यम से मूल्यों का प्रवाह बहुत, बहुत दृश्यमान (संकलक और प्रोग्रामर दोनों के लिए) है। यह संकलक को यह निर्धारित करने के लिए बहुत सारे रास्ते देता है कि मूल्यों को कहाँ संग्रहीत करना है, उन्हें कितने समय तक रखना है, और इसी तरह।
एक अनिवार्य भाषा में, कंपाइलर प्रोग्रामर को एक मॉडल का वादा करता है जहां अधिकांश चर स्मृति में वास्तविक स्थानों के अनुरूप होते हैं जो परिभाषित जीवनकाल के लिए आसपास रहते हैं। संभावित रूप से, कोई भी बयान इनमें से किसी भी स्थान से पढ़ सकता है (या लिख सकता है), इसलिए कंपाइलर केवल मेमोरी स्थानों को रजिस्टर आवंटन के साथ बदल सकता है, दो चर को एक एकल भंडारण स्थान में मर्ज कर सकता है, या जहां एक श्रमसाध्य विश्लेषण करने के बाद समान अनुकूलन कर सकता है। उस प्रोग्राम में जो परिवर्तनशील हो सकता है।
अब, दो कैविएट हैं:
- प्रोग्रामिंग भाषा समुदाय ने इस विश्लेषण को करने के लिए चतुर तरीके विकसित करने पर पिछले पचास वर्षों में काफी प्रयास (बर्बाद) किया है। रजिस्टर-कलरिंग जैसी अच्छी तरह से ज्ञात ट्रिक्स हैं और इसके लिए कुछ आसान मामलों को पूरा करना है; लेकिन यह बड़े, धीमे संकलक और परिणामी कोड की गुणवत्ता के लिए संकलन की जटिलता का एक निरंतर व्यापार बनाता है
- इसी समय, अधिकांश कार्यात्मक प्रोग्रामिंग भाषाएं विशुद्ध रूप से कार्यात्मक नहीं हैं; बहुत सारी चीजें वास्तव में करने की ज़रूरत है, जैसे कि I / O का जवाब स्वाभाविक रूप से गैर-कार्यात्मक है, इसलिए कोई भी संकलक इन चालों से पूरी तरह मुक्त नहीं हो सकता है, और कोई भी भाषा उन्हें पूरी तरह से बचाती नहीं है - यहां तक कि हास्केल, जो थोड़ा बहुत है मेरे स्वाद के लिए शुद्ध (आपका माइलेज मई वैरी) आपके कोड के गैर-कार्यात्मक भागों को केवल नियंत्रित और दीवार-बंद कर सकता है, पूरी तरह से बचना नहीं।
लेकिन सामान्य प्रश्न का उत्तर देने के लिए, हाँ, एक कार्यात्मक प्रतिमान कंपाइलर को यह अनुकूलन करने के लिए बहुत अधिक स्वतंत्रता देता है कि यह एक अनिवार्य सेटिंग में नहीं है।