Brainfuck

Brainfuck
linguaggio di programmazione
Programma "Hello, World!" in Brainfuck
AutoreUrban Müller
Data di origineSettembre 1993
Paradigmiesoterico, imperativo, strutturato
TipizzazioneNon tipizzato
Estensioni comuni.b e .bf
Influenzato daP′′, FALSE
Ha influenzatoMalbolge, Whitespace
Implementazione di riferimento
Sito webbrainfuck.org/

Brainfuck (lett. "fottere il cervello") è un linguaggio di programmazione esoterico per computer, creato da Urban Müller intorno al 1993. Il linguaggio viene in taluni casi denominato Brainf*ck, Brainf*** o anche soltanto BF per evitare di offendere la sensibilità altrui.

Struttura del linguaggio

L'obiettivo di Müller era di creare un semplice linguaggio di programmazione completo per una macchina di Turing che potesse essere implementato con il compilatore più piccolo possibile. Il linguaggio consiste di otto istruzioni. La versione 2 del compilatore originale, scritta per il 68000 dell'Amiga, occupa soltanto 240 byte. È stato ispirato dal linguaggio FALSE, un altro linguaggio di programmazione esoterico, il cui compilatore occupava 1024 byte.

Come il nome suggerisce, i programmi scritti in Brainfuck tendono a essere difficili da comprendere. Tuttavia Brainfuck è un linguaggio Turing-completo, e si può utilizzare per implementare qualunque algoritmo eseguibile con una macchina di Turing. Trascurando l'enorme difficoltà nella programmazione di certi algoritmi con Brainfuck, è certamente possibile scrivere il relativo codice.

Il linguaggio è basato su un modello molto semplice consistente in un array di byte inizializzato a zero, un puntatore all'array (inizializzato per puntare al primo byte dell'array) e due stream di byte per l'input e l'output.

Istruzioni

Le istruzioni del linguaggio sono otto, ciascuna consiste in un singolo carattere e sono:

Carattere Significato
> incrementa il puntatore
< decrementa il puntatore
+ incrementa il byte indirizzato dal puntatore
- decrementa il byte indirizzato dal puntatore
. output dal byte indirizzato dal puntatore (ASCII)
, input al byte indirizzato dal puntatore (ASCII)
[ salta in avanti all'istruzione dopo il corrispondente ] se il byte indirizzato dal puntatore è zero
] salta indietro all'istruzione dopo il corrispondente [ se il byte indirizzato dal puntatore non è zero

In alternativa, ] può essere inteso come "salta indietro alla corrispondente [". In tal modo è più breve, ma meno simmetrico e meno efficiente in termini di tempo. Le due versioni producono comunque un comportamento equivalente di ciascun programma Brainfuck.

Una terza versione equivalente, scarsamente considerata, è: [ significa "salta in avanti al corrispondente ]", e ] significa "salta indietro all'istruzione che segue il corrispondente [ se il byte al puntatore non è zero".

I sorgenti per Brainfuck possono essere transcodificati in C utilizzando la seguente tabella di sostituzione, assumendo che ptr sia di tipo unsigned char*:

Brainfuck C
> ++ptr;
< --ptr;
+ ++(*ptr);
- --(*ptr);
. putchar(*ptr);
, *ptr = getchar();
[ while (*ptr) {
] }

Esempi

Hello world!

Il seguente codice mostra "Hello world" sullo schermo e manda a capo il cursore

++++++++++
[
>+++++++>++++++++++>+++>+<<<<-
]
>++. Loop iniziale (dopo viene stampata una H)
>+. e
+++++++. l
. l
+++. o
>++.
<<+++++++++++++++.
>.
+++.
------.
--------.
>+.
>.

Per mantenere leggibile il listato, viene iniziata una nuova linea dopo ciascun punto, che rappresenta il comando di output. Le lettere H, e, l, l e o sono state inserite nel codice esclusivamente come commenti. Il Brainfuck considera tutti i caratteri a eccezione di + - < > [ ] , . come dei commenti, cosicché non è necessaria una sintassi particolare per indicare un commento.

