Бефунџ је дводимензионални езотеричан програмски језик направљен 1993 од стране Крис Пресеј са циљем да се што је могуће теже компајлира.

Бефунџ
Моделимперативан језик
Појавио се1993.
Аутор(и)Пресеј
ДијалектиBefunge-93, Befunge-98
УтицајиForth ,FALSE
Веб-сајтcatseye.tc/node/Befunge-93.html

Историја уреди

Језик је направљен за фамилију рачунара Амига, као покушај да направи језик који је компилатору што теже превести. Написано је неколико компајлера. Оригинални Бефунџ (знани као "Befunge-93") има много наследника. Најближи рођак му је Befunge-98 из Funge-98 фамилије језика. Сваки Фунџ проширује концепт Бефунџ на више димензија (на пример, Unefunge је једно-димензијалан језик, Trifunge је тродимензионалан, Nfunge н-димензијалан, итд.) Оригинална спецификација језика је ограничавала величину мреже на којој се језик може писати, што значи да Бефунџ није Тјуринг комплетан језик (за разлику од других езотеричних језика). Као и сви други езотерични језици он нема употребну вредност.
Као што је наглашено оригиналани програм није био Тјуринг-потпун али верзија Befunge-98 је Тјрунг-потпуна тако што су скинуте рестрикције величине програма, уместо да се умотава на фиксној вредности, померање инструкција Befunge-98 прати модел назван "Lahey-space" (названом по његовом творцу), у овом моделу, мрежа се понаша као торус.[1]

Компилација уреди

Као што је наведено, дизајн циљ за Бефунџа био је створити језик који је био тешко компилирати. Ово је реализовано две главне карактеристике:

   само-модификовање - п инструкција може написати нове инструкције у програм;
   мултидимензионално - исто упутство се може извршити у четири различита контекста (у лево-десном низу инструкција, или десно-на-лево или горе или надоле.)

Ипак, ове препреке су до неке мере превазиђене, а Бефунџ компилатори су написани, користећи одговарајуће технике.

Компилатор Bf2c који је укључен у стандардну Befunge-93 дистрибуцију користи навојну шифру: свака инструкција је сакупљена на одломак Ц кода, а контрола протиче кроз одрезке баш као што то ради у Бефунџ тумачу (то је условно на вредност неких регистар 'смера'.) Ово не резултира значајним предностима над добрим преводиоцем. Имајте на уму да bf2c компајлер није тачан, јер се не рукује н исправно, али то не би било немогуће учинити (иако језик C можда није погодан за ово).

Компилатор Betti, на пример, третира сваку могућу праву линију инструкција као подпрограм, и ако п инструкција мења тај подпрограм, тај подпрограм се поново компајлира. Ово је интересантна варијација у компилацији управо у времену и резултира много боље предностима над преводиоцем, пошто се многа упутства могу извршити у изворном коду, без интерних одлука у регистру 'смер'.

Компилатори Befunit и Bait, слично компајлеру Betti, поделили су изворни код у подпрограме који су раније сакупљени и извршени. Оне, међутим, деле изворну таблу на "статичке стазе" - кодне стазе које не садрже упутства која условно мењају правац (тј. |, _ Или?). "Статичке стазе" могу проћи на више ћелија од "правих путева" Бетти-а, што доводи до мањег и дужег потпрограма. Стога, постоји мање контекстних скокова између компајлера и компајлираног кода и омогућава више оптимизација. [2]

Повезани језици уреди

Бефунџ је претходио 1991. године сличном, али мање карактеристичаном, језику Биота, који је дизајниран за експерименте у саморепродукцији. Следио је убрзо након 1994. године још један сличан језик Ортагонал, чији дизајн је подстакнут дискусијом о алт.фолклор.компјутерс. Сваки од ова три језика настао је потпуно независно од остала два.

Бефунџ је такође пружио инспирацију за дизајн следећих језика, а најсличнији од њих су познати као фунгеоиди. Већина језика није довољно слична да се назива директним потомцима, али често аутор спомиње утицај Бефунгџа у пратећем коментару. Такви језици укључују Вирд, дводимензионални Туринг тарпи; Бефрјк, реверзибилни језик; и ПАТХ, који комбинује елементе Браинфуцк-а. [3]

Преглед језика уреди

Бефунџ програм се састоји од дводимензионалне мреже одрећене величине. Мрежа се иницијално напуни инструкцијама програма. Такоће она може служити и као складиште које се може допуњивати.
1 Покретање почиње уз помоћ показивача на инструкцију. Показивач почиње на одрећеној локацији (горњи леви угао мреже) и иницијално путује у одрећеном смеру (десно). Када дође до инструкције, он је извршава.
Пример бесконачне петље:

>v
^<

Инструкције("Befunge 93") уреди

Cmd Description
09 Гурни одрећени број на стек
+ Сабирање: Скини а и б, онда гурни а+б
- Одузимање Скини а и б, онда гурни б-а
* Множење: Скини а и б, онда гурни а*б
/ Целобројно дељење: Скини а и б, онда гурни б/a, заокружено ка 0.
% Остатак: Скини а и б, онда гурни остатак од целобројног дељења б/a.
! Логичко не: Скини вредност. Ако је вредност 0, гурни 1; у осталим случајевима гурни 0.
` Веће од: Скини а и б, онда гурни 1 ако b>a, у осталим случајевима гурни 0.
> Почни да се помераш надесно
< Почни да се помераш налево
^ Почни да се помераш нагоре
v Почни да се помераш надоле
? Почни да се помераш у било ком смеру
_ Хоризонтално ако: скини вредност; стави смер надесно ако је вреднос=0, стави смер лево ако услов није испуњен
Вертикално ако: скини вредност; стави смер надоле ако је вреднос=0, стави смер горе ако услов није испуњен
" Упали стринг, гурни АСЦII вредност сваког карактера све до следећег ")
: Дуплирај вредност горњем стеку
\ Замени две дредности на горњем стеку
$ Скини вредност са стека и избриши је
. Скини вредност и изпиши је као цео број праћен једанм спејс каракетером
, Скини вредност и изпиши је као АСЦII карактер
# Мост: Скочи на следећу команду у смеру показивача
g Позив за "узимање"(начин да се узме нешто из меморије). Скини а онда б, онда гурни АСЦII вредност карактера у позицију на којој се налази показивач у мрежи
p Ппозив за "Чување"(начин да се чува вредност за касније коришћење).Скини а, б и ц и онда промени карактер на коорднати мреже(а, б) са АСЦII вредношћу ц
& Тражи од корисника за цео број и гурни га
~ Тражи од корисника АСЦII карактер и гурни његову АСЦII вредност
@ Заврши програм

Већина једно-димензијалних програма имају синтаксичку разлику измећу текста коментара и кода програма, у Бефунџ-у нема синтаксе за коментар. Програмер наведе ток програма око коментара тако да текст коментара никада неће бити извршаван.

Примери неких једноставних програма уреди

[4]

"Befunge 93,Befunge 98" уреди


Здраво, свете! уреди

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


Референце уреди

  1. ^ „History”. Befunge. Приступљено 06. 11. 2018. 
  2. ^ „Compilation”. Befunge. Приступљено 06. 11. 2018. 
  3. ^ „Related languages”. Befunge. Приступљено 06. 11. 2018. 
  4. ^ „Examples”. Befunge. Приступљено 06. 11. 2018. 


Спољашње везе уреди