टीटीएम (प्रोग्रामिंग लैंग्वेज)

टीटीएम स्ट्रिंग ओरिएंटेड, सामान्य प्रयोजन मैक्रो प्रोसेसर प्रोग्रामिंग भाषा है जिसे 1968 में कैलिफोर्निया प्रौद्योगिकी संस्थान में स्टीवन केन और ई. केंट गॉर्डन द्वारा विकसित किया गया था।

विवरण
निम्नलिखित विवरण मूल टीटीएम संदर्भ नियमावली और उसके बाद में बैच प्रोसेसिंग एक्सटेंशन से लिया गया है।

टीटीएम पुनरावर्ती, व्याख्यात्मक भाषा है जिसे मुख्य रूप से स्ट्रिंग हेरफेर, टेक्स्ट संपादन, मैक्रो परिभाषा और विस्तार और सामान्यतः सिस्टम प्रोग्रामिंग के रूप में वर्गीकृत अन्य अनुप्रयोगों के लिए डिज़ाइन किया गया है। यह GAP और जी.पी.एम. से लिया गया है

प्रारंभ में, टीटीएम को आईबीएम सिस्टम/360 के लिए असेंबलर के मैक्रो प्रोसेसिंग हिस्से के रूप में योजनाबद्ध किया गया था और उस सिस्टम के लिए मानक असेंबलरों में मौजूद प्रतिबंधों और विसंगतियों को दूर करने के लिए डिज़ाइन किया गया था।

इसके अलावा, इसे पहले के सामान्य मैक्रो असेंबलरों के पास मौजूद सभी शक्तियों को रखने के लिए डिज़ाइन किया गया था, लेकिन दुर्भाग्यपूर्ण वाक्यविन्यास और अर्थ संबंधी कठिनाइयों को हटा दिया गया था।

टीटीएम के विकास के दौरान, यह स्पष्ट हो गया कि असेंबलर मैक्रो प्रोसेसिंग के अलावा अन्य अनुप्रयोग भी संभव थे। इनमें असेंबलरों के अलावा अन्य भाषा प्रोसेसर के लिए डेटा संपादन, टेक्स्ट हेरफेर, अभिव्यक्ति संकलन और मैक्रो प्रोसेसिंग शामिल हैं।

टीटीएम का प्रारंभिक संस्करण आईबीएम सिस्टम/360 मॉडल 50 के लिए कैल्टेक बेसिक टाइम शेयरिंग सिस्टम के तहत संवादात्मक तरीके से चलाने के लिए लागू किया गया था। अन्य संस्करण ओएस/360 के बैच प्रोसेसिंग वातावरण में चलाने और विभिन्न भाषा प्रोसेसर के सामने या उनके साथ मिलकर काम करने के लिए लिखे गए हैं।

वाक्यविन्यास और शब्दार्थ
संदर्भ कार्यान्वयन मानता है कि टीटीएम को एक टेक्स्ट फ़ाइल दी जाती है जिसमें सामान्य टेक्स्ट और टीटीएम फ़ंक्शन कॉल (यानी इनवोकेशन) का कुछ संयोजन होता है। पाठ को अक्षर दर अक्षर स्कैन किया जाता है। कोई भी सामान्य टेक्स्ट बिना किसी परिवर्तन के आउटपुट में पास कर दिया जाता है (#Escapeing को छोड़कर)। यदि कोई टीटीएम फ़ंक्शन सामने आता है, तो इसे एकत्र और निष्पादित किया जाता है।

टीटीएम फ़ंक्शन कॉल का सामान्य रूप इस तरह दिखता है   जहां फ़ंक्शन का नाम और तर्क मनमाना वर्ण स्ट्रिंग हैं जिनमें महत्व के वर्ण नहीं हैं: '#', '<', '>', और ';'। फ़ंक्शन को निर्दिष्ट तर्कों के साथ लागू किया जाता है और परिणामी टेक्स्ट को फ़ंक्शन कॉल के स्थान पर मूल टेक्स्ट में डाला जाता है। यदि फ़ंक्शन कॉल के पहले एक '#' वर्ण लगाया गया था, तो फ़ंक्शन कॉल से सम्मिलित टेक्स्ट से ठीक पहले स्कैनिंग फिर से शुरू हो जाएगी।
 * 1) <फ़ंक्शननाम;arg1;arg2;...;argn>

