Janus (уақыт бойынша қалпына келтірілетін есептеу бағдарламалау тілі) - Janus (time-reversible computing programming language)

Янус
Парадигмаимперативті (процессуалдық ), қайтымды
ЖобалағанКристофер Люц, Ховард Дерби, Тетсуо Йокояма және Роберт Глюк
Бірінші пайда болды1982, 2007
Веб-сайтhttp://tetsuo.jp/ref/janus.html
Майор іске асыру
http://topps.diku.dk/pirc/janus-playground/

Янус Бұл уақыт қалпына келеді бойынша жазылған бағдарламалау тілі Калтех 1982 ж.[1] The жедел семантика а-мен бірге ресми түрде көрсетілген бағдарламалық инвертор және аударылатын өзін-өзі аудармашы, 2007 жылы Тетсуо Йокояма және Роберт Глюк.[2] Janus түрлендіргіші мен аудармашысы қол жетімді TOPPS зерттеу тобы кезінде ДИКУ.[3] Басқа Janus аудармашысы жүзеге асырылды Пролог 2009 жылы.[4] Төменде 2007 жылғы жұмыста ұсынылған тілдің қысқаша мазмұны келтірілген.

Janus - бұл дүниежүзілік дүкені бар міндетті бағдарламалау тілі (стек немесе үйінді бөлу жоқ). Janus - бұл қайтымды бағдарламалау тілі, яғни ол жергілікті инверсия арқылы детерминирленген алға және артқа есептеуді қолдайды.

Синтаксис

Біз Янустың синтаксисін қолданамыз Backus – Наур формасы.

Janus бағдарламасы - бұл бір немесе бірнеше айнымалы декларациялар тізбегі, содан кейін бір немесе бірнеше процедуралық декларациялар тізбегі:

<бағдарлама> ::= <v-декл> <v-деклар> <p-decl> <p-decls><v-деклар> ::= <v-декл> <v-деклар> | ""<p-decls> ::= <p-decl> <p-decls> | ""

Ескерту, Янус 2007 жылғы жұмыста көрсетілгендей,[2] нөлдік немесе одан да көп айнымалыларға мүмкіндік береді, бірақ бос дүкеннен басталатын бағдарлама бос дүкен шығарады. Ештеңе жасамайтын бағдарлама тривиальды түрде өзгертілетін және іс жүзінде қызықты емес.

Айнымалы декларация не айнымалы, не бір өлшемді жиымды анықтайды:

<v-декл> ::= <v> | <v> "[" <c> "]"

Ескерту, айнымалы декларацияларда типтік ақпарат жоқ. Себебі Янустағы барлық мәндер (және барлық тұрақтылар) теріс емес 32 биттік бүтін сандар болып табылады, сондықтан барлық мәндер 0 мен 2 аралығында болады32 - 1 = 4294967295. Алайда, Janus аудармашысының орналасқанын ескеріңіз TOPPS тұрақты қолданады екеуінің толықтауышы 32 биттік бүтін сандар, сондықтан барлық мәндер −2 аралығында болады31 = −2147483648 және 231 - 1 = 2147483647. Барлық айнымалылар 0 мәніне инициалданады.

Массивтердің өлшемдеріне теориялық шекаралар қойылмайды, бірақ айтылған аудармашы кем дегенде 1 өлшемін талап етеді.[3]

Процедура декларациясы кілт сөзден тұрады рәсім, содан кейін бірегей процедура идентификаторы және мәлімдеме:

<p-decl> ::= «рәсім» <идентификатор> <с>

Janus бағдарламасының кіру нүктесі аталған процедура болып табылады негізгі. Егер мұндай процедура болмаса, бағдарлама мәтініндегі соңғы процедура - бұл енгізу нүктесі.

Мәлімдеме - бұл тағайындау, своп, if-then, цикл, процедураны шақыру, процедураны қайтарып алу, өткізіп жіберу немесе операторлар тізбегі:

<с> := <х> <мод-оп> "=" <e> | <х> "[" <e> "]" <мод-оп> "=" <e>     | <х> "<=>" <х>     | «егер» <e> «онда» <с> «басқа» <с> «fi» <e>     | «бастап» <e> «істеу» <с> «цикл» <с> «дейін» <e>     | «қоңырау шалу» <идентификатор> | «шақыру» <идентификатор>     | «өткізіп жіберу» | <с> <с>

Тапсырмалар қайтымды болуы үшін сол жақтағы айнымалының тапсырманың екі жағындағы өрнектерде болмауы талап етіледі. (Ескерту, массив ұяшықтарын тағайындаудың екі жағында да өрнек бар.)

Своп (<x> "<=>" <x>) тривиальды қайтымды.

Шартты шарттардың қайтымды болуы үшін біз а тест ( <e> кейін «егер») және ан бекіту ( <e> кейін «fi»). Семантикасы - бұл тест керек содан кейін тармақ орындалғанға дейін бекітіңіз және бекіту керек оны ұстап тұрыңыз. Керісінше, тест болмауы керек else-филиалы орындалғанға дейін ұстап тұрыңыз және бекіту болмауы керек оны ұстап тұрыңыз. Төңкерілген бағдарламада бекіту тестке, ал тест бекітуге айналады. (Janus-тағы барлық мәндер бүтін сандар болғандықтан, 0-дің жалған екенін көрсететін әдеттегі C-семантикасы қолданылады.)

