Kontent qismiga oʻtish

Brainfuck dasturlash tili

Vikipediya, ochiq ensiklopediya

Brainfuck — 1993-yilda Urban Muller tomonidan yaratilgan ezoterik dasturlash tili[1].

Oʻzining ekstremal minimalizmi bilan ajralib turadigan til faqat sakkizta oddiy buyruqdan, maʼlumotlar koʻrsatgichidan va koʻrsatma koʻrsatgichidan iborat. U toʻliq Turing bilan yakunlangan boʻlsa-da, u amaliy foydalanish uchun emas, balki u faqat dasturchilarni zavqlantirish uchun moʻljallangan. Brainfuck buyruqlarni mikroskopik bosqichlarga ajratishni talab qiladi.

Tilning nomi „brainfuck“ jargon atamasiga ishora boʻlib, u shunchalik murakkab yoki gʻayrioddiy narsalarga ishora qiladiki, ular inson tushunish chegarasidan oshib ketadi, chunki u haqiqiy dasturiy taʼminotni loyihalash uchun emas, balki kompyuter dasturlash chegaralariga qarshi chiqish uchun yaratilgan.

1992-yilda shvetsariyalik fizika talabasi Urban Muller Amiga dasturiy taʼminoti uchun kichik onlayn arxivni oʻz ichiga olgan dasturlash tili yaratdi[2]. Arxiv tobora ommalashib bordi va tez orada butun dunyoda aks ettirildi. Bugungi kunda bu dunyodagi eng katta Amiga arxivi boʻlib, Aminet nomi bilan tanilgan.

Muller Brainfuck dasturini FALSE dasturlash tili uchun 1024 baytlik kompilyatordan ilhomlanib[3] mumkin boʻlgan eng kichik kompilyatorni amalga oshirish maqsadida ishlab chiqdi[4]. Mullerning asl kompilyatori mashina tilida amalga oshirilgan va 296 bayt oʻlchamli ikkilik tizimga kompilyatsiya qilingan. U birinchi Brainfuck kompilyatorini 1993-yilda Aminetga yuklagan. Dastur tilni qisqacha tavsiflovchi „Readme“ fayli bilan birga keldi va oʻquvchini „Kim u bilan foydali narsalarni dasturlashi mumkin?“ :) ". Myuller, shuningdek, tarjimon va bir nechta batafsil misollarni oʻz ichiga olgan. Kompilyatorning ikkinchi versiyasi faqat 240 baytdan foydalangan[5]. Hozirda internetda aql bovar qilmaydigan kompilyatorlar koʻp.

Aminet oʻsishi bilan kompilyator Amiga jamoasi orasida mashhur boʻldi va vaqt oʻtishi bilan u boshqa platformalar uchun ham joriy etildi.

P': Brainfuckning rasmiy „ota tili“

[tahrir | manbasini tahrirlash]

Ikki kiritish-chiqarish buyrugʻidan tashqari Brainfuck tili 1964-yilda Korrado Böhm tomonidan yaratilgan rasmiy dasturlash tili P’ning kichik oʻzgarishi boʻlib, u oʻz navbatida Turing mashinasiga asoslangan edi. Darhaqiqat, tegishli Brainfuck buyruqlariga ekvivalent oltita belgidan foydalangan holda +, -, <, >, [, ] Böhm har qanday hisoblash funksiyasini hisoblash uchun xizmat qiluvchi asosiy funksiyalarning har biri uchun aniq dasturni taqdim etdi. Shunday qilib, birinchi „Brainfuck“ dasturlari Böhmning 1964-yilgi maqolasida paydo boʻldi va ular Tyuringning toʻliqligini isbotlash uchun yetarli edi.

Infinite Abacus: Brainfuckning „bobo tili“

[tahrir | manbasini tahrirlash]

Yoaxim Lambek tomonidan 1961-yilda cheksiz sonli kataklardan iborat cheksiz abakus nomi ostida stekdagi nisbiy harakatlardan koʻra aniq xotira manziliga ega versiya ishlab chiqildi[6]:

  • X+ (X katakchasini oshirish)
  • X- else jump T (musbat boʻlsa, Xni kamaytiring, aks holda T ga oʻting)

U Infinite Abacus asosiy m-rekursiv funksiyaning Kleene toʻplamini dasturlash orqali har qanday hisoblanuvchi rekursiv funksiyani hisoblashi mumkinligini isbotlaydi.

