# Programmeertaal l33t

l33t is een esoterische programmeertaal ontwikkeld door Stephen McGreal en Alex Mole. Het is vergelijkbaar met Brainfuck. De bedoeling was een taal te maken waarmee je in het internetdialect leet kan programmeren, meer amusant dan serieus. Opzettelijk is het zelfwijzigend en kun je een verbinding opzetten via sockets. In theorie kun je ermee hacken of een virus schrijven, hoewel dat in minimalistische talen een heidens karwei is.

## Overzicht

Broncode typ je in l33t sP34k, en de interpreter vertaalt elk woord (reeks tekens gescheiden door spatie of 'nieuwe regel') als volgt naar een getal: De waarde van een woord wordt bepaald door aanwezige cijfers bij elkaar op te tellen, bv. l33t = 3 + 3 = 6. Alle andere tekens laat hij buiten beschouwing. Woorden zonder cijfers of met uitsluitend nullen krijgen de waarde 0. Je kunt l33t schrijven met enkel cijfers, maar sommige interpreters straffen je genadeloos af als je je deze onbeleefde actie permitteert. Het spreekt vanzelf dat l33T niet hoofdlettergevoelig is.
De taal beslaat een blokje geheugen van 64 kB en twee registers (een voor het geheugen en een voor de opdracht). De l33t-interpreter zet alle woorden in het bronprogramma om naar een serie instructies en zet ze in volgorde vanaf byte 0 in het geheugenblok. Het opdrachtregister begint op byte 0, en voert de instructie daar uit. Elke instructie afgezien van END zorgt voor verandering van het opdrachtregister, zoals je hierna ziet. Het geheugenregister begint met het eerste byte na de instructies. Het geheugen loopt oneindig door. Wanneer het geheugenregister over 64k heen gaat begint het weer bij 0 en andersom. Het opdrachtregister gedraagt zich ook zo.
Het is toegestaan het geheugenregister naar een adres te laten verwijzen dat eerst door instructies was bezet en zo de code zelfmodificerend te maken. Het opdrachtregister loopt op of springt op en neer, totdat het een bestaande of dynamisch gecreëerde END (zie hieronder) tegenkomt. Zo niet, dan loopt het programma door, totdat de stroom uitvalt.

## Instructies

| Value | Opdracht | Omschrijving |
| 0 | NOP | Doet niets, behalve ophogen van opdrachtregister. |
| 1 | WRT | Schrijft de ASCII-waarde van het byte onder het geheugenregister naar de actuele verbinding (zie CON). Ophogen opdrachtregister. |
| 2 | RD | Leest een teken van de actuele verbinding (zie CON) en schrijft naar het byte onder het geheugenregister. Ophogen opdrachtregister. |
| 3 | IF | Verhoogt het opdrachtregister naar de instructie volgend op de overeenkomende EIF als het byte onder het geheugenregister 0 is. Wanneer dat niet 0 is, verhoogt IF alleen het opdrachtregister. |
| 4 | EIF | Verlaagt het opdrachtregister naar de instructie volgend op de overeenkomende IF als het byte onder het geheugenregister niet 0 is. Wanneer dat wel 0 is, verhoogt IF alleen het opdrachtregister. |
| 5 | FWD | Verhoogt het geheugenregister met (volgend woord+1) bytes. Verhoog opdrachtregister met 2. |
| 6 | BAK | Verlaagt het geheugenregister met (volgend woord+1) bytes. Verhoog opdrachtregister met 2. |
| 7 | INC | Verhoogt de waarde van het byte onder het geheugenregister met (volgend woord+1). Verhoog opdrachtregister met 2. |
| 8 | DEC | Verlaagt de waarde van het byte onder het geheugenregister met (volgend woord+1). Verhoog opdrachtregister met 2. |
| 9 | CON | Leest de 6 bytes vanaf het geheugenregister (de eerste 4 bytes geven een IP aan in de vorm 127.0.0.1, en de laatste 2 bytes een 16-bit poortnummer), en opent zo mogelijk een verbinding. Bij mislukken komt l33t met de melding: "h0s7 5uXz0r5! c4N'7 c0Nn3<7 l0l0l0l0l l4m3R !!!". Als alle zes bytes 0 zijn, valt l33t terug op de lokale stdin en stdout (de verstekwaarde bij het opstarten van een l33t-programma). Ophogen opdrachtregister. Wel of geen verbinding doet niet ter zake, het geheugenregister blijft waar het was. Slechts FWD en BAK brengen daar verandering in. Het poortnummer kun je bepalen in de trant van: poortnummer = (byte5 << 8) + byte6 |
| 10 | END | Sluit alle open verbindingen en beëindigt het programma. De waarde 10 laat het programma wel doorlopen wanneer het een argument is voor instructies FWD, BAK, INC of DEC. |
Let er op dat de woorden voor de instructies (NOP, WRT, enz.) niets anders zijn dan gewoon handige afspraken om de onderdelen van de l33t-pseudo-code te verduidelijken. INC in je broncode opnemen doet niets (vertaling naar 0, NOP). Als je daarentegen “pH34r” schrijft, gebeurt er wel iets (genereert 7, INC).

## Eigenaardigheden

Puntjes om op bedacht te zijn:
* Elke instructie > 10 geeft een foutmelding, maar het programma gaat verder. Het mag, maar je maakt je een beetje belachelijk als de standaard l33t-foutkreet "j00 4r3 teh 5ux0r" verschijnt... Wanneer waardes > 10 als argument voor FWD, BAK, INC of DEC voorkomen gebeurt dat niet.
* l33t interpreteert elk gebruik van 3 en 4 als haakjes, zelfs als ze als gegevens zijn bedoeld! Hoewel “pH34r m3!” naar verwachting het actuele byte met 3 verhoogt, zal een volgende EIF (als het actuele byte onder het geheugenregister niet 0 is) terugspringen naar “m3!”. Wanneer het geheugenregister niet in staat is het overeenkomstige haakje te vinden, zijn de resultaten onvoorspelbaar: je loopt de kans dat het programma stukloopt en een beledigende opmerking maakt over je onbenulligheid.
* Getallen in het geheugen hebben geen teken, zodat ze circulair zijn: 255 + 1 = 0, and 0 - 1 = 255. Interpreters dienen bij voorkeur, maar zijn dat niet verplicht, de situatie af te vangen dat woorden in de l33t-broncode het getal 255 overschrijden en navenant overlappen. Het is, afgezien van moedwil, onwaarschijnlijk dat je hier tegenaan loopt.
In het algemeen is de uitkomst niet te voorspellen.
* De grens van 64k voor het geheugen is arbitrair, maar zo gekozen in verband met overdraagbaarheid en minimalisme. l33t-interpreters kunnen een andere geheugenomvang gebruiken, maar standaard beveelt men 64k aan. In ieder geval dienen geheugen- en opdrachtregisters gegevenstypes te hebben die in staat zijn elk byte van het geheugenblok te adresseren.
Voor 64k een geheel getal groter of gelijk aan 0 (dat zijn 16 bits).

## Voorbeelden
### ASCII-tabel

Het nu volgende programma is het eerste werkende programma ooit geschreven in l33t. Het loopt voor eeuwig en brengt alle 255 ASCII-tekens in beeld, terwijl het eruitziet als een minder vleiende uitspraak over geeks: