Βrainf***

Γενικά θέματα για τις γλώσσες προγραμματισμού που δεν καλύπτονται από τις άλλες περιοχές της κατηγορίας.

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
LightForce
WebDev Moderator
Δημοσιεύσεις: 3812
Εγγραφή: 13 Απρ 2003 23:49

Βrainf***

Δημοσίευση από LightForce » 15 Αύγ 2006 23:04

H Brainfuck ανήκει στην κατηγορία των 'Esoteric' γλωσσών προγραμματισμού, η πρώτη τέτοιου είδους γλώσσα είναι η INTERCAL που σχεδιάστηκε το 1972.
Οι γλώσσες που ανήκουν σε αυτήν την κατηγορία σχεδιάζονται με σκοπό να είναι μικρές, γεμάτες παράξενες ιδέες, πολύ δύσκολες στον προγραμματισμό,
η ακόμα και σαν αστείο μεταξύ προγραμματιστών.

Υπάρχει μια μικρή αλλά πολύ ζωντανή ομάδα χρηστών που ασχολείται ενεργά με αυτές τις γλώσσες.
Η δική μου σχέση ξεκίνησε πριν λίγους μήνες όταν και ανακάλυψα την Βrainfuck,την διασημότερη απο όλες αυτες τις γλώσσες.
Όπως καταλαβαίνετε δεν έχουν σκοπό να αντικαταστήσουν τις κανονικές γλώσσες προγραμματισμού.

Η Βrainfuck φτιάχτηκε απο τον Urban Muller to 1993 σε μια προσπάθεια να γράψει τον μικρότερο compiler για την Amiga (240 bytes)
Είναι εύκολη (μιλάμε για μια γλώσσα με 8 εντολές) αλλα ταυτόχρονα πολύπλοκη όταν πρόκειται για συγγραφή προγραμμάτων με αυτήν,
και (κατά την γνώμη μου) εξαιρετικά ενδιαφέρουσα. Eχει εμπνέυσει προγραμματιστές και έχουν σχεδιάστεί πολλές άλλες γλώσσες που ανήκουν στην
κατηγορία 'Esoteric' και βασίζονται σε αυτήν.

Η γλώσσα είναι Turing-Complete, μπορεί δηλαδή να κάνει οποιαδήποτε πράξη μπορεί να κάνει και ένας ηλεκτρονικός υπολογιστής, η να λύσει οποιαδήποτε συνάρτηση.
θεωρητικά και εφόσον δοθεί άπειρη μνήμη (κελιά). Θα χρειαστεί να διαβάσετε λίγες πληροφορίες για την μηχανή του Turing, για να μπορέσετε να κατανοήσετε
πλήρως τις δυνατότητες της Brainfuck.

Παρακάτω είναι ένας απλός interpreter που έκανα για την Brainfuck, θα τρέξει σε Dos η Windows 98/XP (στην κονσόλα), βρίσκεται στην έκδοση 0.7
Όπως και η αρχική έκδοση χρησιμοποιεί μια διάταξη 30000 θέσεων (κελιών) που το καθένα έχει μέγεθος ένα byte (0-255)
Το κάθε κελί έχει για αρχική τιμή το 0. Υπάρχει ένας δείκτης αρχικά τοποθετημένος στο πρώτο (απο αριστερά) κελί ο οποίος μπορεί και μετακινείται αριστερά και δεξιά.
Χρησιμοποιώ την τιμή ASCII 10 για το Εnter (νέα γραμμή). Το αναφέρω γιατί υπάρχουν πολλές εκδόσεις. Άλλοι χρησιμοποιούν το 10 άλλοι το 13 άλλοι και τα 2.
Το πρόγραμμα είναι αργό, ειδικά αν πρόκειται να τρέξει 'δύσκολα' script, αν κολλήσει πατήστε μερικές φορές το 'ESC' και βασίζεται σε ένα μικρό QBasic script που τροποποίησα.

Οι 8 μοναδικές εντολές της Brainfuck είναι:

Κώδικας: Επιλογή όλων

>          Μετακίνησε τον δείκτη δεξιά
<          Μετακίνησε τον δείκτη αριστερά
+          Αύξησε &#40;κατά ένα&#41; την τιμή στο κελί μνήμης στην θέση του δείκτη
-          Μείωσε &#40;κατά ένα&#41; την τιμή στο κελί μνήμης στην θέση του δείκτη
.          Τύπωσε τον χαρακτήρα που βρίσκεται στο κελί μνήμης που είναι ο δείκτης
,          Είσαγωγή ενός χαρακτήρα και αποθήκευση στο κελί μνήμης που είναι ο δείκτης.
&#91;          Προχώρα μετά το αντίστοιχο &#93; εάν η τιμή στο κελί που βρίσκεται ο δείκτης είναι 0
&#93;          Πήγαινε πίσω στο αντίστοιχο &#91;
Στην γλώσσα C θα ήταν:

Κώδικας: Επιλογή όλων

