फ़ंक्शंस के प्रिंटफ़ परिवार के लिए प्रारूप चिन्ह (%) को प्रारूप विनिर्देशक के रूप में क्यों चुना गया?


27

हर कोई जानता है कि, कम से कम सी में, आप printfएक स्वरूपित स्ट्रिंग को प्रिंट करने के लिए फ़ंक्शन के परिवार का उपयोग करते हैं । और ये फ़ंक्शंस एक प्रारूप चिह्न% की शुरुआत को इंगित करने के लिए प्रतिशत चिह्न ( ) का उपयोग करते हैं । उदाहरण के लिए, %dप्रिंट करने का मतलब है int, और %uप्रिंट करने का मतलब है unsigned int। यदि आप इस बात से अपरिचित हैं कि printfफ़ंक्शन और प्रारूप प्लेसहोल्डर कैसे काम करते हैं, या बस एक रिफ्रेशर की आवश्यकता है, विकिपीडिया लेख शुरू करने के लिए एक अच्छी जगह है।

मेरा सवाल यह है कि क्या कोई विशेष रूप से सम्मोहक कारण है कि यह मूल रूप से या भविष्य में प्रारूप विनिर्देशक के रूप में क्यों चुना जाना चाहिए?

स्पष्ट रूप से निर्णय बहुत समय पहले किया गया था (सी भाषा के एक पूर्ववर्ती के लिए बहुत संभावना है), और यह तब से अधिक या कम "मानक" है (न केवल सी में, बल्कि अन्य भाषाओं के एक विशाल सरणी में भी है) अलग-अलग डिग्री के लिए इसके सिंटैक्स को अपनाया है), इसलिए इसे कभी भी बदलने में बहुत देर हो चुकी है। लेकिन मैं अब भी उत्सुक हूं कि अगर किसी को इस बात की कोई जानकारी है कि यह विकल्प पहली बार में क्यों बनाया गया है, और क्या यह अभी भी पसंद के रूप में समझ में आता है अगर कोई समान कार्यक्षमता के साथ एक नई भाषा डिजाइन कर रहा है।

उदाहरण के लिए, C # (और .NET भाषाओं के अन्य परिवार) के साथ, Microsoft ने स्ट्रिंग स्वरूपण कार्यों के संचालन के बारे में थोड़ा अलग निर्णय लिया। यद्यपि कुछ प्रकार की सुरक्षा वहां लागू की जा सकती है ( printfसी के कार्यान्वयन के साथ) के विपरीत , और इसलिए यह संबंधित पैरामीटर के प्रकार के एक संकेत को शामिल करने के लिए अनावश्यक है, उन्होंने घुंघराले ब्रेस के शून्य-अनुक्रमित जोड़े का उपयोग करने का फैसला किया ( {}) प्रारूप विनिर्देशक के रूप में, जैसे:

string output = String.Format("In {0}, the temperature is {1} degrees Celsius.",
                              "Texas", 37);
Console.WriteLine(output);

// Output:
//     In Texas, the temperature is 37 degrees Celsius.

String.Formatविधि के लिए प्रलेखन में अधिक जानकारी शामिल है, जैसा कि सामान्य रूप से समग्र स्वरूपण पर यह लेख करता है , लेकिन सटीक विवरण महत्वहीन हैं। मुद्दा बस इतना है कि उन्होंने %प्रारूप विनिर्देशक की शुरुआत का संकेत देने के लिए लंबे समय से चली आ रही प्रथा को त्याग दिया । सी भाषा बस आसानी से इस्तेमाल किया जा सकता है {d}और {u}, लेकिन यह नहीं था। किसी के पास कोई विचार क्यों है, क्या यह निर्णय पूर्वव्यापी में समझ में आता है, और क्या नए कार्यान्वयन को इसका पालन करना चाहिए?

जाहिर है कि ऐसा कोई भी चरित्र नहीं है जिसे चुना जा सकता है, इसलिए उसे बचाना नहीं होगा, ताकि इसे स्ट्रिंग में ही शामिल किया जा सके, लेकिन उनमें से केवल दो का उपयोग करके यह समस्या पहले से ही काफी हद तक सुलझ गई है। क्या अन्य विचार प्रासंगिक हैं?


5
दो वर्णों का उपयोग करके भागने की समस्या हल नहीं होती है। इसका मतलब है कि आपके पास भागने के लिए एक और चरित्र है।
JJJ

2
मैं उत्सुक हूँ। निश्चित रूप से, इसके {u}बजाय इसका उपयोग करना संभव %uहोगा लेकिन क्या इसका कोई महत्वपूर्ण लाभ होगा? यह काफी हद तक मनमानी पसंद है।
सीबी बेली

