C ++ में ट्रिग्राफ अनुक्रम का उद्देश्य?


127

C ++ '03 मानक 2.3 / 1 के अनुसार:

इससे पहले कि कोई अन्य प्रसंस्करण होता है, तीन वर्णों में से किसी एक क्रम ("ट्रिग्राफ अनुक्रम") की प्रत्येक घटना को तालिका 1 में दर्शाए गए एकल वर्ण द्वारा प्रतिस्थापित किया जाता है।

----------------------------------------------------------------------------
| trigraph | replacement | trigraph | replacement | trigraph | replacement |
----------------------------------------------------------------------------
| ??=      | #           | ??(      | [           | ??<      | {           |
| ??/      | \           | ??)      | ]           | ??>      | }           |
| ??’      | ˆ           | ??!      | |           | ??-      | ˜           |
----------------------------------------------------------------------------

वास्तविक जीवन में इसका मतलब है कि कोड printf( "What??!\n" );छपाई में परिणाम होगा What|क्योंकि ??!एक ट्रिग्राफ अनुक्रम है जिसे |चरित्र के साथ बदल दिया जाता है ।

मेरा सवाल है कि ट्रिग्राफ का उपयोग करने का क्या उद्देश्य है? ट्रिग्रेड का उपयोग करने का कोई व्यावहारिक लाभ है?

UPD : उत्तर में उल्लेख किया गया था कि कुछ यूरोपीय कीबोर्ड में सभी विराम चिह्न वर्ण नहीं होते हैं, इसलिए गैर-अमेरिकी प्रोग्रामर को रोजमर्रा की जिंदगी में ट्रिग्राफ का उपयोग करना पड़ता है?

UPD2 : विज़ुअल स्टूडियो 2010 ने डिफ़ॉल्ट रूप से समर्थन बंद कर दिया है।


कुछ विराम चिह्नों को यूरोपीय कीबोर्ड पर पहुंचना कठिन है (इस बात के लिए कि कुछ प्रोग्रामर यूएस लेआउट का उपयोग तेजी से टाइप करने के लिए करते हैं) ऐसा नहीं देखा गया है जहां विराम चिह्न पूरी तरह से गायब हैं - शायद स्लाव भाषाओं के लिए?
पीटरचेन

2
ऐसा हो सकता है कि कुछ टर्मिनल और / या वर्चुअलाइजेशन आपको कुछ पात्रों तक आसानी से पहुंचने न दें। मेरे अनुभव में मुख्य अपराधी टिल्ड है।
फ्रांसेस्को

1
मेरे DE-deadkeys कीबोर्ड पर इसे टाइप करने पर, # वापसी के लिए एक कुंजी है, \ "AltGr" + "to" (अगले 0 पर), ^ "^" + "^" है (डेडकी के कारण; 1 के बगल में) , ["AltGr" + "8",] "AltGr" + "9", | "AltGr" + "<", {"AltGr" + "7" है,} "AltGr" + "0" है, और ~ "~" + "~" है (डेडकी के कारण, # बस के ऊपर)। तो वास्तव में कोई बड़ी बात नहीं है। मेरी उंगलियां अपने आप इन संयोजनों को टाइप करने की तरह हैं :-D
नॉनचिप

1
मैंने सोचा, कि कंप्यूटर पर मेरे द्वारा किए जा रहे काम के अनुसार दो कीबोर्ड लेआउट होना और उन्हें स्विच करना सामान्य है। यह मध्य यूरोप के क्षेत्र में आम रास्ता है। इन ट्रिग्राफ का उपयोग करना बहुत डरावना है। मैं इसे मानक से हटाने के लिए मतदान करूंगा।
VX

जवाबों:


97

इस सवाल (बारीकी से संबंधित खुदाई के बारे में) का जवाब है।

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

सामान्य तौर पर, आपको उनका उपयोग करने की आवश्यकता नहीं है, लेकिन आपको उनके बारे में जानने की आवश्यकता है कि आप जिस समस्या में भागे हैं। ट्रिग्राफ का कारण है कि ' ?' वर्ण में भागने का क्रम है:

'\?'

तो कुछ तरीकों से आप अपने उदाहरण की समस्या से बच सकते हैं:

 printf( "What?\?!\n" ); 

 printf( "What?" "?!\n" ); 

लेकिन आपको याद रखना होगा कि आप दोनों को कब टाइप कर रहे हैं? ' ऐसे चरित्र जिन्हें आप शुरू कर सकते हैं एक ट्रिग्राफ (और यह निश्चित रूप से कभी कुछ ऐसा नहीं है जिसके बारे में मैं सोच रहा हूं)।