>          ++ptr;
<          --ptr;
+          ++*ptr;
-           --*ptr;
.           putchar&#40;*ptr&#41;;
,           *ptr=getchar&#40;&#41;;
&#91;           while &#40;*ptr&#41; &#123;
&#93;            &#125;
Δύο παραδειγματα.
Πρώτα ας τυπώσουμε όλους τους ASCII χαρακτήρες του DOS με την Brainfuck:
Ο κώδικας είναι:

Κώδικας: Επιλογή όλων

+&#91;.+&#93;
Προσθέτουμε ένα στο πρώτο κελί μνήμης
Μπαίνουμε στην λούπα η οποία τυπώνει τον ASCII χαρακτήρα και προσθέτει ένα.
Επειδή το κάθε κελί όπως αναφέραμε είναι ένα byte, αυτόματα έχουμε έξοδο απο την λούπα μόλις η τιμή περάσει το 255 και γίνει ξανά 0.

Ακόμα ένα μικρό βοήθημα για να ξεκινήσετε, ας γράψουμε (με απλό τρόπο) την λέξη FREESTUFF με την Brainfuck:
O κώδικας είναι:

Κώδικας: Επιλογή όλων

++++++++++&#91;->+++++++<&#93;>
.++++++++++++.-------------..
++++++++++++++.+.+.---------------..
Προσθέτουμε 10 στο πρώτο κελί και μπαίνουμε στην λούπα.
Αφαιρούμε 1 πηγαίνουμε στο δεύτερο κελί προσθέτουμε 7, ξαναγυρίζουμε στο πρώτο.
Αυτό θα γίνει 10 φορές και στην έξοδο απο την λούπα (μόλις δηλαδή η τιμή στο πρώτο κελί γίνει 0) η τιμή στο δεύτερο κελί θα έχει την τιμή 70.
Το 70 είναι ο ASCII κώδικας του 'F' οπότε στην έξοδο απο την λούπα πηγαίνουμε στο δεύτερο κελί. Εδώ τελειώνει και η πρώτη γραμμή.
Η συνέχεια είναι σχετικά εύκολη. Τυπώνουμε το 'F' προχωράμε στο 'R' (ASCII 82) προθέτοντας 12, το τυπώνουμε και συνεχίζουμε...
Όπως καταλαβαίνετε θα χρειαστεί ένας ASCII πίνακας εύκαιρος, για να μπορέσετε να προγραμματίσετε την Brainfuck.

Αυτά τα λίγα για την γλώσσα, θα βρείτε πολλά tutorials στο δίκτυο (καλύτερα απο το δικό μου)
Κάντε unzip το αρχείο με την επιλογή 'use folder names' μαρκαρισμένη.
θα δημιουργηθεί ο φάκελος BFI που περιέχει το BFI.EXE και λίγα παραδείγματα.
Μην κάνετε κλικ στο αρχείο αλλά ανοίξτε το command prompt (γραμμή εντολών του DOS)
Πηγαίνετε στον φάκελο που βρίσκεται ο interpreter και πληκτρολογήστε BFI [όνομα του αρχείου]
Τα text αρχεία σας πρέπει να έχουν κατάληξη .BF και να είναι σωσμένα με την επιλογή 'αποθήκευση ώς: όλα τα αρχεία'

Παράδειγμα:
BFI SMILE.BF

Kατεβάστε:
[removed]


Πολλές πληροφορίες για την Brainfuck στην Wikipedia
http://en.wikipedia.org/wiki/Brainfuck

Επίσης πληροφορίες και πολλά link για την Brainfuck
http://www.iwriteiam.nl/Ha_BF.html

Πολύ καλή βοήθεια που βρήκα και έμαθα αρκετά πράγματα.
http://nieko.net/data/bf.txt

Source και compilers/interpretes
http://esoteric.sange.fi/brainfuck/

Πληροφορίες για την μηχανή του Turing
http://en.wikipedia.org/wiki/Turing_machine

Λίστα με γλώσσες που ανήκουν στην κατηγορία 'Esoteric'
http://esoteric.voxelperfect.net/wiki/Language_list

Το κλασσικό 'Hello Word' σε μερικές μόνο 'Esoteric' γλώσσες (δέστε την 'PIET' και την 'Wierd')
http://en.wikipedia.org/wiki/Hello_worl ... _languages
Τελευταία επεξεργασία από το μέλος LightForce την 11 Μαρ 2007 18:03, έχει επεξεργασθεί 1 φορά συνολικά.

Άβαταρ μέλους
skeftomilos
Script Master
Δημοσιεύσεις: 2888
Εγγραφή: 07 Ιαν 2005 07:22
Τοποθεσία: Αθήνα

Βrainf***

Δημοσίευση από skeftomilos » 16 Αύγ 2006 01:04

Προσωπικά έμαθα για τη Brainfuck πριν ενάμιση χρόνο περίπου, σκαλίζοντας τη Wikipedia για programming languages. Κάποιοι δικαίως παραπονιούνται ότι η γλώσσα θα άξιζε ένα καλύτερο όνομα. :)
The pure and simple truth is rarely pure and never simple. Ο μη νους δε σκέπτεται μη σκέψεις για το τίποτα.

