ब्रेनफक: Difference between revisions

From Vigyanwiki
No edit summary
(text)
Line 23: Line 23:


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


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


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


{| class="wikitable"
{| class="wikitable"
Line 35: Line 35:
|-
|-
|style="text-align:center"|<code>&gt;</code>
|style="text-align:center"|<code>&gt;</code>
| Increment the [[pointer (computer programming)|data pointer]] by one (to point to the next cell to the right).
| डेटा पॉइंटर को एक से बढ़ाएँ (दाईं ओर अगले सेल को इंगित करने के लिए)
|-
|-
|style="text-align:center"|<code>&lt;</code>
|style="text-align:center"|<code>&lt;</code>
| Decrement the data pointer by one (to point to the next cell to the left).
| डेटा पॉइंटर को एक से घटाएं (बाईं ओर अगले सेल को इंगित करने के लिए)
|-
|-
|style="text-align:center"|<code>+</code>
|style="text-align:center"|<code>+</code>
| Increment the byte at the data pointer by one.
| डेटा पॉइंटर पर बाइट को एक से बढ़ाएँ।
|-
|-
|style="text-align:center"|<code>-</code>
|style="text-align:center"|<code>-</code>
| Decrement the byte at the data pointer by one.
| डेटा पॉइंटर पर बाइट को एक से कम करें।
|-
|-
|style="text-align:center"|<code>.</code>
|style="text-align:center"|<code>.</code>
| Output the byte at the data pointer.
| डेटा पॉइंटर पर बाइट आउटपुट करें।
|-
|-
|style="text-align:center"|<code>,</code>
|style="text-align:center"|<code>,</code>
| Accept one byte of input, storing its value in the byte at the data pointer.
| इनपुट की एक बाइट स्वीकार करें, डेटा पॉइंटर पर बाइट में उसका मान संग्रहीत करें।
|-
|-
|style="text-align:center"|<code>[</code>
|style="text-align:center"|<code>[</code>
| If the byte at the data pointer is zero, then instead of moving the [[Program Counter|instruction pointer]] forward to the next command, [[Branch (computer science)|jump]] it ''forward'' to the command after the ''matching'' <code>]</code> command.
| यदि डेटा पॉइंटर पर बाइट शून्य है, तो इंस्ट्रक्शन पॉइंटर को अगले कमांड पर आगे ले जाने के स्थान पर, मिलान के बाद इसे कमांड पर आगे बढ़ाएं<code>]</code>कमांड।
|-
|-
|style="text-align:center"|<code>]</code>
|style="text-align:center"|<code>]</code>
| If the byte at the data pointer is nonzero, then instead of moving the instruction pointer forward to the next command, jump it ''back'' to the command after the ''matching'' <code>[</code> command.{{Efn|Alternatively, the <code>]</code> command may instead be translated as an unconditional jump ''to'' the corresponding <code>[</code> command, or vice versa; programs will behave the same but will run more slowly, due to unnecessary double searching.}}
| यदि डेटा पॉइंटर पर बाइट शून्य नहीं है, तो इंस्ट्रक्शन पॉइंटर को अगले कमांड पर आगे ले जाने के स्थान पर, मिलान के बाद इसे वापस कमांड पर ले जाएं <code>[</code> कमांड। {{Efn|Alternatively, the <code>]</code> command may instead be translated as an unconditional jump ''to'' the corresponding <code>[</code> command, or vice versa; programs will behave the same but will run more slowly, due to unnecessary double searching.}}
|}
|}


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


