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

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

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

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

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

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

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

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

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

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

इसे सक्रिय वंदन कहा जाता है।

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

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

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

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

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

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

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

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

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

भागना
दो सम्मेलनों में से किसी एक का उपयोग करके एक या अधिक वर्णों से बचना संभव है।

सम्मेलन
 * 1) <...> - एकाधिक वर्णों से बचें।
 * 2) @-एकल वर्ण से बचें

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

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

उदाहरण 1: फ़ंक्शन परिभाषा
सबसे बुनियादी उदाहरण में फ़ंक्शन को परिभाषित करना सम्मिलित है जो अतिरिक्त फ़ंक्शन को परिभाषित करने के लिए उपयोगी है। इस "मेटा" फ़ंक्शन को def कहा जाता है। इसे इस प्रकार लिखा गया है: उदाहरण के लिए, हम स्ट्रिंग XX को 12345 के रूप में परिभाषित करने के लिए def का उपयोग कर सकते हैं और फिर इसे लिखकर 34 पर XX खंड लिखकर कर सकते हैं। कॉल फिर "1200005" स्ट्रिंग उत्पन्न करेगा।

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

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

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

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

उदाहरण कॉल इस तरह दिखेगी। और स्ट्रिंग 6 लौटाएगा।

यह भी देखें

 * टीआरएसी प्रोग्रामिंग लैंग्वेज

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

संदर्भ

 * 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 टीटीएम programming language on GitHub.