व्यवहार में, ट्रिग्राफ और डिग्राफ एक ऐसी चीज है जिसके बारे में मुझे दिन-प्रतिदिन कोई चिंता नहीं है। लेकिन आपको उनके बारे में पता होना चाहिए क्योंकि हर दो साल में एक बार आप उनसे संबंधित बग में भाग लेंगे (और आप बाकी दिन उनकी मौजूदगी को कोसेंगे)। यह अच्छा होगा यदि कम्पाइलर को ट्रिग्राफ या डिग्राफ में आने पर चेतावनी (या त्रुटि) के लिए कॉन्फ़िगर किया जा सकता है, इसलिए मुझे पता चल सकता है कि मुझे कुछ मिला है जिसे मुझे जानबूझकर निपटना चाहिए।

और पूर्णता के लिए, digraphs टोकन के रूप में संसाधित होने के बाद से बहुत कम खतरनाक होते हैं, इसलिए एक स्ट्रिंग शाब्दिक के अंदर एक digraph को digraph के रूप में व्याख्या नहीं मिलेगी।

सी / सी ++ कार्यक्रमों में विराम चिह्न के साथ विभिन्न मौज-मस्ती पर एक अच्छी शिक्षा के लिए (एक ट्रिग्राफ बग सहित जो मुझे अपने बालों को बाहर निकालना होगा), हर्ब सटर के जीओटीडब्ल्यू # 86 लेख पर एक नज़र डालें ।


परिशिष्ट:

ऐसा लग रहा है कि जीसीसी डिफ़ॉल्ट रूप से ट्रिगर नहीं करेगा (और इसके बारे में चेतावनी देगा)। कुछ अन्य कंपाइलरों के पास ट्रिग्रेड सपोर्ट (उदाहरण के लिए IBM) बंद करने के विकल्प हैं। Microsoft ने VS2008 में एक चेतावनी (C4837) का समर्थन करना शुरू कर दिया है जो स्पष्ट रूप से सक्षम होना चाहिए (-Wall या कुछ का उपयोग करके)।


सी के साथ संगतता एकमात्र कारण है? क्या आधुनिक सी ++ कार्यक्रमों में उनसे मिलना संभव है?
किरिल वी। ल्याडविंस्की

हां, C ++ ट्रिग्राफ और डिग्राफ को भी सपोर्ट करता है।
माइकल बूर

4
जैसा कि मुझे याद है, कम से कम एक कंपाइलर (g ++?) का उपयोग करने से पहले ट्रिग्राफ और डिग्राफ का अनुवाद करने के लिए एक स्पष्ट कमांड लाइन विकल्प की आवश्यकता होती है, अन्यथा एक चेतावनी दी जाती है लेकिन कोई प्रतिस्थापन नहीं है।
KTC

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

1
यह वास्तव में केवल मेरी नसों पर हो जाता है जब ट्रिग्राफ को आश्चर्यचकित करने वाली टिप्पणियों में विस्तारित किया जाता है।
जोशुआ

23

आज बच्चे! :-)

हां, विदेशी उपकरण, जैसे कि आईबीएम 3270 टर्मिनल। 3270 है, अगर मुझे याद है, कोई घुंघराले ब्रेसिज़ नहीं! यदि आप आईबीएम मिनी / मेनफ्रेम पर सी लिखना चाहते हैं, तो आपको प्रत्येक ब्लॉक सीमा के लिए मनहूस ट्रिग्राफ का उपयोग करना होगा। सौभाग्य से, मुझे केवल कुछ आईबीएम मिनीकंप्यूटर सुविधाओं का अनुकरण करने के लिए सी में सॉफ्टवेयर लिखना था , वास्तव में सिस्टम / 36 पर सी सॉफ्टवेयर नहीं लिखना था ।

"P" कुंजी के बगल में देखें:

कीबोर्ड

हममम। बताना मुश्किल है। "कैरिज रिटर्न" के बगल में एक अतिरिक्त बटन है, और मेरे पास यह पीछे की ओर हो सकता है: शायद यह "[" / ""] जोड़ी थी जो गायब थी। किसी भी दर पर, यह कीबोर्ड आपको दुःख का कारण होगा अगर आपको सी लिखना था।

इसके अलावा, ये टर्मिनल ईबीसीडीआईसी, आईबीएम के "मूल" मेनफ्रेम चरित्र सेट को प्रदर्शित करते हैं, एएससीआईआई को नहीं (धन्यवाद, अनुस्मारक के लिए पावेल मिनावे)।

दूसरी ओर, जैसे ग्नू सी गाइड कहती है: "आपको इस मस्तिष्क क्षति की आवश्यकता नहीं है।" जीसीसी संकलक इस "सुविधा" को डिफ़ॉल्ट रूप से अक्षम कर देता है।


1
कीबोर्ड पर एक रीसेट बटन है। वह तो कमाल है! अजीब है कि मेरा ध्यान हालांकि पहले पकड़ा।
l46kok

