ब्रेनफक

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

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

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

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

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

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

आठ भाषा आदेशों में से प्रत्येक में एक ही वर्ण होता है:

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

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

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

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

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

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

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

यह भी देखें

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