इसे सक्रिय मंगलाचरण कहा जाता है।

यदि फ़ंक्शन कॉल में दो '#' वर्ण उपसर्ग किए गए थे, तो सम्मिलित पाठ के तुरंत बाद स्कैनिंग फिर से शुरू हो जाती है। इसे निष्क्रिय मंगलाचरण कहा जाता है।

फ़ंक्शन कॉल के संग्रह के दौरान, अतिरिक्त फ़ंक्शन कॉल का सामना करना पड़ सकता है, उदाहरण के लिए, यह।   नेस्टेड फ़ंक्शन कॉल का सामना होने पर उसे लागू किया जाएगा और परिणाम को बाहरी फ़ंक्शन कॉल के टेक्स्ट में डाला जाएगा और बाहरी फ़ंक्शन कॉल की स्कैनिंग नेस्टेड कॉल से पहले '#' वर्णों की संख्या द्वारा इंगित स्थान पर फिर से शुरू होगी।
 * 1) <फ़ंक्शननाम;arg1;#;...;argn>

यदि कोई फ़ंक्शन, उदाहरण के लिए, 2 तर्क लेता है, तो किसी भी अतिरिक्त को अनदेखा कर दिया जाता है। उपयोगकर्ता परिभाषित कार्यों के लिए, यदि बहुत कम तर्क प्रदान किए जाते हैं, तो खाली स्ट्रिंग के मान के साथ अतिरिक्त तर्क जोड़े जाते हैं। एक फ़ंक्शन में अधिकतम 62 तर्क हो सकते हैं।

अन्य अनुप्रयोगात्मक प्रोग्रामिंग भाषा की तरह, एक टीटीएम फ़ंक्शन पुनरावर्ती हो सकता है और इसे अन्य फ़ंक्शन कॉल के अनुक्रम के आह्वान के परिणाम के रूप में परिभाषित किया जा सकता है।

फ़ंक्शन या तो अंतर्निहित होते हैं या उपयोगकर्ता द्वारा परिभाषित होते हैं। बड़ी संख्या में अंतर्निहित फ़ंक्शन मौजूद हैं और टीटीएम संदर्भ मैनुअल में परिभाषित हैं

फ़ंक्शन परिभाषा
उपयोगकर्ता परिभाषित फ़ंक्शन निम्नलिखित दो अंतर्निहित का उपयोग करके बनाए जाते हैं कार्य.
 * #
 * #

पहला फ़ंक्शन, परिभाषित स्ट्रिंग के लिए डीएस, टीटीएम शब्दकोश में नामित स्ट्रिंग को परिभाषित करता है। नाम नाम है और इसका मान टेक्स्ट है। इस नामित स्ट्रिंग का आह्वान करने से इसके आह्वान को मान (यानी टेक्स्ट) से बदल दिया जाएगा।

दूसरा फ़ंक्शन, सेगमेंट स्ट्रिंग के लिए एसएस, पहले से परिभाषित स्ट्रिंग के टेक्स्ट को स्कैन करता है और इसके तर्कों की घटनाओं की तलाश करता है: टेक्स्ट1, टेक्स्ट2, ... टेक्स्टएन। जब कोई घटना पाई जाती है, तो उसे खंड चिह्न से बदल दिया जाता है। प्रत्येक तर्क की सभी घटनाओं को एक ही खंड चिह्न द्वारा प्रतिस्थापित किया जाता है।

जब एक खंडित स्ट्रिंग लागू की जाती है, तो कॉल के प्रत्येक तर्क को संबंधित खंड चिह्न के लिए प्रतिस्थापित किया जाता है। इस उदाहरण पर विचार करें.  [01] # [02] # [03] #<एफ;11;22>  स्ट्रिंग F को परिभाषित किया गया है (पंक्ति 1) और इसका मुख्य भाग abcxxdefyy दो तारों xx और yy (पंक्ति 2) पर खंडित है। जब आह्वान किया जाता है (पंक्ति 3), तो यह मान abc11def22 लौटाएगा। असल में, हमारे पास दो तर्कों के साथ एक उपयोगकर्ता परिभाषित फ़ंक्शन एफ है।

