Кіріспе

2 өлшемді эзотерикалық бағдарламалау тілі

Befunge – екі өлшемді, стек негізінде жұмыс ілейтін, рефлексивті эзотерикалық бағдарламалау тілі. Ол дәстүрлі тілдерден екі өлшемді торда бағдарламалардың орналасуымен ерекшеленеді. "Жебе" нұсқаулары басқару ағынын солға, оңға, жоғары немесе төменге бағыттайды, ал циклдар басқару ағынын цикл бойынша жіберу арқылы құрастырылады. Ол "Форт пен Леммингс араласып кеткен нәрсе" деп сипатталған. Befunge 1993 жылы Крис Пресси Amiga үшін жасаған. Тілдің компиляциясы мүмкіндігінше қиын болу үшін жасалған, өзін-өзі өзгертетін код пен көп өлшемді ойын алаңына ие. Осыған қарамастан, тіл үшін бірнеше компиляторлар жазылған. Бастапқы Befunge 93 спецификациясы бағдарламаларды 80x25 өлшемді тормен шектеді, және толыққанды Тьюринг машинасы болмаса да, Funge 98 сияқты кейінгі кеңейтулер тұжырымдаманы кеңейтіп, толыққанды Тьюринг машинасы болуға мүмкіндік берді. "Befunge" атауы онлайн-талқылаудағы теріп қатесінен туындаған. Ол компиляциялау қиын болу үшін жасалған, бірақ bef2c және Betty сияқты компиляторлар әртүрлі техникаларды қолдана отырып, тілді іске асыруға қол жеткізді. Befunge бағдарламалары басқару ағынын өзгерту үшін жебелерді пайдаланумен сипатталады және олар кездейсоқ сандар тізбегі немесе классикалық "Hello, World!" сияқты шығыстарды тудыра алады.

Тарих

Тілді 1993 жылы Крис Пресси Amiga үшін құрастырған, ол мүмкіндігінше компиляциялау қиын тіл жасауға тырысты. p командасы кодты өздігінен өзгертуге мүмкіндік беретінін ескеріңіз. Дегенмен, кейіннен бірнеше компиляторлар жазылды. Сондай-ақ, бастапқы "Befunge 93" спецификациясына бірқатар кеңейтулер бар, ең танымалсы – Funge 98, ол ұғымды кез келген өлшемге дейін кеңейтеді және бірнеше нұсқау көрсеткіштері бір уақытта бір кеңістікте жұмыс істей алады. Befunge кеңейтулері мен нұсқалары Фунгеоидтар немесе жай ғана Фунгелер деп аталады. Befunge 93 спецификациясы әрбір жарамды бағдарламаны көлденеңінен 80 нұсқаудан, тігінен 25 нұсқаудан тұратын тормен шектейді. Осы шектерден асып кеткен бағдарлама орындау тордың екінші жағындағы сәйкес нүктеге "оралады"; Befunge бағдарламасы осылайша топологиялық тұрғыдан торға тең. Befunge 93 бағдарламасында тек бір стек болуы мүмкін және оның сақтау массиві шектеледі, сондықтан Befunge 93 тілі толық Тьюрингтік емес (бірақ, Befunge 93 шексіз стек сөз өлшемімен Тьюрингтік толық екені көрсетілген). Кейінгі Funge 98 спецификациясы бағдарламаның өлшем шектеулерін алып тастау арқылы толық Тьюрингтік болуды қамтамасыз етеді; Funge 98 нұсқау көрсеткішінің қозғалысы белгіленген шекте оралудың орнына, оның авторы Крис Лейдің есімімен аталған "Лей кеңістігі" деп аталатын модельді ұстанады. Бұл модельде тор орауға қатысты шекті өлшемі бар тор сияқты әрекет етеді, сонымен бірге өзін шексіз кеңейтуге мүмкіндік береді.

Этимология

Befunge сөзі онлайн-талқылаудағы теріс қателіктен туындаған, онда "before" деген сөз жазылуы тиіс болған.

Жинақтау

