Befundž je dvodimenzionalni ezoteričan programski jezik napravljen 1993 od strane Kris Presej sa ciljem da se što je moguće teže kompajlira.

Befundž
Modelimperativan jezik
Pojavio se1993.
Autor(i)Presej
DijalektiBefunge-93, Befunge-98
UticajiForth ,FALSE
Veb-sajtcatseye.tc/node/Befunge-93.html

Istorija uredi

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

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

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

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

Cmd Description
09 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

[4]

"Befunge 93,Befunge 98" uredi


Zdravo, svete! uredi

64+"! етевс, овардЗ">:#,_@

Faktorijel uredi

&>:1-:v v *_$.@ 
 ^    _$>\:^

Dna-kod uredi

 >78*vD
v$_#>vN
7>!@  A
3 :v??v
9,-""""
4+1ACGT
+,,""""
>^^<<<<

Eratostenovo sito uredi

2>:3g" "-!v\  g30          <
 |!`"O":+1_:.:03p>03g+:"O"`|
 @               ^  p3\" ":<
2 234567890123456789012345678901234567890123456789012345678901234567890123456789


Reference uredi

  1. ^ „History”. Befunge. Pristupljeno 06. 11. 2018. 
  2. ^ „Compilation”. Befunge. Pristupljeno 06. 11. 2018. 
  3. ^ „Related languages”. Befunge. Pristupljeno 06. 11. 2018. 
  4. ^ „Examples”. Befunge. Pristupljeno 06. 11. 2018. 


Spoljašnje veze uredi