LightForce
WebDev Moderator
Δημοσιεύσεις: 3812
Εγγραφή: 13 Απρ 2003 23:49

Βrainf***

Δημοσίευση από LightForce » 16 Αύγ 2006 02:45

Ναί ίσως. Αυτό όμως, ξέρεις, είναι στο flash του δημιουργού.
Πάντως γιαυτό έβαλα και τα αστεράκια στον τίτλο. Μετά το σκέφτηκα λίγο αν και στο κείμενο θα έβαζα αστεράκια αλλά τελικά το άφησα όπως έχει. :P

Άβαταρ μέλους
ThyClub
Honorary Member
Δημοσιεύσεις: 5312
Εγγραφή: 17 Νοέμ 2003 00:21
Τοποθεσία: Hell's Kitchen
Επικοινωνία:

Βrainf***

Δημοσίευση από ThyClub » 16 Αύγ 2006 16:26

Όνομα και πράγμα αυτή η γλώσσα όμως ε; :P :P

LightForce
WebDev Moderator
Δημοσιεύσεις: 3812
Εγγραφή: 13 Απρ 2003 23:49

Βrainf***

Δημοσίευση από LightForce » 17 Αύγ 2006 01:30

Είναι ναι. Απαιτεί φοβερή προσπάθεια, ενέργεια, αν την δουλέψεις λίγο, μόνο να σκεφτείς τι μπορεί να κάνει με μόνο 8 εντολές. Μπορεί να λύσει οποιαδήποτε συνάρτηση οποιασδήποτε γλώσσας προγραμματισμού. Τώρα βέβαια στην θεωρία γιατί την πράξη θα χρειαστείς γιόκα, σάι μπάμπα, μοι τάι, και να είσαι περικυκλωμένος απο μπονσάι δέντρα :P

Επίσης ξέχασα να αναφέρω ο interpreter για τα windows που χρησιμοποιώ είναι ο Delphi BF interpreter. Δοκίμασα αρκετούς και αυτός είναι αρκετά καλός, με έχει βολέψει, και συνοδεύεται απο πολύ κώδικα.
Αν και δεν τρέχουν όλα τα παραδείγματα.

http://xieke.com/dbfi.php

Άβαταρ μέλους
cherouvim
Script Master
Δημοσιεύσεις: 3137
Εγγραφή: 13 Ιούλ 2005 22:56
Τοποθεσία: Athens, Greece
Επικοινωνία:

Βrainf***

Δημοσίευση από cherouvim » 17 Αύγ 2006 06:37

Είχα στο πανεπιστήμιο ένα τρελαμένο που έπαιζε με την BF, και ήθελε, για πτυχιακή, να γράψει δικιά του υλοποίηση της γλώσσας αλλά στις 3 διαστάσεις.

Όταν μου το είπε του απάντησα "what...the...f#ck..."

Άβαταρ μέλους
skeftomilos
Script Master
Δημοσιεύσεις: 2888
Εγγραφή: 07 Ιαν 2005 07:22
Τοποθεσία: Αθήνα

Βrainf***

Δημοσίευση από skeftomilos » 17 Αύγ 2006 11:31

Δηλαδή 3D engine για BF ... γραμμένη σε BF?

Προτιμώ να αρχίσω το κάπνισμα! :P
The pure and simple truth is rarely pure and never simple. Ο μη νους δε σκέπτεται μη σκέψεις για το τίποτα.

Άβαταρ μέλους
cherouvim
Script Master
Δημοσιεύσεις: 3137
Εγγραφή: 13 Ιούλ 2005 22:56
Τοποθεσία: Athens, Greece
Επικοινωνία:

Βrainf***

Δημοσίευση από cherouvim » 17 Αύγ 2006 11:33

Όχι, θα έγραφε σε Java (ή C) μία δικιά του BF υλοποίηση που ο cursor θα έτρεχε στο χώρο (3D) και όχι στο επίπεδο (2D), όπως κάνει τώρα.

sick

LightForce
WebDev Moderator
Δημοσιεύσεις: 3812
Εγγραφή: 13 Απρ 2003 23:49

Βrainf***

Δημοσίευση από LightForce » 20 Αύγ 2006 17:17

Yπάρχουν μερικές 2d 'Εsoteric' όπως η Befuge, που ο κώδικας απλώνεται σε ένα δισδιάστατο grid. O δείκτης εντολών μπορεί να κινείται πάνω, κάτω, αριστερά η δεξιά ! Σούπερ μούρλα. Χρειάζεσαι και GPS για να μην χάνεσαι... :P

Άβαταρ μέλους
cherouvim
Script Master
Δημοσιεύσεις: 3137
Εγγραφή: 13 Ιούλ 2005 22:56
Τοποθεσία: Athens, Greece
Επικοινωνία:

Βrainf***

Δημοσίευση από cherouvim » 20 Αύγ 2006 17:49

Ναι, λάθος έκανα. Αυτό που είχα δει εγώ ήταν σε 2D. Η BF είναι σε 1D.

Απάντηση

Επιστροφή στο “γλώσσες προγραμματισμού - γενικά”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες