Бефунџ
Овај чланак садржи списак литературе, сродне писане изворе или спољашње везе, али његови извори остају нејасни, јер нису унети у сам текст. |
Бефунџ | |
---|---|
Модел | императиван језик |
Појавио се | 1993. |
Аутор(и) | Пресеј |
Дијалекти | Befunge-93, Befunge-98 |
Утицаји | Forth ,FALSE |
Веб-сајт | catseye.tc/node/Befunge-93.html |
Бефунџ је дводимензионални езотеричан програмски језик направљен 1993 од стране Крис Пресеј са циљем да се што је могуће теже компајлира.
Историја
[уреди | уреди извор]Језик је направљен за фамилију рачунара Амига, као покушај да направи језик који је компилатору што теже превести.
Написано је неколико компајлера. Оригинални Бефунџ (знани као "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 |
---|---|
0 – 9
|
Гурни одрећени број на стек |
+
|
Сабирање: Скини а и б, онда гурни а+б |
-
|
Одузимање Скини а и б, онда гурни б-а |
*
|
Множење: Скини а и б, онда гурни а*б |
/
|
Целобројно дељење: Скини а и б, онда гурни б/a, заокружено ка 0. |
%
|
Остатак: Скини а и б, онда гурни остатак од целобројног дељења б/a. |
!
|
Логичко не: Скини вредност. Ако је вредност 0, гурни 1; у осталим случајевима гурни 0. |
`
|
Веће од: Скини а и б, онда гурни 1 ако b>a, у осталим случајевима гурни 0. |
>
|
Почни да се помераш надесно |
<
|
Почни да се помераш налево |
^
|
Почни да се помераш нагоре |
v
|
Почни да се помераш надоле |
?
|
Почни да се помераш у било ком смеру |
_
|
Хоризонтално ако: скини вредност; стави смер надесно ако је вреднос=0, стави смер лево ако услов није испуњен |
Вертикално ако: скини вредност; стави смер надоле ако је вреднос=0, стави смер горе ако услов није испуњен | |
"
|
Упали стринг, гурни АСЦII вредност сваког карактера све до следећег " )
|
:
|
Дуплирај вредност горњем стеку |
\
|
Замени две дредности на горњем стеку |
$
|
Скини вредност са стека и избриши је |
.
|
Скини вредност и изпиши је као цео број праћен једанм спејс каракетером |
,
|
Скини вредност и изпиши је као АСЦII карактер |
#
|
Мост: Скочи на следећу команду у смеру показивача |
g
|
Позив за "узимање"(начин да се узме нешто из меморије). Скини а онда б, онда гурни АСЦII вредност карактера у позицију на којој се налази показивач у мрежи |
p
|
Ппозив за "Чување"(начин да се чува вредност за касније коришћење).Скини а, б и ц и онда промени карактер на коорднати мреже(а, б) са АСЦII вредношћу ц |
&
|
Тражи од корисника за цео број и гурни га |
~
|
Тражи од корисника АСЦII карактер и гурни његову АСЦII вредност |
@
|
Заврши програм |
Већина једно-димензијалних програма имају синтаксичку разлику измећу текста коментара и кода програма, у Бефунџ-у нема синтаксе за коментар. Програмер наведе ток програма око коментара тако да текст коментара никада неће бити извршаван.
Примери неких једноставних програма
[уреди | уреди извор]"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
Референце
[уреди | уреди извор]- ^ „History”. Befunge. Приступљено 06. 11. 2018.
- ^ „Compilation”. Befunge. Приступљено 06. 11. 2018.
- ^ „Related languages”. Befunge. Приступљено 06. 11. 2018.
- ^ „Examples”. Befunge. Приступљено 06. 11. 2018.