2013-11-05 7 views
45

जूलिया में, वाक्य रचना एक स्वरूपित स्ट्रिंग मुद्रित करने के लिए इस प्रकार है? क्या ऐसा है कि यह विभिन्न तर्कों को स्वीकार कर सकता है?जूलिया में, @printf एक फ़ंक्शन के बजाय मैक्रो क्यों है?</p> <pre><code>@printf("Hello %dn", 5) </code></pre> <p>क्यों <code>@printf</code> एक समारोह के बजाय एक मैक्रो है:

उत्तर

86

तर्क के परिवर्तनशील लेते हुए सामान्य जूलिया कार्यों [1] के लिए एक समस्या नहीं है। @printf एक मैक्रो है ताकि यह संकलन समय पर प्रारूप स्ट्रिंग को पार्स और व्याख्या कर सके और उस विशिष्ट प्रारूप स्ट्रिंग के लिए कस्टम कोड जेनरेट कर सके। लोग एहसास नहीं हो सकता है कि सी printf समारोह फिर से पार्स करता है और फिर से व्याख्या प्रारूप स्ट्रिंग हर बार जब आप printf कहते हैं। तथ्य यह है कि यह तेज़ है क्योंकि यह पागल सूचक प्रोग्रामिंग के एक मामूली चमत्कार का प्रतिनिधित्व करता है। गंभीरता से, बस अपने निकटतम libc के printf कार्यान्वयन को देखें। यह पूरी तरह से पागल है।

जूलिया एक अलग दृष्टिकोण का उपयोग करता है: @printf एक मैक्रो जो कुशल कोड है कि प्रारूप विनिर्देश के लिए विशिष्ट में प्रारूप तार तब्दील है। यदि आप इसके बारे में सोचते हैं, तो एक printf-style प्रारूप स्ट्रिंग वास्तव में एक ऐसा फ़ंक्शन व्यक्त करने का एक तरीका है जो निश्चित संख्या और तर्कों का प्रकार लेता है और उन्हें किसी विशेष तरीके से प्रिंट करता है। ध्यान दें कि मैंने कहा है कि प्रारूप स्ट्रिंग एक फ़ंक्शन है, प्रिंटफ स्वयं नहीं है, जो अवधारणात्मक रूप से एक फ़ंक्शन जनरेटर है, प्रारूपों को स्वरूपण में बदल रहा है। तथ्य यह है कि सी में रन-टाइम फ़ंक्शन में यह सब कुछ खराब हो गया है क्योंकि यह सी में एकमात्र उचित विकल्प है क्योंकि वास्तव में, इस वजह से, हाल ही में, अपने आप को शूट करना आसान था सी के printf को गलत संख्या या तर्क के प्रकार गुजरकर पैर में। यह अब बेहतर है क्योंकि प्रिंटर को प्रिंटफ प्रारूपों के अर्थशास्त्र को समझने के लिए विशेषीकृत किया गया है।

सिद्धांत रूप में, जूलिया के @printf को सी से अधिक तेज़ बनाया जा सकता है क्योंकि यह कस्टम कोड उत्पन्न करता है, लेकिन व्यावहारिक रूप से, मुझे सी से मेल खाने में काफी मुश्किल होती है, इसे अकेले मारने दें। लेकिन मुझे लगता है कि यह हमारे आई/ओ सिस्टम के वर्तमान डिजाइन और मैं इसका उपयोग कैसे कर रहा हूं, एक अंतर्निहित सीमा के कारण नहीं है। आई/ओ सामान हालांकि ओवरहाल के कारण है, और जब ऐसा होता है, तो हम वास्तव में इस तथ्य का लाभ उठाकर फॉर्मेटेड प्रिंटिंग पर सी को हरा सकते हैं कि @printf एक मैक्रो है।

+0

@lucacerone 'कर एक्स = @sprintf 42'" मेरी भाग्यशाली संख्या% d है। " – Adobe

+1

प्रत्येक printf कॉल के लिए कस्टम कोड उत्पन्न करने से बहुत सारे कोड ब्लोट का कारण बन सकता है। – vitaut

+1

@StefanKarpinski आईओ ओवरहाल के बाद से कोई अपडेट? @StefanKarpinski से –

6

यह प्रदर्शन के लिए है। printf मैक्रो एक निरंतर प्रारूप स्ट्रिंग लेता है (उदाहरण के लिए "Hello %d\n") और उस स्ट्रिंग के लिए अनुकूलित कोड जेनरेट करता है।

संबंधित मुद्दे