Uning mashinasi Melzakning mashinasi[7] tomonidan arifmetik orqali modellashtirish hisob-kitobi bilan simulyatsiya qilingan, bu abakda toshlarni harakatlantirayotgan inson operatoriga taqlid qilgan, shuning uchun barcha raqamlar ijobiy boʻlishi kerak edi. Bir buyruqli kompyuteri Infinite Abacusga ekvivalent boʻlgan Melzak koʻpaytirish (gcd, n-tub son) b bazasida tasvirlash, kattalik boʻyicha tartiblash dasturlarini beradi va ixtiyoriy Tyuring mashinasini simulyatsiya qilishni koʻrsatadi.

Til sakkizta buyruqdan iborat. Brainfuck dasturi bu buyruqlar ketma-ketligi boʻlib, ehtimol boshqa belgilar bilan kesishadi (ular eʼtiborga olinmaydi). Buyruqlar ketma-ket bajariladi, baʼzi istisnolardan tashqari: koʻrsatma koʻrsatkichi birinchi buyruqdan boshlanadi va u koʻrsatgan har bir buyruq bajariladi, shundan soʻng u odatda keyingi buyruqqa oʻtadi. Yoʻriqnoma koʻrsatkichi oxirgi buyruqdan oʻtganda dastur tugaydi.

Brainfuck tili dastur va koʻrsatma koʻrsatgichidan tashkil topgan oddiy mashina modelidan, shuningdek, nol yordamida ishga tushirilgan kamida 30 000 bayt hujayradan iborat bir oʻlchovli massivdan foydalanadi. Harakatlanuvchi maʼlumotlar koʻrsatkichi (massivning eng chap baytiga ishora qilish uchun foydalaniladi), kirish va chiqish uchun ikkita bayt oqimi (koʻpincha klaviatura va monitorga ulanadi va ASCII belgilar kodlashidan foydalanadi) mavjud.

Sakkizta til buyruqlarining har biri bitta belgidan iborat:

