ब्रेनफक

ब्रेनफक 1993 में अर्बन मुलर द्वारा बनाई गई एक एसोटेरिक प्रोग्रामिंग लैंग्वेज है। अपने एक्सट्रीम मिनिमलिस्म के लिए नोटेबल, लैंग्वेज में केवल आठ सिंपल कमांड, एक डाटा पॉइंटर और एक इंस्ट्रक्शन पॉइंटर सम्मिलित हैं। हालाँकि यह पूरी तरह से ट्यूरिंग कम्पलीट है, इसका उद्देश्य प्रैक्टिकल यूज़ नहीं है, बल्कि प्रोग्रामर को चुनौती देना और मनोरंजन करना है। ब्रेनफक के लिए कमांड को माइक्रोस्कोपिक स्टेप्स में तोड़ने की आवश्यकता होती है।

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

इतिहास
मुलर ने सबसे छोटे संभव कम्पाइलर को लागू करने के लक्ष्य के साथ ब्रेनफक को डिजाइन किया, एसोटेरिक प्रोग्रामिंग लैंग्वेज एफएएलएसई के लिए 1024-बाइट कंपाइलर से प्रेरित है। मुलर का ओरिजिनल कंपाइलर मशीन लैंग्वेज में लागू किया गया था और 296 बाइट्स के आकार के साथ एक बाइनरी फ़ाइल में कम्पाइल किया गया था। उन्होंने 1993 में एमिनेट पर पहला ब्रेनफक कंपाइलर अपलोड किया। यह प्रोग्राम रीडमी फ़ाइल, जिसने लैंग्वेज का संक्षेप में वर्णन किया, और रीडर को चुनौती दी कि कौन इसके साथ कुछ भी यूज़फुल प्रोग्राम कर सकता है?:)। मुलर ने एक इंटरप्रेटर और कुछ उदाहरण भी सम्मिलित किए। कंपाइलर के दूसरे वर्ज़न में केवल 240 बाइट्स का उपयोग किया गया।

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

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

ब्रेनफ़क लैंग्वेज एक सरल मशीन मॉडल का उपयोग करती है जिसमें प्रोग्राम और इंस्ट्रक्शन पॉइंटर, साथ ही शून्य से प्रारंभ की गई कम से कम 30,000 बाइट कोशिकाओं की एक-आयामी सरणी सम्मिलित होती है; एक डाटा पॉइंटर (कंप्यूटर प्रोग्रामिंग) (सरणी के सबसे बाएं बाइट को इंगित करने के लिए प्रारंभ किया गया); और इनपुट और आउटपुट के लिए बाइट्स की दो धाराएँ (प्रायः क्रमशः एक कीबोर्ड और एक मॉनिटर से जुड़ी होती हैं, और एएससीआईआई वर्ण एन्कोडिंग का उपयोग करके)।

आठ लैंग्वेज कमांड में से प्रत्येक में एक ही वर्ण होता है:

और  मेल खाते हैं जैसा कि कोष्ठक सामान्यतः करते हैं: प्रत्येक   बिल्कुल एक   और इसके विपरीत से मेल खाता है,   सबसे पहले आता है, और कोई बेजोड़    या   दोनों के बीच में नहीं हो सकता।

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

ब्रेनफक तथाकथित ट्यूरिंग टारपिट का एक उदाहरण है: इसका उपयोग किसी भी प्रोग्राम को लिखने के लिए किया जा सकता है, लेकिन ऐसा करना व्यावहारिक नहीं है, क्योंकि ब्रेनफक इतना कम अब्स्ट्रक्शन प्रदान करता है कि प्रोग्राम बहुत लंबे या जटिल हो जाते हैं।

ऐड्डिंग टू वैल्यूज
पहले, सरल उदाहरण के रूप में, निम्नलिखित कोड स्निपेट करंट सेल के मान को अगले सेल में जोड़ देगा: हर बार लूप एक्सेक्यूट होने पर, करंट सेल कम हो जाता है, डेटा पॉइंटर दाईं ओर चला जाता है, अगला सेल बढ़ जाता है, और डेटा पॉइंटर फिर से बायीं ओर चला जाता है। यह क्रम तब तक दोहराया जाता है जब तक प्रारंभिक सेल 0 न हो जाए।

इसे एक सरल अतिरिक्त कार्यक्रम में निम्नानुसार सम्मिलित किया जा सकता है:

हेलो वर्ल्ड!
निम्नलिखित प्रोग्राम हैलो वर्ल्ड! प्रोग्राम प्रिंट करता है और स्क्रीन पर एक नई लाइन:

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

आरओटी13
यह प्रोग्राम अपने इनपुट को आरओटी13 सिफर के साथ एन्क्रिप्ट करता है। ऐसा करने के लिए, इसे अक्षर ए-एम (एएससीआईआई 65-77) से एन-जेड (78-90) और इसके विपरीत मैप करना होगा। इसके अतिरिक्त इसे a-m (97-109) से एन-जेड (110-122) और इसके विपरीत मैप करना होगा। इसे अन्य सभी करैक्टर को स्वयं में मैप करना होगा; यह एक समय में एक वर्ण को पढ़ता है और उनके इंसाइफ्रेड एक्विवैलेन्ट को तब तक आउटपुट करता है जब तक कि यह एक ईओएफ नहीं पढ़ लेता (यहां इसे -1 या कोई परिवर्तन नहीं के रूप में दर्शाया गया माना जाता है), जिस बिंदु पर प्रोग्राम समाप्त हो जाता है।

यह भी देखें

 * जेएसफक - वर्णों के बहुत सीमित सेट के साथ एक गूढ़ जावास्क्रिप्ट प्रोग्रामिंग लैंग्वेज