10
जो कोई EBCDIC मशीन पर C ++ 17 का उपयोग करना चाहता है, उसे नेक्रोफिलिया के लिए जेल होना चाहिए।
एसएफ।

जब तक एक मंच ISO646 में उन सभी के अलावा कोई भी वर्ण नहीं है, तब तक वह सब कुछ नहीं किया जा सकता है जो ट्रिग्राफ के साथ किया जा सकता है, यह आवश्यक है कि हर कार्यान्वयन या तो बैकस्लैश को परिभाषित करे या कोई भी वर्ण जो C वर्ण में सेट नहीं है। "मेटा" वर्ण, मानक के सभी संदर्भों को "मेटा" के साथ बैकस्लैश में बदलें, और सी-वर्ण सेट के किसी भी सदस्य के लिए बैकस्लैश / मेटा जोड़कर ISO-646 में नहीं हैं?
सुपरकैट

22

से The C++ Programming Languageविशेष संस्करण, पेज 829

ASCII विशेष वर्ण [, ], {, }, |, और \वर्ण सेट आईएसओ द्वारा वर्णमाला के रूप में नामित पदों पर। अधिकांश यूरोपीय राष्ट्रीय ISO-646 वर्ण सेटों में, इन पदों पर अंग्रेजी वर्णमाला में नहीं पाए जाने वाले अक्षरों का कब्जा है।

ट्रिग्राफ का एक सेट सही मायने में मानक न्यूनतम चरित्र सेट का उपयोग करके राष्ट्रीय पात्रों को पोर्टेबल तरीके से व्यक्त करने की अनुमति देने के लिए प्रदान किया जाता है। यह कार्यक्रमों के इंटरचेंज के लिए उपयोगी हो सकता है, लेकिन इससे लोगों को कार्यक्रमों को पढ़ने में आसानी नहीं होती है। स्वाभाविक रूप से, इस समस्या का दीर्घकालिक समाधान C ++ प्रोग्रामर को उपकरण प्राप्त करने के लिए है जो उनकी मूल भाषा और C ++ दोनों का समर्थन करता है। दुर्भाग्य से, यह कुछ लोगों के लिए संभव प्रतीत होता है, और नए उपकरणों की शुरूआत एक निराशाजनक रूप से धीमी प्रक्रिया हो सकती है।


7
"नए उपकरणों की शुरूआत एक निराशाजनक धीमी प्रक्रिया हो सकती है"। विशेष रूप से प्रोग्रामिंग भाषा सुविधाओं के मानकीकरण की त्वरित और दर्द रहित प्रक्रिया की तुलना में।
जुलबर्ग