Ілмектердің қайтымды болуы үшін біз де осылай бекітеміз ( <e> кейін «бастап») және тест ( <e> кейін «дейін»). Семантикасы - бекіту керек тек кіру кезінде циклге дейін, ал тест өткізілуі керек тек шығу кезінде циклден. Төңкерілген бағдарламада бекіту тестке, ал тест бекітуге айналады. Қосымша <e> кейін «цикл» тест жалған деп бағаланғаннан кейін жұмысты орындауға мүмкіндік береді. Жұмыс кейіннен тұжырымның жалған екендігіне көз жеткізуі керек.

Процедура қоңырау алға бағытталған процедураның мәлімдемелерін орындайды. Процедура шақырылмайды процедураның мәлімдемелерін кері бағытта орындайды. Процедуралардың параметрлері жоқ, сондықтан барлық айнымалы ауысулар ғаламдық дүкендегі жанама әсерлермен жүзеге асырылады.

Өрнек дегеніміз тұрақты (бүтін), айнымалы, индекстелген айнымалы немесе екілік амалдың қосымшасы:

<e> ::= <c> | <х> | <х> "[" <e> "]" | <e> <бин-оп> <e>

Янустағы тұрақтылар (және Янус аудармашысы орналасқан TOPPS ) жоғарыда талқыланған.

Екілік оператор - бұл C-ге ұқсас семантикасы бар келесілердің бірі:

<бин-оп> ::= "+" | "-" | "^" | "*" | "/" | "%" | "&" | "|" | "&&" | "||" | ">" | "<" | "=" | "!=" | "<=" | ">="

Модификация операторлары - бұл екілік операторлардың жиынтығы, барлық v үшін, - бұл биективті функция, демек, қайда, қайда модификация операторы:

<мод-оп> ::= "+" | "-" | "^"

Кері функциялар "-", "+", және "^"сәйкесінше.

Тағайындалған айнымалының тапсырманың екі жағындағы өрнекте де пайда болмайтын шектеуі, Янустың қорытынды жүйесінің алға және артқа детерминистік екенін дәлелдеуге мүмкіндік береді.

Мысал

Біз Janus процедурасын жазамыз фиб табу n-шы Фибоначчи нөмірі, n> 2 үшін i = n, x1 = 1 және x2 = 1:

i = n фибра процедурасы x1 + = x2 x1 <=> x2 i - = 1 -ден i = 2-ге дейін

Аяқталғаннан кейін, x1 бұл (n−1) -ші Фибоначчи саны және x2 nмың Фибоначчи нөмірі. мен n-ден 2-ге ауысатын итератор айнымалысы мен әрбір итерацияда азаяды, болжам (i = n) бірінші қайталануға дейін ғана дұрыс. Сынақ (i = 2) циклдің соңғы итерациясынан кейін ғана дұрыс болады (i> 2 деп есептегенде).

Процедураның келесі алғышартын қарастырсақ, біз 4-ші Фибоначчи нөмірімен аяқтаймыз x2:

i n x1 x2процедура негізгі n + = 4 i + = n x1 + = 1 x2 + = 1 қоңырау фиб

Назар аударыңыз, егер біз оны n≤2, әсіресе теріс бүтін сандармен басқаратын болсақ, біздің жұмысымыз біраз көбірек жұмыс жасауы керек еді.

Кері фиб бұл:

i = 2 i = 2 i = 1 x1 <=> x2 x1 - = x2 циклынан i = n дейінгі фибра процедурасы

Көріп отырғаныңыздай, Янус локальды инверсияны орындайды, мұнда цикл тесті және бекіту ауыстырылады, операторлардың реті өзгертіледі және циклдегі әрбір оператордың өзі кері болады. X1 (n-1) болған кезде n бағдарламасын табу үшін кері бағдарламаны пайдалануға болады.мың және x2 - nмың Фибоначчи нөмірі.

Пайдаланылған әдебиеттер

  1. ^ Кристофер Луц. Янус: уақытты қалпына келтіретін тіл. 1986 ж. Р.Ландауэрге хат. http://tetsuo.jp/ref/janus.html.
  2. ^ а б Тетсуо Йокояма мен Роберт Глюк. 2007. Қайтымды бағдарламалау тілі және оның аударылатын аудармашысы. Жылы Бағдарламаны ішінара бағалау және семантикаға негізделген манипуляциялар бойынша ACM SIGPLAN 2007 симпозиумының материалдары (PEPM '07). ACM, Нью-Йорк, Нью-Йорк, АҚШ, 144-153. http://doi.acm.org/10.1145/1244381.1244404
  3. ^ а б http://topps.diku.dk/pirc/janus-playground/
  4. ^ http://www.complang.tuwien.ac.at/adrian/revcomp