Белгіленгендей, Befunge тілінің жобалау мақсаты компиляциялау қиын тіл жасау болды. Бұл өзін-өзі өзгертетін кодты ( 'p' нұсқаулығы ойын алаңына жаңа нұсқауларды жаза алады) және көп өлшемді ойын алаңын (бір нұсқау төрт түрлі бағытта орындалуы мүмкін) іске асыру арқылы жасауға тырысты. Дегенмен, бұл кедергілер белгілі бір дәрежеде еңсерілді және тиісті әдістерді қолдана отырып Befunge компиляторлары жазылды. Befunge 93 стандартты дистрибутивімен бірге келетін bef2c компиляторы жиектелген кодты қолданады: әрбір нұсқау C кодының фрагментіне компиляцияланады, ал басқару Befunge интерпретаторындағыдай фрагменттер арқылы жүзеге асырылады (яғни, "бағыт" тіркелімінің мәніне байланысты). Бұл жақсы интерпретатордан айтарлықтай артықшылық бермейді. bef2c компиляторы толық емес, өйткені ол 'p' немесе жол режимін қолдамайды, бірақ оны осылай жасау мүмкін емес емес (бірақ C тілі бұл үшін тиімді болмауы мүмкін). Мысалы, etty компиляторы әрбір мүмкін тік сызықты нұсқауларды кіші бағдарлама ретінде қарастырады, ал егер 'p' нұсқаулығы осы кіші бағдарламаны өзгертсе, онда ол қайта компиляцияланады. Бұл уақытында компиляцияның нұсқасы интерпретаторға қарағанда әлдеқайда артықшылықты, өйткені көптеген нұсқауларды "бағыт" тіркеліміне қатысты аралық шешімдер қабылдамай, түпкі кодта орындауға болады.

Befunge-93 нұсқаулық тізімі

0 9 Бұл санды стекке қойыңыз. + Қосу: a және b-ді шығарып, a+b-ді түртіңіз. Кетіру: a және b-ді шығарып, b-a-ны түртіңіз. * Көбейту: a және b-ді шығарып, a*b-ді түртіңіз. / Бүтін санды бөлу: a және b-ді шығарып, b/a-ны түртіңіз, 0-ге қарай дөңгелектелген. % Модуль: a және b-ді шығарып, b/a-ның бүтін санды бөлінуінің қалдығын түртіңіз. ! Логикалық ЖОҚ: мәнді шығарып тастаңыз. Егер мәні нөл болса, 1-ді түртіңіз, әйтпесе 0-ді түртіңіз. ` Үлкен: a және b-ді шығарып, b>a болса 1-ді түртіңіз, әйтпесе 0-ді түртіңіз. > Оңға жылжуды бастаңыз < Солға жылжуды бастаңыз ^ Жоғары жылжуды бастаңыз v Төмен жылжуды бастаңыз ? Кездейсоқ бағытта жылжуды бастаңыз. Мәнді шығарып тастаңыз; мән 0 болса оңға, әйтпесе солға жылжытыңыз. Мәнді шығарып тастаңыз; мән 0 болса төменге, әйтпесе жоғары жылжытыңыз. " Строка режимін бастаңыз: келесі " символына дейін әрбір таңбаның ASCII мәнін стекке түртіңіз. : Стек үстіндегі мәнді дубликациялаңыз \ Стек үстіндегі екі мәнді ауыстырыңыз $ Стекten мәнді шығарып тастаңыз және оны пайдаланбаңыз , Стекten мәнді шығарып, оны бос орынмен бөлінген бүтін сан ретінде шығарыңыз # Көпір: келесі жасушаны өткізіп жіберіңіз p "салу" функциясын шақырыңыз (мәнді кейінірек сақтау үшін). y, x және v-ді шығарып, бағдарламадағы (x, y) жасушасының символын ASCII мәні v-қа тең символға өзгертіңіз. g "алу" функциясын шақырыңыз (сақталған деректерді алу үшін). y және x-ті шығарып, бағдарламадағы сол жасушадағы символдың ASCII мәнін түртіңіз. & Пайдаланушыдан санды сұраңыз және оны стекке түртіңіз. ~ Пайдаланушыдан таңбаны сұраңыз және оның ASCII мәнін түртіңіз. @ Бағдарламаны аяқтаңыз. (бос орын) Ешқандай операция жасамаңыз. Көптеген бір өлшемді бағдарламалау тілдері түсініктеме мәтіні мен бастапқы код арасында синтаксистік айырмашылықты қажет етеді, бірақ бұл айырмашылық Brainfuck-тың +[]<>,. жиынтығына кірмейтін кез келген символ түсініктеме болып саналады деген қарапайым ережесі сияқты тривиальды болуы мүмкін. Lisp және Python сияқты тілдер мәндері қолданылмаған жағдайларда жолдарды түсініктемелер ретінде қарастырады. Сол сияқты, Befunge-де түсініктеме синтаксисі жоқ: кодқа құжаттаманы ендіру үшін бағдарламашы бақылау ағынын "түсініктеме" аймағына бағыттайды, сондықтан бұл аймақтағы мәтін ешқашан орындалмайды.