Il loop sulla prima linea imposta il valore iniziale dell'array: a[1] = 70 (vicino al valore ASCII per il carattere 'H', 72), a[2] = 100 (vicino alla 'e', 101), a[3] = 30 (vicino a ' ', 32) e a[4] = 10 (newline, a capo). Il loop funziona moltiplicando il valore di a[0], 10, salvando il risultato nelle altre celle. Al termine del loop, il puntatore all'array è zero. >++ incrementa di uno il puntatore, indicando a[1] che è 70, poi aggiunge due a tale valore, con il risultato di 72 che è il valore per il carattere ASCII della lettera H maiuscola. Il punto al termine della linea indica l'output, causandone la visualizzazione.

La linea successiva sposta il puntatore all'array in alto di una posizione, poi aggiunge uno. a[2] è ora 101, una 'e' minuscola, che viene poi mostrata con l'istruzione di output.

Dal momento che la lettera 'l' è la settima lettera dopo la 'e', per mostrare la 'l'aggiungiamo sette (+++++++) al puntatore corrente e mostriamo l'output due volte.

'o' è la terza lettera dopo la 'l', quindi incrementiamo tre volte il valore dell'array e mandiamo in output il risultato.

La parte rimanente del programma prosegue esattamente come illustrato finora. Per lo spazio e la lettera maiuscola, vengono selezionati diversi puntatori, che sono poi incrementati o decrementati secondo necessità.

Semplici

Loop semplice

,[.,]

Un ciclo continuo che prende del testo in input dalla tastiera e lo scrive sullo schermo. Da notare che si assume che la cella sia impostata a 0 quando un comando , viene eseguito dopo la fine dell'input (alle volte chiamata end-of-file o "EOF"); le implementazioni differiscono in questo punto. Per implementazioni che impostano la cella a -1 o EOF, oppure che non modificano il valore della cella, questo programma andrebbe scritto rispettivamente ,+[-.,+] o ,[.[-],]

Manipolazione dei puntatori

>,[.>,]

Una versione dell'ultimo esempio che salva anche tutto l'input in un array per uso futuro, muovendo il puntatore ogni volta.

Sommare

[->+<]

Questo somma la locazione corrente (distruttivamente, essa viene messa a zero) alla locazione successiva.

Istruzioni condizionali

,----------[----------------------.,----------]

Questo esempio prenderà input scritti in minuscolo dalla tastiera e li farà diventare maiuscoli. Per uscire, premere il tasto invio.

