Leet (бағдарламалау тілі) - Leet (programming language)

Leet (немесе L33t) болып табылады эзотерикалық бағдарламалау тілі еркін негізделеді Брейнфак және оның бастапқы кодының символдық тілге ұқсастығы үшін »L33t 5p34k «. L33t дизайнын Стивен МакГрил жасаған[1] және Алекс Мол мүмкіндігінше түсініксіз болуы керек. Бұл Тюринг-аяқталған және мүмкіндігі бар өзін-өзі өзгертетін код. Бағдарламалық жасақтама тілде жазылған желілік қосылыстар жасай алады, сондықтан жазу үшін қолданылуы мүмкін зиянды бағдарлама.[дәйексөз қажет ]

Тіл спецификациясы

L33t деректерінің негізгі бірлігі - қол қойылмаған байт (үлкен ендиан ), ол ASCII мәндері мен сандарын 0-255 аралығында көрсете алады.

Бастапқы код «l33t 5p34k» -де орналасқан және сөздер бос орындармен немесе кареткалардың қайтарылуымен бөлінген. Тіл 10 опкодты қолданады және бастапқы кодтағы әрбір сөз сөздегі барлық цифрларды қосу арқылы опкодқа аударылады, мысалы. l33t = 3 + 3 = 6. Кодтағы сандардан басқа ешнәрсе қолдану қажет емес.

Тіл 64K жадының блогын қолданады, ал 2 көрсеткіш - жад көрсеткіші және нұсқаулық көрсеткіші. L33t интерпретаторы сандық опкодтар тізбегін құру үшін қайнар көзіндегі барлық сөздерді токенге айналдырады және оларды жад блогына 0-байттан бастап орналастырады. Нұсқаулық нұсқағышы END деңгейіне жеткенше өсе береді. Жад көрсеткіші нұсқаулықтан кейін бірінші байттан басталады. Жады «орайды»: жадыны және нұсқаулық көрсеткішін 64K-тан арттырып, оны 0 байтқа дейін айналдыруға мәжбүр етеді және керісінше.

Сондай-ақ, жад көрсеткіштерін жад аймағына нұсқаулармен ауыстыруға болады, сондықтан кодты өздігінен өзгертуге болады жұмыс уақыты. Дәл сол сияқты, нұсқаулық нұсқағышы жоғарылауды немесе секіруді END аяқталғанға дейін жалғастырады, сондықтан кодты жұмыс уақытында жасауға және кейіннен орындауға болады.

Опкодтар

МӘНOPCODEСИПАТТАМА
0ЖОҚНұсқаулық нұсқағышын ұлғайтуды қоспағанда, ешқандай әрекет жоқ.
1WRTЖад көрсеткішінің астындағы байттың ASCII мәндерін ағымдағы байланысқа жазады (CON қараңыз). Нұсқаулық көрсеткішін үлкейтеді.
2RDАғымдағы қосылымдағы таңбаны оқиды (CON қараңыз) және оны жад көрсеткішінің астындағы байтқа жазады. Нұсқаулық көрсеткішін үлкейтеді.
3ЕгерНұсқаулық нұсқағышты сәйкес EIF-тен кейінгі пәрменге қарай жылжытады, егер жад көрсеткішінің астындағы байт нөлге тең болса.
Егер жад көрсеткішінің астындағы байт нөлге тең болмаса, IF нұсқаулық көрсеткішін жай көбейтеді.
4EIFНұсқағышты IF сәйкес болғаннан кейін командаға артқа жылжытады, егер жад көрсеткішінің астындағы байт нөлге тең болмаса.
Егер жад көрсеткішінің астындағы байт нөлге тең болса, EIF тек нұсқаулық нұсқағышын көбейтеді.
5FWDЖад көрсеткішін алға (келесі сөз + 1) байт бойынша жылжытыңыз. Нұсқаулық нұсқағышына 2 қосады.
6БАҚЖад көрсеткішін артқа (келесі сөз + 1) байт бойынша жылжытыңыз. Нұсқаулық көрсеткіштен 2 қосады.
7INCЖад көрсеткішінің астындағы байттың мәні (келесі сөз + 1). Нұсқаулық нұсқағышына 2 қосады.
8ДЕКЖад көрсеткіші бойынша байттың мәнін азайту (келесі сөз + 1). Нұсқаулық нұсқағышына 2 қосады.
9КОНЖад көрсеткішінен басталатын 6 байтты оқиды (IP7-ді 127.0.0.1 форматында көрсететін алғашқы 4 байт, ал соңғы 2 байт 16-разрядты порт нөмірін жасау үшін *),
мүмкіндігінше қосылымды ашады. Егер қосылым ашылмаса, l33t қате туралы хабарды қайтарады:
«h0s7 5uXz0r5! c4N'7 c0Nn3 <7 l0l0l0l0l l4m3R !!!».