4
यदि यह कीबोर्ड लेआउट के लिए एक कीचड़ है, तो यह मजेदार है कि टाइपिंग के लिए कोई ट्रिग्राफ नहीं है `, जो कि इतालवी और कई अन्य कीबोर्ड लेआउट से गायब है
badp

15

वे उन प्रणालियों पर उपयोग के लिए हैं जिनमें C ++ के मूल चरित्र सेट में कुछ पात्रों का अभाव है। कहने की जरूरत नहीं है, इस तरह के सिस्टम अत्यधिक दुर्लभ हैं।


2
इसका मतलब यह है कि मैं उन्हें वास्तविक जीवन में उपयोग नहीं करूँगा?
किरिल वी। लयाडविंस्की

1
आप किस देश में रहते हैं? सभी भाषाओं के सभी कीबोर्ड में आवश्यक कुंजी नहीं होती है।
डेविड थॉर्नले

2
एक स्ट्रिंग शाब्दिक, हां, कहते हैं, लेकिन जब आपको एक अनपेक्षित परिणाम मिलता है, तो आपको अनपेक्षित परिणाम का कारण बनने की आवश्यकता होती है।
CB बेली

4
@ डेविड थॉर्नले: अधिकांश आधुनिक प्रणालियाँ C ++ के सभी मूल वर्णों का समर्थन करती हैं, भले ही वे पारंपरिक स्थान पर न हों या उन्हें टाइप करने के लिए एक संशोधक अनुक्रम की आवश्यकता हो। ट्रिग्राफ को केवल सिस्टम कोड पर स्रोत कोड में बनाए रखने की आवश्यकता होती है जहां चरित्र वास्तव में सिस्टम वर्ण सेट में प्रतिनिधित्व नहीं किया जा सकता है। मैं अभी भी यह सुनिश्चित करता हूं कि ऐसी प्रणालियां अत्यधिक दुर्लभ हैं।
CB बेली

9

C ++ 0x में हटाने के लिए ट्रिग्राफ प्रस्तावित किया गया है। उस ने कहा, उनके समर्थन में अभी भी मजबूत तर्क है - सी ++ समिति का पेपर N2910 देखें जो इस पर चर्चा करता है। जाहिरा तौर पर, EBCDIC एक प्रमुख गढ़ है जहाँ उन्हें ज़रूरत होती है।


हाँ, वह "विदेशी भाषा"! :-)
रोबोप्रोग

वे वास्तव में "ग्राहक प्रतिक्रिया के आंतरिक सर्वेक्षण से परिणाम" को छोड़कर बहुत कुछ नहीं कहते हैं, लेकिन अच्छी तरह से। मुझे आश्चर्य है कि EBCDIC अभी भी व्यापक उपयोग में है (और यह कि ये सिस्टम C ++ 0x संकलक का उपयोग करने की उम्मीद करते हैं)
peterchen

5

मैंने देखा है कि 90 के दशक के शुरुआती दिनों में पीएल / 1 प्रोग्राम को मेनफ्रेम से पीसी में चलाने / संकलित / डीबग करने में मदद करने के लिए ट्रिग्राफ का उपयोग किया जाता है।

वे पीएल / आई को सी कंपाइलर का उपयोग करते हुए पीसी पर पीएल / आई के संपादन के साथ डब कर रहे थे और वे चाहते थे कि कोड तब काम करे जब वह मेनफ्रेम में वापस चले गए जो घुंघराले ब्रेसिज़ का समर्थन नहीं करते थे। मैंने सुझाव दिया कि वे मैक्रोज़ का उपयोग कर सकते हैं

#def BEGIN {    
#def END }  

या एक दोस्त पीएल / I विकल्प के रूप में

#def BEGIN ??<
#def END ??>

और अगर वे वास्तव में कल्पना करना चाहते थे तो वे कोशिश कर सकते थे

#ifdef MAINFRAME
    #def BEGIN ??<
    #def END ??>
#else
    #def BEGIN {    
    #def END }  
#endif

और फिर कार्यक्रम ऐसा लगेगा जैसे यह पास्कल में लिखा गया था। उन्होंने सिर्फ मुझे मजाकिया अंदाज में देखा और बाकी दिन मुझसे बात नहीं की। मुझे नहीं लगता कि मैं उन्हें दोष देता हूं। :)

इस प्रयास ने त्रिकोणीय रेखांकन क्या नहीं मारा, यह प्लेटफार्मों के बीच आईओ प्रणाली के अंतर थे। पीसी पर फाइलें खोलना मेनफ्रेम की तुलना में बहुत अधिक भिन्न था, इसने दोनों पर समान कोड रखने के लिए बहुत अधिक कीचड़ को पेश किया होगा।


PL / 1 = IBM का C का संस्करण (अधिक या कम)। मेरी टिप्पणी देखें: IBM टर्मिनलों की कोई '{' / '}' 'कुंजियां नहीं हैं :-( इनमें से किसी एक पर C [++] लिखने के लिए कठिन की तरह, अन्यथा।
Roboprog

3

मुख्य रूप से क्योंकि सी मानक ने उन्हें 1989 में वापस पेश किया, जब कुछ मशीनों पर नक्शे को ट्रिगर करने वाले पात्रों की उपस्थिति के साथ समस्याएं थीं। 1998 में जब तक C ++ मानक प्रकाशित किया गया था, तब तक ट्रिग्राफ की आवश्यकता महान नहीं थी। वे सी पर एक मस्सा हैं; वे C ++ पर केवल एक मस्सा हैं। उनके लिए एक आवश्यकता थी - विशेष रूप से अंग्रेजी बोलने वाली दुनिया के बाहर - यही कारण है कि उन्हें सी में जोड़ा गया था।


1
मुझे हमेशा से यह संदेह है कि आईबीएम अंग्रेजी नहीं बोल रहा था :-)
रोबोप्रोग

3

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

उन उपयोगकर्ताओं को समायोजित करने के लिए, ट्रिग्राफ केवल सबसे आम ASCII वर्णों का उपयोग करके विराम चिह्न में प्रवेश करने का एक तरीका है।


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

2

वे ज्यादातर ऐतिहासिक कारणों से वहाँ हैं। आजकल, अधिकांश भाषाओं के लिए अधिकांश आधुनिक कीबोर्ड उन सभी पात्रों तक पहुंच की अनुमति देते हैं, लेकिन यह कुछ यूरोपीय कीबोर्ड के साथ एक बार समस्या हुआ करता था। यही कारण है कि ट्रिग्राफ का आविष्कार किया गया था।

यदि आप नहीं जानते कि वे किस लिए हैं, तो आपको उनका उपयोग नहीं करना चाहिए।

यह उनके बारे में पता होना अभी भी अच्छा है, हालांकि, चूंकि आप गलती से और अनजाने में अपने कोड में एक का उपयोग कर सकते हैं।

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