Befundž
Ovaj članak sadrži spisak literature, srodne pisane izvore ili spoljašnje veze, ali njegovi izvori ostaju nejasni, jer nisu uneti u sam tekst. |
Befundž | |
---|---|
Model | imperativan jezik |
Pojavio se | 1993. |
Autor(i) | Presej |
Dijalekti | Befunge-93, Befunge-98 |
Uticaji | Forth ,FALSE |
Veb-sajt | catseye.tc/node/Befunge-93.html |
Befundž je dvodimenzionalni ezoteričan programski jezik napravljen 1993 od strane Kris Presej sa ciljem da se što je moguće teže kompajlira.
Istorija
[uredi | uredi izvor]Jezik je napravljen za familiju računara Amiga, kao pokušaj da napravi jezik koji je kompilatoru što teže prevesti.
Napisano je nekoliko kompajlera. Originalni Befundž (znani kao "Befunge-93") ima mnogo naslednika. Najbliži rođak mu je Befunge-98 iz Funge-98 familije jezika. Svaki Fundž proširuje koncept Befundž na više dimenzija (na primer, Unefunge je jedno-dimenzijalan jezik, Trifunge je trodimenzionalan, Nfunge n-dimenzijalan, itd.)
Originalna specifikacija jezika je ograničavala veličinu mreže na kojoj se jezik može pisati, što znači da Befundž nije
Tjuring kompletan jezik (za razliku od drugih ezoteričnih jezika). Kao i svi drugi ezoterični jezici on nema upotrebnu vrednost.
Kao što je naglašeno originalani program nije bio Tjuring-potpun ali verzija Befunge-98 je Tjrung-potpuna tako što su skinute restrikcije veličine programa, umesto da se umotava na fiksnoj vrednosti, pomeranje instrukcija Befunge-98 prati model nazvan "Lahey-space" (nazvanom po njegovom tvorcu), u ovom modelu, mreža se ponaša kao torus.[1]
Kompilacija
[uredi | uredi izvor]Kao što je navedeno, dizajn cilj za Befundža bio je stvoriti jezik koji je bio teško kompilirati. Ovo je realizovano dve glavne karakteristike:
само-модификовање - п инструкција може написати нове инструкције у програм; мултидимензионално - исто упутство се може извршити у четири различита контекста (у лево-десном низу инструкција, или десно-на-лево или горе или надоле.)
Ipak, ove prepreke su do neke mere prevaziđene, a Befundž kompilatori su napisani, koristeći odgovarajuće tehnike.
Kompilator Bf2c koji je uključen u standardnu Befunge-93 distribuciju koristi navojnu šifru: svaka instrukcija je sakupljena na odlomak C koda, a kontrola protiče kroz odrezke baš kao što to radi u Befundž tumaču (to je uslovno na vrednost nekih registar 'smera'.) Ovo ne rezultira značajnim prednostima nad dobrim prevodiocem. Imajte na umu da bf2c kompajler nije tačan, jer se ne rukuje n ispravno, ali to ne bi bilo nemoguće učiniti (iako jezik C možda nije pogodan za ovo).
Kompilator Betti, na primer, tretira svaku moguću pravu liniju instrukcija kao podprogram, i ako p instrukcija menja taj podprogram, taj podprogram se ponovo kompajlira. Ovo je interesantna varijacija u kompilaciji upravo u vremenu i rezultira mnogo bolje prednostima nad prevodiocem, pošto se mnoga uputstva mogu izvršiti u izvornom kodu, bez internih odluka u registru 'smer'.
Kompilatori Befunit i Bait, slično kompajleru Betti, podelili su izvorni kod u podprograme koji su ranije sakupljeni i izvršeni. One, međutim, dele izvornu tablu na "statičke staze" - kodne staze koje ne sadrže uputstva koja uslovno menjaju pravac (tj. |, _ Ili?). "Statičke staze" mogu proći na više ćelija od "pravih puteva" Betti-a, što dovodi do manjeg i dužeg potprograma. Stoga, postoji manje kontekstnih skokova između kompajlera i kompajliranog koda i omogućava više optimizacija. [2]
Povezani jezici
[uredi | uredi izvor]Befundž je prethodio 1991. godine sličnom, ali manje karakterističanom, jeziku Biota, koji je dizajniran za eksperimente u samoreprodukciji. Sledio je ubrzo nakon 1994. godine još jedan sličan jezik Ortagonal, čiji dizajn je podstaknut diskusijom o alt.folklor.kompjuters. Svaki od ova tri jezika nastao je potpuno nezavisno od ostala dva.
Befundž je takođe pružio inspiraciju za dizajn sledećih jezika, a najsličniji od njih su poznati kao fungeoidi. Većina jezika nije dovoljno slična da se naziva direktnim potomcima, ali često autor spominje uticaj Befungdža u pratećem komentaru. Takvi jezici uključuju Vird, dvodimenzionalni Turing tarpi; Befrjk, reverzibilni jezik; i PATH, koji kombinuje elemente Brainfuck-a. [3]
Pregled jezika
[uredi | uredi izvor]Befundž program se sastoji od dvodimenzionalne mreže odrećene veličine. Mreža se inicijalno napuni instrukcijama programa. Takoće ona može služiti i kao skladište koje se može dopunjivati.
1
Pokretanje počinje uz pomoć pokazivača na instrukciju. Pokazivač počinje na odrećenoj lokaciji (gornji levi ugao mreže) i inicijalno putuje u odrećenom smeru (desno). Kada dođe do instrukcije, on je izvršava.
Primer beskonačne petlje:
>v ^<
Instrukcije("Befunge 93")
[uredi | uredi izvor]Cmd | Description |
---|---|
0 – 9
|
Gurni odrećeni broj na stek |
+
|
Sabiranje: Skini a i b, onda gurni a+b |
-
|
Oduzimanje Skini a i b, onda gurni b-a |
*
|
Množenje: Skini a i b, onda gurni a*b |
/
|
Celobrojno deljenje: Skini a i b, onda gurni b/a, zaokruženo ka 0. |
%
|
Ostatak: Skini a i b, onda gurni ostatak od celobrojnog deljenja b/a. |
!
|
Logičko ne: Skini vrednost. Ako je vrednost 0, gurni 1; u ostalim slučajevima gurni 0. |
`
|
Veće od: Skini a i b, onda gurni 1 ako b>a, u ostalim slučajevima gurni 0. |
>
|
Počni da se pomeraš nadesno |
<
|
Počni da se pomeraš nalevo |
^
|
Počni da se pomeraš nagore |
v
|
Počni da se pomeraš nadole |
?
|
Počni da se pomeraš u bilo kom smeru |
_
|
Horizontalno ako: skini vrednost; stavi smer nadesno ako je vrednos=0, stavi smer levo ako uslov nije ispunjen |
Vertikalno ako: skini vrednost; stavi smer nadole ako je vrednos=0, stavi smer gore ako uslov nije ispunjen | |
"
|
Upali string, gurni ASCII vrednost svakog karaktera sve do sledećeg " )
|
:
|
Dupliraj vrednost gornjem steku |
\
|
Zameni dve drednosti na gornjem steku |
$
|
Skini vrednost sa steka i izbriši je |
.
|
Skini vrednost i izpiši je kao ceo broj praćen jedanm spejs karaketerom |
,
|
Skini vrednost i izpiši je kao ASCII karakter |
#
|
Most: Skoči na sledeću komandu u smeru pokazivača |
g
|
Poziv za "uzimanje"(način da se uzme nešto iz memorije). Skini a onda b, onda gurni ASCII vrednost karaktera u poziciju na kojoj se nalazi pokazivač u mreži |
p
|
Ppoziv za "Čuvanje"(način da se čuva vrednost za kasnije korišćenje).Skini a, b i c i onda promeni karakter na koordnati mreže(a, b) sa ASCII vrednošću c |
&
|
Traži od korisnika za ceo broj i gurni ga |
~
|
Traži od korisnika ASCII karakter i gurni njegovu ASCII vrednost |
@
|
Završi program |
Većina jedno-dimenzijalnih programa imaju sintaksičku razliku izmeću teksta komentara i koda programa, u Befundž-u nema sintakse za komentar. Programer navede tok programa oko komentara tako da tekst komentara nikada neće biti izvršavan.
Primeri nekih jednostavnih programa
[uredi | uredi izvor]"Befunge 93,Befunge 98"
[uredi | uredi izvor]
64+"! етевс, овардЗ">:#,_@
&>:1-:v v *_$.@ ^ _$>\:^
>78*vD v$_#>vN 7>!@ A 3 :v??v 9,-"""" 4+1ACGT +,,"""" >^^<<<<
2>:3g" "-!v\ g30 < |!`"O":+1_:.:03p>03g+:"O"`| @ ^ p3\" ":< 2 234567890123456789012345678901234567890123456789012345678901234567890123456789
Reference
[uredi | uredi izvor]- ^ „History”. Befunge. Pristupljeno 06. 11. 2018.
- ^ „Compilation”. Befunge. Pristupljeno 06. 11. 2018.
- ^ „Related languages”. Befunge. Pristupljeno 06. 11. 2018.
- ^ „Examples”. Befunge. Pristupljeno 06. 11. 2018.