ағымдағы қосылымды соңғы сәттіге қалпына келтіріңіз (егер бұрын сәтті байланыстар болмаса, stdin / stdout).
Егер барлық 6 байт 0-ді оқыса, l33t жергілікті машинаның stdin және stdout мәндеріне оралады (бұл l33t бағдарламасын бастағанда әдепкі параметр). Нұсқаулық көрсеткішін үлкейтеді.
Байланыс сәтті болды ма, жоқ па, қарамастан, жад көрсеткіші сол жерде қалады. Тек FWD және BAK жад көрсеткішін жылжытады.

  • Порт нөмірін келесі жолдар бойынша есептеуге болады: portNumber = (байт5 << 8) + байт
10СОҢЫБарлық ашық қосылымдарды жауып, бағдарламаны аяқтайды. 10 мәні FWD, BAK, INC немесе DEC опкодтары үшін деректер ретінде қолданылса, бағдарлама аяқталмайды.

Қателер

F00l! teh c0d3 1s b1g3R th4n teh m3m0ry !! 1!

Сіз жадқа сыймайтын тым үлкен бағдарламаны жүктеп көрдіңіз. Есіңізде болсын, компиляция кезінде бір байт жад буфері үшін сақталады, сондықтан бағдарламаның өлшемі жадының минус бір байттан кіші болуы керек.

Byt3 s1z3 l34st 11, n00b болуы керек!

Bayt_size аргументі new () 11-ден аз болды. Аудармашының байт өлшемі 11-ден кем болмауы керек (опкодтар үшін).

L0L !! 1! 1 !! n0 l33t pr0gr4m l04d3d, sUxX0r!

кез келген бағдарлама жүктелместен бұрын шақырылған ().

Аудармашылар

Python

Авторы Алекс Мол. Аудармашы мәтіндік файлдардан дерек көзін оқи алады, сондықтан оны командалық жолдан l33t.py қалтасына кіріп, бағдарламаны іске қосуға болады: l33t.py <файл аты> .l33t
Қазіргі уақытта ол CON опкодын қолдамайды, бірақ әйтпесе жақсы жұмыс істейді. Қазіргі уақытта, ең болмағанда, Python нұсқасы «түпкілікті» аудармашыны енгізу деп саналуы керек, (әрине, CON-ға қолдаудың болмауы), егер сіз аудармашы жазғыңыз келсе, ол аудармашы сияқты әрекет етуі керек Мүмкін болса, Python біреуі.

Рубин

Авторы: Эрик Редмонд. Мұнда CON жүзеге асырылады.

JavaScript

Фил МакКартидің айтуынша, ол Python-ға негізделген, бірақ интерактивті, бұл жағымды. Оның Tory бағдарламалау тілінің аудармашысын қараңыз, ол өте ақымақ және l33t-ға қатты ұқсайды; o)

C

C-ге аудармашылар Куйсма Салонен (Linux-те қолдану үшін) және Alecs King жазған.

Перл 6

Гааль Яхас. Бұл аудармашы түзеткішпен бірге келетін бірінші болуымен ерекшеленеді.

Әдебиеттер тізімі

Сыртқы сілтемелер