In primo luogo, inseriamo il primo carattere usando il comando , e immediatamente sottraiamo 10 da esso. (Molti, ma non tutti, i programmi Brainfuck usano 10 per indicare il tasto di ritorno a capo.) Se l'utente preme invio, l'istruzione di ciclo ([) salterà dopo la fine del ciclo, perché setteremo il primo byte a zero. Se il carattere inserito non era 10, assumeremo che esso fosse una lettera minuscola, ed entreremo nel ciclo, nel quale sottrarremo un altro 22 da esso, per un totale di 32, il quale è la differenza tra una lettera ASCII minuscola e la corrispondente lettera maiuscola.

Successivamente lo visualizzeremo. Ora inseriamo il prossimo carattere, e ancora sottraiamo 10. Se questo carattere fosse un linefeed, usciamo dal ciclo; altrimenti, ritorneremo all'inizio del ciclo, sottrarremo un altro 22, lo visualizzeremo, e così via. Quando usciamo dal ciclo, il programma termina, siccome non ci sono più comandi.

Copiare un byte

Brainfuck non include nessuna operazione per copiare byte. Questo deve essere fatto con i costrutti di ciclo e gli operatori aritmetici. Muovere un byte è abbastanza semplice; muovere il valore di [0] a [1] può essere fatto come segue:

[->+<]

Comunque, questo resetta il valore di [0] a 0. Possiamo ripristinare il valore di [0] dopo la copia prendendo vantaggio dell'abilità di copiare un valore in due posti alla volta. Per copiare il valore di [0] in entrambi [1] e [2] è semplice:

[->+>+<<]

Possiamo prendere vantaggio di questo per ripristinare il valore [0]. Quindi, possiamo non distruttivamente copiare [0] a [1] (usando [2] come variabile temporanea) così come segue:

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

Complessi

Somma

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

Questo programma aggiunge due numeri a singola cifra e visualizza il risultato correttamente se anch'esso è composto da una sola cifra:

4+3

7

(Ora le cose iniziano a diventare un po' più complicate. Noi possiamo riferirci ai byte nell'array come [0], [1], [2], e così via.)

Il primo numero è inserito in [0], e gli si sottrae 48 per ottenere la cifra corrispondente (i codici ASCII per i numeri da 0 a 9 sono infatti quelli da 48 a 57). Questo è fatto mettendo un 6 in [1] e usando un ciclo per sottrarre 8 da [0] il numero corrispondente di volte. (Questo è un metodo comune di sommare o sottrarre grandi numeri) Successivamente, si inserisce il segno di somma in [1]; si inserisce infine il secondo numero, sovrascrivendo il simbolo di somma.

Il ciclo successivo [<+>-] fa il vero lavoro, muovendo il secondo numero sopra il primo, sommandoli insieme e azzerando [1]. A ogni loop, esso aggiunge uno a [0] e sottrae uno da 1; così [1] viene alla fine azzerato, e la quantità aggiunta a [0] è esattamente quella rimossa da [1]. Viene quindi inserito un valore di ritorno in [1]. (Non stiamo controllando possibili errori sull'input.)

Poi il puntatore viene spostato indietro a [0], che viene visualizzato. ([0] è ora , siccome non abbiamo corretto b; questo valore è identico ad , che è ciò che vogliamo. Ora il puntatore è spostato a [1], il quale contiene il risultato; esso viene infine visualizzato, terminando l'algoritmo

Moltiplicazione

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

Come il precedente esempio, ma esegue la moltiplicazione, non l'addizione.

Il primo numero è inserito in [0], l'asterisco e poi il secondo numero sono inseriti in [1], ed entrambi i numeri sono corretti sottraendo da essi 48.

Ora entriamo nel ciclo principale della moltiplicazione. L'idea base è che ogni volta attraverso esso noi sottraiamo uno da [0] e aggiungiamo [1] al totale corrente tenuto in [2]. In particolare: il primo ciclo interno sposta [1] su entrambi [2] e [3], mentre azzera [1]. (Questo è il metodo base per moltiplicare un numero.) Il primissimo ciclo interno sposta [3] indietro all'interno di [1], azzerando [3]. Poi uno è sottratto da [0], e il ciclo esterno viene terminato. Uscendo da questo ciclo, [0] è zero, [1] continua a contenere il secondo numero, e [2] contiene il prodotto dei due numeri. (Abbiamo fatto attenzione tenendo il primo numero, potevamo aggiungere uno a [4] ogni volta attraverso il ciclo esterno, poi spostare il valore da [4] indietro ad [1] in seguito.)

Ora aggiungiamo 48 al prodotto, inseriamo un risultato in [3], visualizziamo il prodotto usando i caratteri ASCII, e poi visualizziamo il risultato che abbiamo memorizzato.

Linguaggi di programmazione simili

Una lista di linguaggi simili:

Voci correlate

Altri progetti

Collegamenti esterni

  Portale Informatica: accedi alle voci di Wikipedia che trattano di informatica

Read other articles:

Ralph HammerasFilm Internasional Almanak 1937-38Lahir(1894-03-24)24 Maret 1894Minneapolis, MinnesotaMeninggal3 Februari 1970(1970-02-03) (umur 75)Los Angeles, CaliforniaPekerjaanPerancang Efek khususSinematograferSutradara seniTahun aktif1925-1960 Ralph Hammeras (24 Maret 1894 – 3 Februari 1970) adalah seorang perancang efek khusus, sinematografer, sutradara seni Amerika. Ia dinominasikan untuk tiga Academy Award. Ia membuat sebuah miniatur berskala besar dari kota London untuk f...

 

Katedral NiteróiKatedral Metropolitan Santo Yohanes PembaptisPortugis: Catedral Metropolitana São João Batistacode: pt is deprecated Katedral Niterói22°53′29.51″S 43°7′13.62″W / 22.8915306°S 43.1204500°W / -22.8915306; -43.1204500Koordinat: 22°53′29.51″S 43°7′13.62″W / 22.8915306°S 43.1204500°W / -22.8915306; -43.1204500LokasiNiteróiNegara BrasilDenominasiGereja Katolik RomaArsitekturStatusKatedralStatus fungsio...

 

Joe Maguire Pelaksana tugas Direktur Intelijensi NasionalMasa jabatan16 Agustus 2019 – 20 Februari 2020PresidenDonald Trump PendahuluDan CoatsPenggantiRichard Grenell (pelaksana tugas)DirekturPusat Pemberantasan Terorisme NasionalMasa jabatan27 Desember 2018 – 16 Agustus 2019PresidenDonald Trump PendahuluRussell Travers (pelaksana tugas)PenggantiRussell Travers (pelaksana tugas) Informasi pribadiLahir14 Agustus 1951 (umur 72)New York City, New York, Amerika SerikatP...

العلاقات المغربية المكسيكية   المكسيك   المغرب تعديل مصدري - تعديل   تشير العلاقات المغربية المكسيكية غالبا إلى العلاقات الدبلوماسية بين المغرب والمكسيك. العلاقات بين المكسيك والمغرب ودية بشكل أساسي وتتميز بالاحترام المتبادل والتعاون في مجالات مثل التجارة و...

 

هذه المقالة تحتاج للمزيد من الوصلات للمقالات الأخرى للمساعدة في ترابط مقالات الموسوعة. فضلًا ساعد في تحسين هذه المقالة بإضافة وصلات إلى المقالات المتعلقة بها الموجودة في النص الحالي. (ديسمبر 2021) نادي جوزتيبي تأسس عام 1925  الملعب ملعب إزمير أتاتورك  [لغات أخرى]‏ ...

 

العلاقات المارشالية الميانمارية جزر مارشال ميانمار   جزر مارشال   ميانمار تعديل مصدري - تعديل   العلاقات المارشالية الميانمارية هي العلاقات الثنائية التي تجمع بين جزر مارشال وميانمار.[1][2][3][4][5] مقارنة بين البلدين هذه مقارنة عامة ومرجعية ل...

Medium-security United States prison in Indiana Federal Correctional Institution, Terre HauteLocationTerre Haute, Vigo County, IndianaStatusOperationalSecurity classMedium-security (with minimum-security prison camp)Population1,190 (455 in prison camp)Opened1940 (as the United States Penitentiary, Terre Haute)Managed byFederal Bureau of Prisons The Federal Correctional Institution, Terre Haute (FCI Terre Haute) is a medium-security United States federal prison for male inmates in Indiana. It ...

 

Questa voce o sezione deve essere rivista e aggiornata appena possibile. Sembra infatti che questa voce contenga informazioni superate e/o obsolete. Se puoi, contribuisci ad aggiornarla. Voce principale: Football Club des Girondins de Bordeaux. Football Club des Girondins de BordeauxStagione 2014-2015Sport calcio Squadra Bordeaux Allenatore Willy Sagnol All. in seconda Sylvain Matrisciano Presidente Jean-Louis Triaud Ligue 16° Coppa di FranciaSedicesimi di finale Coppa di LegaOttavi di...

 

Pour les articles homonymes, voir Lanterne. Une lanterne place de la Carrière à Nancy Une lanterne est un appareil d'éclairage souvent portatif, constitué d'une boîte dont les faces sont fermées par un matériau translucide ou transparent, où l'on enferme un dispositif éclairant (chandelle, bougie, lampe à huile, à pétrole ou électrique). Les surfaces transparentes étaient autrefois en corne ou en verre Le réverbère ou lanterne réverbère ajoute des réflecteurs à la lantern...

Halaman ini berisi artikel tentang perusahaan farmasi, kimia, dan ilmu hayati. Untuk penggunaan lain, lihat Bayer (disambiguasi). Bayer Aspirin beralih ke halaman ini. Untuk produk farmasi, lihat aspirin. Bayer AGKantor pusat Bayer di Leverkusen, JermanJenisAktiengesellschaft (AG)Kode emitenFWB: BAYNKomponen DAXIndustriIlmu hayatiFarmasiKimiaDidirikan1 Agustus 1863; 160 tahun lalu (1863-08-01)[1]PendiriFriedrich BayerKantorpusatLeverkusen, JermanWilayah operasiSeluruh duniaTokohk...

 

Fortified wine from Sicily, Italy Not to be confused with Masala, a mixture of spices in South Asian cuisine. Marsala wine Marsala is a fortified wine, dry or sweet, produced in the region surrounding the Italian city of Marsala in Sicily. Marsala first received Denominazione di Origine Controllata (DOC) status in 1969.[1] The European Union grants Protected designation of origin (PDO) status to Marsala and most other countries limit the use of the term Marsala to products from the Ma...

 

Questa voce sugli argomenti allenatori di calcio belgi e calciatori belgi è solo un abbozzo. Contribuisci a migliorarla secondo le convenzioni di Wikipedia. Segui i suggerimenti dei progetti di riferimento 1, 2. Bart De Roover Nazionalità  Belgio Altezza 186 cm Calcio Ruolo Allenatore (ex difensore) Termine carriera 1999 - giocatore CarrieraSquadre di club1 1985-1988 Zwarte Leeuw1988-1991 Lokeren85 (10)1991-1995 Gent104 (8)1995-1997 Lierse60 (4)1997-1999 ...

This is a list of wars involving the Republic of Liberia. Conflict Conflict Combatant 1 Combatant 2 Result World War I(1914–1918) Allied Powers France Britain  United Kingdom  Canada  Australia  New Zealand  India  South Africa  Russia (1914–17) Japan Italy (1915–18) United States (1917–18) Serbia Montenegro Belgium Romania (1916–18) Portugal (1916–18) Brazil (1917–18) Hejaz (1916–18) Ch...

 

Roman Catholic archdiocese in Poland Archdiocese of Szczecin-KamieńArchidioecesis Sedinensis-CaminensisArchidiecezja Szczecińsko-KamieńskaCathedral Basilica of St James in SzczecinLocationCountryPolandStatisticsArea12,754 km2 (4,924 sq mi)Population- Total- Catholics(as of 2020)1,014,003975,450 (96,2%)InformationDenominationCatholic ChurchRiteLatin RiteCathedralCathedral Basilica of St. James the Apostle, SzczecinCo-cathedralCo-Cathedral of St. John the Baptis...

 

Model of hyperbolic geometry Many hyperbolic lines through point P not intersecting line a in the Beltrami Klein model A hyperbolic triheptagonal tiling in a Beltrami–Klein model projection In geometry, the Beltrami–Klein model, also called the projective model, Klein disk model, and the Cayley–Klein model, is a model of hyperbolic geometry in which points are represented by the points in the interior of the unit disk (or n-dimensional unit ball) and lines are represented by the chords,...

Marcelo ClaureLahir9 Desember 1970 (umur 53)La Paz, BoliviaKebangsaanBolivia AmerikaAlmamaterUniversitas Bentley (Sarjana)PekerjaanWirausahawan teknologi, investor, filantropisGelarCEO Softbank Group InternationalAnggota dewanWeWorkT-MobileUnivisionFortressBrightstarArmGirona FCSuami/istriJordan Engard Raul Marcelo Claure (lahir 9 Desember 1970) adalah seorang wirausahawan teknologi, pengusaha dan investor Bolivia-Amerika.[1] Kini menjadi kepala jabatan eksekutif SoftBank Group ...

 

This article relies excessively on references to primary sources. Please improve this article by adding secondary or tertiary sources. Find sources: Divine Divinity – news · newspapers · books · scholar · JSTOR (September 2018) (Learn how and when to remove this message) 2002 video gameDivine DivinityDeveloper(s)Larian StudiosPublisher(s)cdv Software EntertainmentDirector(s)Swen VinckeProgrammer(s)Swen VinckeWriter(s) Darren Evans Patrick Grieser Gill...

 

Squash Cucurbita Buah cucurbita dalam berbagai macam warna dan ukuranTaksonomiKerajaanPlantaeDivisiTracheophytaOrdoCucurbitalesFamiliCucurbitaceaeGenusCucurbita Linnaeus, 1753 Tipe taksonomiCucurbita pepo Tata namaSinonim takson Mellonia Gasp. Melopepo Mill. Ozodycus Raf. Pepo Mill. Pileocalyx Gasp. Sphenantha Schrad. Tristemon Scheele 1848, illegitimate homonym, not Raf. 1819 (Juncaginaceae) nor Raf. 1838 (Juncaceae) nor Klotzsch 1838 (Ericaceae)[1][2] Cucurbita (bahasa Latin...

This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: William Joseph O'Connor – news · newspapers · books · scholar · JSTOR (August 2012) (Learn how and when to remove this message) William Joseph O'Connor) William Joseph O'Connor (4 May 1862 –23 November 1892) was a professional oarsman who attempted to win the...

 

فرويدنبرغ    علم شعار   الإحداثيات 49°45′00″N 9°20′00″E / 49.75°N 9.3333333333333°E / 49.75; 9.3333333333333   [1] تقسيم إداري  البلد ألمانيا[2]  خصائص جغرافية  المساحة 34.78 كيلومتر مربع (1997)[3]  ارتفاع 133 متر  عدد السكان  عدد السكان 3720 (31 ديسمبر 2022)[4]...