Leet (programmeringsspråk)

Leet (eller L33t ) är ett esoteriskt programmeringsspråk baserat löst på Brainfuck och uppkallat efter likheten mellan dess källkod och det symboliska språket " L33t 5p34k ". L33t designades av Stephen McGreal och Alex Mole för att vara så förvirrande som möjligt. Den är Turing-komplett och har möjlighet att självmodifiera kod . Programvara som är skriven på språket kan skapa nätverksanslutningar och kan därför användas för att skriva skadlig programvara . [ citat behövs ]

Språkspecifikation

Den grundläggande dataenheten för L33t är den osignerade byten ( big-endian ), som kan representera ASCII-värden och tal i intervallet 0-255.

Källkoden är i "l33t 5p34k" och ord separeras med mellanslag eller vagnretur. Språket använder 10 opkoder och varje ord i källkoden översätts till en opcode genom att alla siffror i ordet adderas, t.ex. l33t = 3 + 3 = 6. Det är inte nödvändigt att använda annat än siffror i koden.

Språket använder ett 64K minnesblock och 2 pekare - en minnespekare och en instruktionspekare. L33t-tolkaren tokeniserar alla ord i källan för att skapa en sekvens av numeriska opkoder, och placerar dem i ordning i minnesblocket, med början vid byte 0. Instruktionspekaren fortsätter att öka tills den stöter på ett SLUT. Minnespekaren startar vid den första byten efter instruktionerna. Minne "omsluter": ökning av minnet och instruktionspekaren förbi 64K kommer att få det att springa runt till byte 0, och vice versa.

Minnespekare kan också flyttas till det område av minnet som upptas av instruktionerna, så koden kan modifieras själv under körning . På liknande sätt kommer instruktionspekaren att fortsätta att öka eller hoppa tills den stöter på ett END, så kod kan genereras vid körning och därefter exekveras.

Opkoder

VÄRDE OPCODE BESKRIVNING
0 NEJ Ingen operation, förutom att öka instruktionspekaren.
1 WRT Skriver ASCII-värdena för byten under minnespekaren till den aktuella anslutningen (se CON). Ökar instruktionspekaren.
2 RD Läser ett tecken från den aktuella anslutningen (se CON) och skriver det till den byte som för närvarande är under minnespekaren. Ökar instruktionspekaren.
3 OM
Flyttar instruktionspekaren framåt till kommandot efter den matchande EIF, om byten under minnespekaren är lika med noll. Om byten under minnespekaren inte är lika med noll, ökar IF helt enkelt instruktionspekaren.
4 EIF
Flyttar instruktionspekaren bakåt till kommandot efter matchande IF, om byten under minnespekaren inte är lika med noll. Om byten under minnespekaren är lika med noll, ökar EIF helt enkelt instruktionspekaren.
5 FWD Flytta minnespekaren framåt med (nästa ord+1) byte. Lägger till 2 till instruktionspekaren.
6 BAK Flytta minnespekaren bakåt med (nästa ord+1) byte. Subtraherar 2 från instruktionspekaren.
7 INC Öka värdet på byten under minnespekaren med (nästa ord+1). Lägger till 2 till instruktionspekaren.
8 DEC Minska värdet på byten under minnespekaren med (nästa ord+1). Lägger till 2 till instruktionspekaren.
9 LURA
Läser de 6 byten som börjar med minnespekaren (de första 4 byten som anger en IP i formatet 127.0.0.1 och de sista 2 byten som kombineras för att skapa ett 16-bitars portnummer * ), och öppnar en anslutning om möjligt . Om en anslutning inte kan öppnas kommer l33t att returnera felmeddelandet:
 "h0s7 5uXz0r5! c4N'7 c0Nn3<7 l0l0l0l0l l4m3R !!!". 



och återställ den aktuella anslutningen till den senaste lyckade (stdin/stdout om det inte fanns några tidigare framgångsrika anslutningar). Om alla 6 byte läser 0, återgår l33t till den lokala maskinens stdin och stdout (detta är standardinställningen när ett l33t-program startas). Ökar instruktionspekaren. Oavsett om anslutningen lyckades eller inte, kommer minnespekaren att vara kvar på samma plats som den var. Endast FWD och BAK flyttar minnespekaren.

  • Portnumret kan beräknas med något i stil med: portNumber = (byte5 << 8) + byte
10 SLUTET Stänger alla öppna anslutningar och avslutar programmet. Värdet 10 kommer inte att avsluta programmet om det används som data för opkoderna FWD, BAK, INC eller DEC.

Buggar

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

Du försökte ladda ett program som är för stort för att få plats i minnet. Observera att vid kompilering är en byte reserverad för minnesbufferten, så programmets storlek måste vara mindre än minnesstorleken minus en byte.

Byt3 s1z3 måste vara på l34st 11, n00b!

Argumentet byte_size för new() var mindre än 11. Bytestorleken för en tolk måste vara minst 11 (för att ta emot opkoderna).

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

run() anropades innan något program laddades.

Tolkar

Pytonorm

Skrivet av Alex Mole. Stöder inte CON opcode, men anses annars vara den "definitiva" tolken. [ citat behövs ]

Rubin

Skrivet av Eric Redmond. Den här innehåller en implementering av CON.

JavaScript

Av Phil McCarthy, den är baserad på Python men är lite mer interaktiv, vilket är trevligt. Se även hans tolk för The Tory Programming Language, som är djupt fånig och har en slående likhet med l33t ;o)

C

Tolkar för C har skrivits av Kuisma Salonen (för användning i Linux) och av Alecs King.

Perl 6

Av Gaal Yahas. Denna tolk är känd för att vara den första som kommer med en debugger.

externa länkar