जैसा कि नाम से पता चलता है, ब्रेनफक कार्यक्रमों को समझना मुश्किल होता है। यह आंशिक रूप से इसलिए है क्योंकि किसी भी हल्के से जटिल कार्य के लिए आदेशों के लंबे अनुक्रम की आवश्यकता होती है और आंशिक रूप से क्योंकि प्रोग्राम का पाठ प्रोग्राम की स्थिति (कंप्यूटर विज्ञान) का कोई प्रत्यक्ष संकेत नहीं देता है। ये, साथ ही ब्रेनफक की अक्षमता और इसकी सीमित इनपुट/आउटपुट क्षमताएं, कुछ ऐसे कारण हैं जिनका उपयोग गंभीर प्रोग्रामिंग के लिए नहीं किया जाता है। फिर भी, किसी भी ट्यूरिंग पूर्ण लैंग्वेज की तरह, ब्रेनफक सैद्धांतिक रूप से किसी भी कम्प्युटेबल फ़ंक्शन की गणना करने या किसी अन्य कम्प्यूटेशनल मॉडल का अनुकरण करने में सक्षम है, अगर उसे असीमित मात्रा में मेमोरी तक पहुंच दी जाए।<ref>{{cite web |url=https://iwriteiam.nl/Ha_bf_Turing.html |title=बीएफ ट्यूरिंग-पूर्ण है|publisher=Iwriteiam.nl |access-date=2023-04-30}}</ref> विभिन्न प्रकार के ब्रेनफक कार्यक्रम लिखे गए हैं।<ref>{{cite web|url=https://sange.fi/esoteric/brainfuck/bf-source/prog/ |title=Index of /esoteric/brainfuck/bf-source/prog |publisher=sange.fi |date=2002-01-22 |access-date=2023-04-30}}</ref> हालाँकि ब्रेनफक प्रोग्राम, विशेष रूप से जटिल वाले, को लिखना मुश्किल है, इसकी सरलता के कारण सी जैसी अधिक विशिष्ट लैंग्वेज में ब्रेनफक के लिए दुभाषिया लिखना काफी मामूली है। यहां तक ​​कि ब्रेनफक लैंग्वेज में लिखे गए ब्रेनफक दुभाषिए भी मौजूद हैं।<ref>{{cite web|url=https://iwriteiam.nl/Ha_bf_inter.html |title=बीएफ दुभाषिया बीएफ में लिखा गया है|publisher=Iwriteiam.nl |access-date=2023-04-30}}</ref><ref>{{cite web|url=http://www.hevanet.com/cristofd/dbfi.b |title=ब्रेनफक दुभाषिया|publisher=Daniel B. Cristofani }}</ref>
जैसा कि नाम से पता चलता है, ब्रेनफक प्रोग्राम को समझना कठिन होता है। यह आंशिक रूप से इसलिए है क्योंकि किसी भी हल्के से जटिल कार्य के लिए कमांड के लंबे अनुक्रम की आवश्यकता होती है और आंशिक रूप से क्योंकि प्रोग्राम का पाठ प्रोग्राम की स्थिति (कंप्यूटर विज्ञान) का कोई प्रत्यक्ष संकेत नहीं देता है। ये, साथ ही ब्रेनफक इनएफ़्फीसिएन्सी और इसकी सीमित इनपुट/आउटपुट क्षमताएं, कुछ ऐसे कारण हैं जिनका उपयोग सीरियस प्रोग्रामिंग के लिए नहीं किया जाता है। फिर भी, किसी भी ट्यूरिंग कम्पलीट लैंग्वेज की तरह, ब्रेनफक सैद्धांतिक रूप से किसी भी कम्प्युटेबल फ़ंक्शन की गणना करने या किसी अन्य कम्प्यूटेशनल मॉडल का अनुकरण करने में सक्षम है, अगर उसे असीमित मात्रा में मेमोरी तक पहुंच दी जाए। <ref>{{cite web |url=https://iwriteiam.nl/Ha_bf_Turing.html |title=बीएफ ट्यूरिंग-पूर्ण है|publisher=Iwriteiam.nl |access-date=2023-04-30}}</ref> विभिन्न प्रकार के ब्रेनफक कार्यक्रम लिखे गए हैं। <ref>{{cite web|url=https://sange.fi/esoteric/brainfuck/bf-source/prog/ |title=Index of /esoteric/brainfuck/bf-source/prog |publisher=sange.fi |date=2002-01-22 |access-date=2023-04-30}}</ref> हालाँकि ब्रेनफक प्रोग्राम, विशेष रूप से कॉम्प्लिकेटेड वाले, को लिखना कठिन है, इसकी सरलता के कारण सी जैसी अधिक विशिष्ट लैंग्वेज में ब्रेनफक के लिए दुभाषिया लिखना काफी सामान्य है। यहां तक ​​कि ब्रेनफक लैंग्वेज में लिखे गए ब्रेनफक दुभाषिए भी उपस्थित हैं। <ref>{{cite web|url=https://iwriteiam.nl/Ha_bf_inter.html |title=बीएफ दुभाषिया बीएफ में लिखा गया है|publisher=Iwriteiam.nl |access-date=2023-04-30}}</ref><ref>{{cite web|url=http://www.hevanet.com/cristofd/dbfi.b |title=ब्रेनफक दुभाषिया|publisher=Daniel B. Cristofani }}</ref>
ब्रेनफक तथाकथित [[ट्यूरिंग टारपिट]] का एक उदाहरण है: इसका उपयोग किसी भी प्रोग्राम को लिखने के लिए किया जा सकता है, लेकिन ऐसा करना व्यावहारिक नहीं है, क्योंकि ब्रेनफक इतना कम अमूर्तता प्रदान करता है कि प्रोग्राम बहुत लंबे या जटिल हो जाते हैं।
 
ब्रेनफक तथाकथित [[ट्यूरिंग टारपिट]] का एक उदाहरण है: इसका उपयोग किसी भी प्रोग्राम को लिखने के लिए किया जा सकता है, लेकिन ऐसा करना व्यावहारिक नहीं है, क्योंकि ब्रेनफक इतना कम अब्स्ट्रक्शन प्रदान करता है कि प्रोग्राम बहुत लंबे या जटिल हो जाते हैं।


== उदाहरण ==
== उदाहरण ==


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


<syntaxhighlight lang="bf">
<syntaxhighlight lang="bf">
Line 99: Line 100:


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


<syntaxhighlight lang="bf">
<syntaxhighlight lang="bf">
Line 146: Line 147:
>++.                    And finally a newline from Cell #6
>++.                    And finally a newline from Cell #6
</syntaxhighlight>
</syntaxhighlight>
पठनीयता के लिए, इस कोड को कई पंक्तियों में फैलाया गया है, और रिक्त स्थान और टिप्पणियाँ जोड़ी गई हैं। ब्रेनफ़क आठ आदेशों को छोड़कर सभी पात्रों को अनदेखा करता है <code>+-<>[],.</code> इसलिए टिप्पणियों के लिए किसी विशेष वाक्यविन्यास की आवश्यकता नहीं है (जब तक कि टिप्पणियों में कमांड वर्ण न हों)। कोड को इस प्रकार भी लिखा जा सकता था:
रीडएबिलिटी के लिए, इस कोड को कई पंक्तियों में विस्तारित किया गया है, और रिक्त स्थान और टिप्पणियाँ जोड़ी गई हैं। ब्रेनफ़क आठ कमांड <code>+-<>[],.</code> को छोड़कर सभी पात्रों को अनदेखा करता है, इसलिए टिप्पणियों के लिए किसी विशेष वाक्यविन्यास की आवश्यकता नहीं है (जब तक कि टिप्पणियों में कमांड वर्ण न हों)। कोड को इस प्रकार भी लिखा जा सकता था:
<syntaxhighlight lang="bf">++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.</syntaxhighlight>
<syntaxhighlight lang="bf">++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.</syntaxhighlight>
[[कोड गोल्फ]]्ड वर्ज़न का एक और उदाहरण जो प्रिंट करता है <code>Hello, World!</code>:<ref>{{Cite web|url=https://codegolf.stackexchange.com/a/163590|title=कोड गोल्फ - "हैलो, वर्ल्ड!" - कोड गोल्फ स्टैक एक्सचेंज|access-date=2023-04-29}}</ref>
[[कोड गोल्फ]] वर्ज़न का एक और उदाहरण जो <code>Hello, World!</code>प्रिंट करता है: <ref>{{Cite web|url=https://codegolf.stackexchange.com/a/163590|title=कोड गोल्फ - "हैलो, वर्ल्ड!" - कोड गोल्फ स्टैक एक्सचेंज|access-date=2023-04-29}}</ref>


<syntaxhighlight lang="bf">+[-->-[>>+>-----<<]<--<---]>-.>>>+.>>..+++[.>]<<<<.+++.------.<<-.>>>>+.</syntaxhighlight>
<syntaxhighlight lang="bf">+[-->-[>>+>-----<<]<--<---]>-.>>>+.>>..+++[.>]<<<<.+++.------.<<-.>>>>+.</syntaxhighlight>




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


<syntaxhighlight lang="bf">
<syntaxhighlight lang="bf">
Line 189: Line 190:


== यह भी देखें ==
== यह भी देखें ==
* [[JSFuck]] - वर्णों के बहुत सीमित सेट के साथ एक गूढ़ जावास्क्रिप्ट प्रोग्रामिंग लैंग्वेज
* [[JSFuck|जेएसफक]] - वर्णों के बहुत सीमित सेट के साथ एक गूढ़ जावास्क्रिप्ट प्रोग्रामिंग लैंग्वेज


== टिप्पणियाँ ==
== टिप्पणियाँ ==

Revision as of 10:47, 26 July 2023

Brainfuck
ParadigmEsoteric, imperative, structured
द्वारा डिज़ाइन किया गयाUrban Müller
पहली प्रस्तुतिSeptember 1993
टाइपिंग अनुशासनTypeless
फ़ाइल नाम एक्सटेंशनएस.b, .bf
Influenced by
P′′, FALSE
Influenced
Malbolge

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

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

इतिहास

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


पी'

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

लैंग्वेज डिज़ाइन

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

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

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

विशेष्ता अर्थ
> डेटा पॉइंटर को एक से बढ़ाएँ (दाईं ओर अगले सेल को इंगित करने के लिए)।
< डेटा पॉइंटर को एक से घटाएं (बाईं ओर अगले सेल को इंगित करने के लिए)।
+ डेटा पॉइंटर पर बाइट को एक से बढ़ाएँ।
- डेटा पॉइंटर पर बाइट को एक से कम करें।
. डेटा पॉइंटर पर बाइट आउटपुट करें।
, इनपुट की एक बाइट स्वीकार करें, डेटा पॉइंटर पर बाइट में उसका मान संग्रहीत करें।
[ यदि डेटा पॉइंटर पर बाइट शून्य है, तो इंस्ट्रक्शन पॉइंटर को अगले कमांड पर आगे ले जाने के स्थान पर, मिलान के बाद इसे कमांड पर आगे बढ़ाएं]कमांड।
] यदि डेटा पॉइंटर पर बाइट शून्य नहीं है, तो इंस्ट्रक्शन पॉइंटर को अगले कमांड पर आगे ले जाने के स्थान पर, मिलान के बाद इसे वापस कमांड पर ले जाएं [ कमांड। [lower-alpha 1]

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

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

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

उदाहरण

ऐड्डिंग टू वैल्यूज

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

[->+<]

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

++       Cell c0 = 2
> +++++  Cell c1 = 5

[        Start your loops with your cell pointer on the loop counter (c1 in our case)
< +      Add 1 to c0
> -      Subtract 1 from c1
]        End your loops with the cell pointer on the loop counter

At this point our program has added 5 to 2 leaving 7 in c0 and 0 in c1
but we cannot output this value to the terminal since it is not ASCII encoded

To display the ASCII character "7" we must add 48 to the value 7
We use a loop to compute 48 = 6 * 8

++++ ++++  c1 = 8 and this will be our loop counter again
[
< +++ +++  Add 6 to c0
> -        Subtract 1 from c1
]
< .        Print out c0 which has the value 55 which translates to "7"!


हेलो वर्ल्ड!

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

[ This program prints "Hello World!" and a newline to the screen, its
  length is 106 active command characters. [It is not the shortest.]

  This loop is an "initial comment loop", a simple way of adding a comment
  to a BF program such that you don't have to worry about any command
  characters. Any ".", ",", "+", "-", "<" and ">" characters are simply
  ignored, the "[" and "]" characters just have to be balanced. This
  loop and the commands it contains are ignored because the current cell
  defaults to a value of 0; the 0 value causes this loop to be skipped.
]
++++++++               Set Cell #0 to 8
[
    >++++               Add 4 to Cell #1; this will always set Cell #1 to 4
    [                   as the cell will be cleared by the loop
        >++             Add 2 to Cell #2
        >+++            Add 3 to Cell #3
        >+++            Add 3 to Cell #4
        >+              Add 1 to Cell #5
        <<<<-           Decrement the loop counter in Cell #1
    ]                   Loop until Cell #1 is zero; number of iterations is 4
    >+                  Add 1 to Cell #2
    >+                  Add 1 to Cell #3
    >-                  Subtract 1 from Cell #4
    >>+                 Add 1 to Cell #6
    [<]                 Move back to the first zero cell you find; this will
                        be Cell #1 which was cleared by the previous loop
    <-                  Decrement the loop Counter in Cell #0
]                       Loop until Cell #0 is zero; number of iterations is 8

The result of this is:
Cell no :   0   1   2   3   4   5   6
Contents:   0   0  72 104  88  32   8
Pointer :   ^

>>.                     Cell #2 has value 72 which is 'H'
>---.                   Subtract 3 from Cell #3 to get 101 which is 'e'
+++++++..+++.           Likewise for 'llo' from Cell #3
>>.                     Cell #5 is 32 for the space
<-.                     Subtract 1 from Cell #4 for 87 to give a 'W'
<.                      Cell #3 was set to 'o' from the end of 'Hello'
+++.------.--------.    Cell #3 for 'rl' and 'd'
>>+.                    Add 1 to Cell #5 gives us an exclamation point
>++.                    And finally a newline from Cell #6

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

++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.

कोड गोल्फ वर्ज़न का एक और उदाहरण जो Hello, World!प्रिंट करता है: [9]

+[-->-[>>+>-----<<]<--<---]>-.>>>+.>>..+++[.>]<<<<.+++.------.<<-.>>>>+.


आरओटी13

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

-,+[                         Read first character and start outer character reading loop
    -[                       Skip forward if character is 0
        >>++++[>++++++++<-]  Set up divisor (32) for division loop
                               (MEMORY LAYOUT: dividend copy remainder divisor quotient zero zero)
        <+<-[                Set up dividend (x minus 1) and enter division loop
            >+>+>-[>>>]      Increase copy and remainder / reduce divisor / Normal case: skip forward
            <[[>+<-]>>+>]    Special case: move remainder back to divisor and increase quotient
            <<<<<-           Decrement dividend
        ]                    End division loop
    ]>>>[-]+                 End skip loop; zero former divisor and reuse space for a flag
    >--[-[<->+++[-]]]<[         Zero that flag unless quotient was 2 or 3; zero quotient; check flag
        ++++++++++++<[       If flag then set up divisor (13) for second division loop
                               (MEMORY LAYOUT: zero copy dividend divisor remainder quotient zero zero)
            >-[>+>>]         Reduce divisor; Normal case: increase remainder
            >[+[<+>-]>+>>]   Special case: increase remainder / move it back to divisor / increase quotient
            <<<<<-           Decrease dividend
        ]                    End division loop
        >>[<+>-]             Add remainder back to divisor to get a useful 13
        >[                   Skip forward if quotient was 0
            -[               Decrement quotient and skip forward if quotient was 1
                -<<[-]>>     Zero quotient and divisor if quotient was 2
            ]<<[<<->>-]>>    Zero divisor and subtract 13 from copy if quotient was 1
        ]<<[<<+>>-]          Zero divisor and add 13 to copy if quotient was 0
    ]                        End outer skip loop (jump to here if ((character minus 1)/32) was not 2 or 3)
    <[-]                     Clear remainder from first division if second division was skipped
    <.[-]                    Output ROT13ed character from copy and clear it
    <-,+                     Read next character
]                            End character reading loop


यह भी देखें

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

टिप्पणियाँ

  1. Alternatively, the ] command may instead be translated as an unconditional jump to the corresponding [ command, or vice versa; programs will behave the same but will run more slowly, due to unnecessary double searching.


संदर्भ

  1. Easter, Brandee (2020-04-02). "Fully Human, Fully Machine: Rhetorics of Digital Disembodiment in Programming". Rhetoric Review. 39 (2): 202–215. doi:10.1080/07350198.2020.1727096. ISSN 0735-0198. S2CID 219665562.
  2. "ब्रेनफक प्रोग्रामिंग लैंग्वेज". Muppetlabs.com. Retrieved 2023-04-30.
  3. "The FALSE Programming Language — Wouter van Oortmerssen". Strlen.com. 2013-08-03. Retrieved 2023-04-30.
  4. "Aminet - dev/lang/brainfuck-2.lha". Aminet. Retrieved 2023-04-30.
  5. "बीएफ ट्यूरिंग-पूर्ण है". Iwriteiam.nl. Retrieved 2023-04-30.
  6. "Index of /esoteric/brainfuck/bf-source/prog". sange.fi. 2002-01-22. Retrieved 2023-04-30.
  7. "बीएफ दुभाषिया बीएफ में लिखा गया है". Iwriteiam.nl. Retrieved 2023-04-30.
  8. "ब्रेनफक दुभाषिया". Daniel B. Cristofani.
  9. "कोड गोल्फ - "हैलो, वर्ल्ड!" - कोड गोल्फ स्टैक एक्सचेंज". Retrieved 2023-04-29.