12
@JarrodRoberson तो आप कह रहे हैं कि उन्होंने जानबूझकर {}सिंटैक्स चुना है ताकि C # सीखने वाले लोग कुछ और सीखना शुरू न करें? मुझे यह विश्वास करना बहुत मुश्किल है कि एक प्रमुख था, अगर कोई भी, उनके डिजाइन निर्णय का हिस्सा। क्या आप किसी तरह अपने बयान का बैकअप ले सकते हैं?
stijn

6
दिलचस्प बात यह है पायथन (का एक बहुत बेहतर फार्म) को छोड़ दिया %स्वरूपण के पक्ष में नेट के लिए समान कुछ {}स्वरूपण क्योंकि बाद प्रदान करता है और अधिक लचीलापन।
कोनराड रुडोल्फ

3
आकाश नीला क्यों है, और "नीला" शब्द नीला क्यों है? उन्हें कुछ चुनना था।

जवाबों:


12

@Secure नोट के रूप में, C का printfफ़ंक्शन BCPL के फ़ंक्शन से प्रेरित है writef। और अगर आप बीसीपीएल के लिए विकिपीडिया पृष्ठ को देखते हैं , तो इसका एक उदाहरण है जो दिखाता है कि बीसीपीएल एक प्रारूप विनिर्देशक को पेश करने के लिए writefभी उपयोग किया जाता %है।

तो हम अनुमान लगा सकते हैं कि C का उपयोग %या तो BCPL ने किया, या BCPL ने उन्हीं कारणों से किया। मेरी आंत की भावना यह है कि यह बस था कि %कम से कम आमतौर पर उपयोग किए जाने वाले ASCII वर्णों में से एक है ... या इसलिए लेखकों ने सोचा। यह भी संभावना है कि उन्होंने विभिन्न विकल्पों को तौलने में बहुत समय नहीं लगाया। उस समय, बीसीपीएल और सी दोनों अस्पष्ट भाषाएं थीं, और लेखकों को सबसे अधिक संभावना थी कि इससे निपटने के लिए अधिक महत्वपूर्ण चीजें थीं।

हालांकि, कार्यों में एक मामूली स्पैनर है। जबकि C BCPL से प्रेरित था, यह पूरी तरह से स्पष्ट नहीं है कि C ने BCPL I / O लाइब्रेरी को उधार लिया है या अन्य तरीके से। मुझे स्पष्ट रूप से याद है कि बीसीपीएल के आई / ओ पुस्तकालयों ने उस समय के बारे में विकास की एक प्रक्रिया से गुजरा था जब कि इन्फिक्स बाइट इंडेक्सिंग ऑपरेटर को भाषा में जोड़ा गया था। (वास्तव में, मुझे लगता है कि मुझे पता है कि उस के बारे में कौन जानता होगा।)


3
"वास्तव में, मुझे लगता है कि मुझे पता है कि उस के बारे में कौन जानता होगा" ... और? … ..? बस हमें एक चट्टान-पिछलग्गू के साथ मत छोड़ो…
Mawg

2
@ मेव - ब्रायन नाइट शायद। इयान विल्सन शायद होगा। मार्टिन रिचर्ड्स निश्चित रूप से होगा। HTH।
स्टीफन सी

6

विकिपीडिया प्रविष्टि में बहुत ऐतिहासिक जानकारी नहीं है, जो विशिष्ट नहीं है printf, लेकिन सामान्य रूप से पात्रों से बचने के लिए है।

http://en.wikipedia.org/wiki/Escape_character

"बच चरित्र" शब्द का प्रारंभिक संदर्भ बॉब बेमर के आईबीएम तकनीकी प्रकाशनों में पाया जाता है। जाहिर है, यह वह है जिसने ASCII चरित्र सेट पर अपने काम के दौरान, इस तंत्र का आविष्कार किया था।

मेरा अनुमान है: बैकस्लैश का उपयोग पहले से ही स्ट्रिंग शाब्दिक के लिए किया गया था और प्रारूप के तार के लिए एक और चरित्र की आवश्यकता थी। सबसे अधिक संभावना है कि उन्होंने चरित्र को सामान्य उपयोग और घटना की कम से कम आवृत्ति के साथ चुना।

BTW, एक और संबंधित लेख वहाँ एक शब्द के साथ जुड़ा हुआ है जिसे मैंने पहले सुना है:

http://en.wikipedia.org/wiki/Leaning_toothpick_syndrome

लेख के लिए printfकुछ और जानकारी स्निपेट्स हैं, लेकिन कारणों के बारे में नहीं।

http://en.wikipedia.org/wiki/Printf

C के वैरेडिक प्रिंटफ की उत्पत्ति BCPL के राइटफ फ़ंक्शन में हुई है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.