Xarakter Maʼnosi
> Maʼlumotlar koʻrsatkichini oshiring (oʻngdagi keyingi katakka ishora qilish uchun).
< Maʼlumotlar koʻrsatkichini kamaytiring (chapdagi keyingi katakka ishora qilish uchun).
+ Maʼlumotlar koʻrsatgichidagi baytni oshiring (birga oshiring).
- Maʼlumotlar koʻrsatgichidagi baytni kamaytiring (bir marta kamaytiring).
. Maʼlumotlar koʻrsatgichida baytni chiqaring.
, Bir bayt kirishni qabul qiling, uning qiymatini maʼlumotlar koʻrsatgichida baytda saqlang.
[ Agar maʼlumotlar koʻrsatkichidagi bayt nolga teng boʻlsa, u holda koʻrsatma koʻrsatkichini keyingi buyruqqa oldinga siljitish oʻrniga, mos keladigan ] buyrugʻidan keyin uni oldinga oʻtkazing.
] Agar maʼlumotlar koʻrsatkichidagi bayt nolga teng boʻlmasa, koʻrsatma koʻrsatgichini keyingi buyruqqa oldinga siljitish oʻrniga, mos keladigan [ buyrugʻidan keyin uni yana buyruqqa oʻtkazing.

(Shu bilan bir qatorda, ] buyrugʻi tegishli [ buyrugʻiga soʻzsiz oʻtish sifatida tarjima qilinishi mumkin yoki aksincha; dasturlar bir xil ishlaydi, lekin keraksiz ikki marta qidirish tufayli sekinroq ishlashi mumkin.)

[ va ] odatda qavslarga mos keladi: har biri [ aniq bitta ] ga mos keladi va aksincha, [ birinchi boʻlib keladi va ikkalasi oʻrtasida tengsiz [ yoki ] boʻlishi mumkin emas.

Brainfuck dasturlari quyidagi almashtirishlar yordamida C tiliga tarjima qilinishi mumkin, agar ptr char* tipida boʻlsa va nolga teng baytlar qatoriga ishora qilish uchun ishga tushirilgan boʻlsa:

Brainfuck buyrugʻi C ekvivalenti
(Dasturni boshlash) char array [ 30000 ] = { 0 }; char * ptr = array;
> ++ ptr;
<  — ptr;
+ ++* ptr;
- --* ptr;
. putchar (* ptr);
, * ptr = getchar ();
[ while (* ptr) {
] }

Nomidan koʻrinib turibdiki, Brainfuck dasturlarini tushunish qiyin. Buning sababi qisman har qanday yengildan murakkabgacha boʻlgan vazifa uzoq buyruqlar ketma-ketligini talab qiladi. Bular, shuningdek, Brainfuckning samarasizligi va uning kirish/chiqarish imkoniyatlarining cheklanganligi uning jiddiy dasturlash uchun ishlatilmasligining sabablaridan biridir. Shunga qaramay, har qanday Turing toʻliq tillari singari, Brainfuck ham nazariy jihatdan har qanday hisoblash funksiyasini hisoblash yoki boshqa har qanday hisoblash modelini simulyatsiya qilish qobiliyatiga ega, agar cheksiz hajmdagi xotiraga ruxsat berilsa[8]. Turli xil Brainfuck dasturlari yozilgan[9]. Brainfuck dasturlarini, ayniqsa murakkab dasturlarni yozish qiyin boʻlsa-da, soddaligi tufayli Brainfuck uchun odatiyroq tilda, masalan, C tilida tarjimon yaratish juda oson hisoblanadi. Hatto Brainfuck tilida yozilgan Brainfuck tarjimonlari ham mavjud[10][11].

Brainfuck Turing tarpit deb ataladigan misoldir: U har qanday dasturni yozish uchun ishlatilishi mumkin, ammo buni amalga oshirish uchun yetarli darajada amaliy emas.

Ikki qiymat qoʻshish

[tahrir | manbasini tahrirlash]

Birinchi oddiy misol sifatida quyidagi kod parchasi joriy katakning qiymatini keyingi katakchaga qoʻshadi: Har safar sikl bajarilganda joriy katak kamayadi, maʼlumotlar koʻrsatkichi oʻngga siljiydi, keyingi katak oʻsadi va maʼlumotlar koʻrsatkichi yana chapga siljiydi. Ushbu ketma-ketlik boshlangʻich katak 0 boʻlguncha takrorlanadi.

[->+<]

Bu oddiy qoʻshimcha dasturga quyidagi tarzda kiritilishi mumkin: ++ Cell c0 = 2

++ 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"!

Quyidagi dastur "Salom dunyo!" va ekranga yangi qatorini yaratish:

[ 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


Oʻqilishi" uchun ushbu kod koʻplab satrlar boʻylab tarqaldi va boʻsh joylar va sharhlar qoʻshildi. Brainfuck ±<>[],., sakkizta buyruqdan tashqari barcha belgilarga eʼtibor bermaydi. shuning uchun izohlar uchun maxsus sintaksis kerak emas (agar izohlarda buyruq belgilari boʻlmasa). Kod xuddi shunday yozilishi mumkin edi:

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

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

salom dunyo kodining batafsil tavsifini bu yerda topishingiz mumkin.

  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. 
  2. „Aminet hits 5000 files“. Urban Müller (1993-yil 24-sentyabr). Qaraldi: 2015-yil 3-may.
  3. „The Brainfuck Programming Language“. Muppetlabs.com. Qaraldi: 2013-yil 30-oktyabr.
  4. „Wouter's Wiki : False Language“. Strlen.com (2013-yil 3-avgust). Qaraldi: 2013-yil 30-oktyabr.
  5. „dev/lang/brainfuck-2.lha“. Aminet. 2005-yil 6-noyabrda asl nusxadan arxivlangan. Qaraldi: 2013-yil 30-oktyabr.
  6. J. Lambek (1961). "How to program an infinite abacus". Canadian Mathematical Bulletin 4 (3): 295–302. doi:10.4153/CMB-1961-032-6. 
  7. Z. A. Melzak (1961). "An informal arithmetical approach to computability and computation". Canadian Mathematical Bulletin 4 (3): 279–293. doi:10.4153/CMB-1961-031-9. 
  8. „BF is Turing-complete“. Iwriteiam.nl. Qaraldi: 2013-yil 30-oktyabr.
  9. „Index of /brainfuck/bf-source/prog“. Esoteric.sange.fi (2002-yil 22-yanvar). Qaraldi: 2013-yil 30-oktyabr.
  10. „BF interpreter written in BF“. Iwriteiam.nl. Qaraldi: 2013-yil 30-oktyabr.
  11. „brainfuck interpreter“. Daniel B. Cristofani.