भागना
दो में से किसी एक का उपयोग करके एक या अधिक वर्णों से बचना संभव है सम्मेलन.
 * 1) <...> - एकाधिक वर्णों से बचें।
 * 2) @-एकल वर्ण से बचें

यदि कोई स्ट्रिंग <...> में संलग्न है, तो इसे स्कैन किया जाता है लेकिन टीटीएम द्वारा व्याख्या नहीं की जाती है। स्कैनिंग प्रक्रिया में, बाहरी < और > ब्रैकेट हटा दिए जाते हैं। यदि <...> की नेस्टेड घटनाएँ हैं, तो उन्हें स्कैन किया जाता है लेकिन < और > को हटाया नहीं जाता है। कोष्ठक को संतुलित करना चाहिए: '<' वर्णों की संख्या '>' वर्णों की संख्या के बराबर होनी चाहिए।

'@' एस्केप कन्वेंशन के कारण दुभाषिया '@' के बाद के चरित्र को पास कर देता है। अग्रणी '@' को छोड़ दिया जाता है यदि यह <...> एस्केप अनुक्रम के भीतर है, अन्यथा इसे हटा दिया जाता है। एक उपयोग है '<' या '>' वर्णों की असंतुलित घटनाओं की अनुमति दें।

उदाहरण 1: फ़ंक्शन परिभाषा
सबसे बुनियादी उदाहरण में परिभाषित करना शामिल है एक फ़ंक्शन जो अतिरिक्त फ़ंक्शन को परिभाषित करने के लिए उपयोगी है। इस मेटा फ़ंक्शन को def कहा जाता है। इसे इस प्रकार लिखा गया है:  
 * 1) ;##>>
 * 2) 

उदाहरण के लिए, हम स्ट्रिंग XX को परिभाषित करने के लिए def का उपयोग कर सकते हैं 12345 और फिर 34 पर खंड XX लिखकर।  
 * 1) 

कॉल   फिर स्ट्रिंग 1200005 उत्पन्न करेगा।
 * 1) 

डीईएफ़ फ़ंक्शन हमारे उदाहरण में 'टीटीएम' शब्दकोश - एक्सएक्स में फ़ंक्शन नाम और प्रारंभिक पाठ को परिभाषित करने के लिए डीएस को लागू करके संचालित होता है।

फिर XX की शब्दकोश प्रविष्टि का पाठ किसी भी निर्दिष्ट तर्क के संबंध में खंडित किया गया है: इस मामले में 34।

जब XX का आह्वान किया जाता है, तो उसके तर्क को खंड चिह्न के स्थान पर प्रतिस्थापित कर दिया जाता है।

उदाहरण 2: फैक्टोरियल
फैक्टोरियल फ़ंक्शन को परिभाषित किया जा सकता है (उपरोक्त ## फ़ंक्शन का उपयोग करके) निम्नलिखित नुसार।  </पूर्व> ध्यान दें कि आंतरिक गणना (#<mu...) बच गई है इसलिए इसका मूल्यांकन केवल #<lt... फ़ंक्शन के बाद ही किया जाएगा निष्पादित किया जाता है और उस नेस्टेड गणना को उसके परिणाम के रूप में लौटाता है।
 * 1) <def;n!;N;<#<lt;N;2;1;<#<mu;N;#<n!;#<su;N;1>>>>>>>

एक उदाहरण कॉल इस तरह दिखेगी.  </पूर्व> और स्ट्रिंग 6 लौटाएगा।
 * 1) <n!;3>

यह भी देखें

 * टीआरएसी प्रोग्रामिंग भाषा

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

संदर्भ

 * Greenwald, I.D. and Kane, M, The Share 709 System: Programming and Modification. JACM 6 No. 2 (1959). pp. 128–133.
 * Greenwald, I.D., Handling Macro Instructions. CACM 2, No. 11 (1959), 21-22.
 * Remington Rand UNIVAC Division, UNIVAC Generalized Programming. Philadelphia, 1957.
 * McIlroy, M.D., Using SAP Macro Instructions to Manipulate Symbolic Expressions. Bell Telephone Laboratories Computation Center (1960).

बाहरी संबंध

 * Reference implementation for the TTM programming language on GitHub.