Бефунџ

(преусмерено са Befunge)

Бефунџ је дводимензионални езотеричан програмски језик направљен 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. 


Спољашње везе

уреди