ett esoteriskt programmeringsspråk är ett programmeringsspråk utformat för att utmana normerna för språkdesign. Det är ett språk som är utformat för att göra en poäng. Poängen kan vara vad som helst: utmaningen i sig att skapa något ovanligt, göra ett utarbetat skämt, skapa ett språk som ett konstnärligt uttryck, testa lovande ideer för programmering etc.
detta bör klargöra att det inte finns ett enkelt sätt att korrekt kategorisera eller organisera alla olika esoteriska programmeringsspråk, eftersom de per definition trotsar reglerna. Men vi kan använda vissa begrepp och organisera principer för att få en bättre känsla av samhället runt dem. Så att vi kunde förstå vad folket använder dem för, eller att använda denna information som en inspiration för att skapa ditt eget esoteriska språk.
ladda ner guiden med 68 resurser för att skapa programmeringsspråk
ta emot guiden till din inkorg för att läsa den på alla dina enheter när du har tid
några användbara begrepp
Turing Tarpit
en Turing tarpit är ett programmeringsspråk som är Turing-komplett, men praktiskt taget oanvändbart. Ett Turing-komplett språk kan simulera vilken Turing-maskin som helst. I praktiken kan du skriva något program med det. Så i teorin är alla sådana språk lika kraftfulla, men de som också är en Turing Tarpit gör oerhört svårt att skriva någon form av program. Ett vanligt sätt att göra det är att minska antalet tillgängliga symboler: försök skriva till och med ett Hello World-program med bara 8 tecken.
Quine
en quine är ett program som producerar en kopia av källkoden som utdata. Programmet kan inte vara det tomma programmet, även om det tomma programmet är ett giltigt program på det specifika språket. Att läsa källkoden från disk eller minne anses också vara fusk. Namnet” quine ” myntades av Douglas Hofstadter, i sin bok g Babbidel, Escher, Bach: en evig gyllene fläta, till ära av filosofen Willard Van Orman Quine. Så begreppet quine är inte unikt för esoteriska programmeringsspråk, men är ändå en typisk första utmaning att övervinna när man skriver en.
Kodgolf
en kodgolf är en typ av tävling där målet är att skriva det kortaste möjliga programmet som implementerar en viss algoritm. I detta sammanhang betyder Kortaste att ha den kortaste källkoden. Det betyder inte att ha den mindre storleken på den binära körbara koden. Spela kod golf kallas ”golf scripting”. Det finns också alla andra typer av tävlingar relaterade till programmering, som, med tanke på publiken, ofta uppmuntrar kreativt fusk. Generellt sett är en utmaning en motiverande faktor för många esoteriska programmeringsspråk.
Obfuscation
begreppet obfuscation, det vill säga att dölja den verkliga betydelsen av ett meddelande, är uppenbarligen inte exklusivt för esoteriska programmeringsspråk eller till och med programmering i allmänhet. Men det har stor relevans i många esoteriska programmeringsspråk. Särskilt om du tänker det i större allmän mening att vilseleda eller förvirra mottagaren. Du döljer inte meddelandet eftersom själva meddelandet är viktigt, utan för att den dolda formen i sig är målet. Ett typiskt sätt att uppnå detta är att minimera antalet symboler på språket, men du kan också kamouflera ett programmeringsspråk i det som ser ut som vanlig text eller en bild.
icke-Determinism
i denna större betydelse av vilseledande eller förvirrande publiken kan icke-determinism också användas för att uppnå samma mål. Ett icke-deterministiskt språk är ett för vilket, med tanke på programmets nuvarande tillstånd, nästa tillstånd inte alltid kan förutsägas. Konceptet har viss användning i normala programmeringsspråk, huvudsakligen på grund av oförutsägbara förhållanden vid körning. Men det tas till det yttersta av vissa esoteriska programmeringsspråk, genom att randomisera variabler eller till och med randomisera instruktionerna själva.
grupper av esoteriska programmeringsspråk
som vi redan har sagt kan vi inte tillhandahålla ett uttömmande sätt att organisera alla esoteriska programmeringsspråk. Och även om någon kunde hitta det, snart skulle någon annan uppfinna ett nytt esoteriskt programmeringsspråk bara för att göra det ogiltigt. Så vad vi försöker göra är helt enkelt att erbjuda vissa grupper eller kategorier för att bättre förstå och utforska världen av esoteriska programmeringsspråk.
- språk med ett objektivt värde, även om detta värde inte nödvändigtvis är ett yttre eller typiskt. Ett grundläggande exempel är ett språk som är utformat för att vinna en kodgolfkonkurrens: dess värde kan mätas, men det har ingen betydelse utanför gemenskapen av esoteriska programmeringsspråk. Men den mer användbara typen är de som är utformade för att uppnå ett ovanligt mål, till exempel att kringgå säkerhetsåtgärder (se JSFuck) eller att definiera typ 0-språk i Chomsky-hierarkin (se Thue).
- oanvändbara språk. Det här är språk som är mycket utmanande att använda. Detta kan vara ett uttryckligt mål för designern eller helt enkelt en olycka med själva designen. En användare kan till och med ha kul att använda dem under en tid. Ett typiskt sätt att uppnå ett oanvändbart språk, både genom design och av misstag, är med minimalism (se Brainfuck). Men om du vill ha något nästan omöjligt att använda behöver du något som ett språk som använder ett ternärt system och målmedvetet förändrar sig själv, bland annat (se Malbolge).
- språk för att testa en IDE eller bevisa något. Det här är språk som kanske inte är direkt användbara, men de är bra testplats för ett nytt koncept eller för att bevisa något. Till exempel ett språk där program är ordnade i ett tvådimensionellt rutnät (se Befunge) eller ett nästan rent funktionellt språk (se Unlambda)
- konstnärliga språk. Det här är språk som är utformade med tanken på att ha något konstnärligt värde. Du kan hävda att de effektivt ingår i gruppen av testspråken eller de med ett objektivt värde. Vi lägger dem i en annan kategori, eftersom de inte ser ut som programmering, men de tenderar att se intressanta ut, även om du kanske inte vill använda dem. Till exempel ser de ut som abstrakt konst (se Piet) eller som en Shakesperean pjäs (se Shakespeare).
- skämt språk. Det här är språk som uppfunnits med människor med en konstig humor. Som en person som säger: ”Vill du höra ett skämt? – då läser det krig och fred innan vi avslutar-hela vårt liv är ett skämt!”. Ett exempel är ett satiriskt språk, där även referensmanualen är ett skämt (se INTERCAL)
några anmärkningsvärda esoteriska språk
naturligtvis är detta inte en uttömmande lista över anmärkningsvärda esoteriska programmeringsspråk, men mer blygsamt en lista över några anmärkningsvärda för deras framgång eller särdrag.
Befunge
den huvudsakliga esoteriska egenskapen hos Befunge är att programmen är ordnade i ett tvådimensionellt rutnät. Det är också en stack baserad och en reflekterande språk, så det gör att ett program för att ändra sig. Huvudsyftet var att utforma ett språk för vilket det var så svårt som möjligt att skapa en kompilator.
den ursprungliga versionen, nu kallad Befunge-93, det är inte Turing komplett, eftersom det sätter en gräns på 80 25 25 till rutnätet storlek. Men en ny version, kallad Befunge-98, tar bort denna gräns och det borde vara Turing komplett. Befunge har skapat en hel klass av flerdimensionella språk, kallad Fungeoid.
Befunge har kommandon som styr riktningen upp, ner, vänster, höger och därmed också kan skapa en cykel, tillsammans med mer traditionella kommandon för utdata, binära operationer, etc.
ett Hello Word-program ser ut så här.
> vv ,,,,,"Hello"<>48*, vv,,,,,,"World!"<>25*,@
Brainfuck
förmodligen den mest kända av alla esoteriska programmeringsspråk, det är anmärkningsvärt för hans extrema minimalism. Både i antalet tillgängliga kommandon och även i att ha en mycket liten kompilator. Faktum är att det andra villkoret är orsaken till det första, eftersom författaren ville skapa ett språk med minsta möjliga kompilator. Författaren skapade en kompilator som bara använde 240 byte. Ibland senare skapade någon annan en med bara 100 byte. En naturlig följd av detta mål är att språket är svårt att använda, även om det är Turing komplett. Kort sagt, det är en Turing tarpit.
det kallas ibland med en censurerad stavning, till exempel Brainf*ck eller många andra variationer.
språket består av åtta olika kommandon som manipulerar en datapekare och två ström av byte för inmatning och utmatning. Den stöder också slingor. Andra tecken, förutom de som representerar kommandona, betraktas som kommentarer och ignoreras av kompilatorn.
Detta är ett exempel på hur språket fungerar (hämtat från Esolangs wiki).
Code: Pseudo code:>> Move the pointer to cell2 Set cell2 to 0 << Move the pointer back to cell0 End while
ett Hello World-program ser ut så här.
++++++++>+>+>->>+<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
om du vill veta mer kan du se på motsvarande Wikipedia-sida eller Esolangs-sida.
INTERCAL
INTERCAL kan inte ha varit det första esoteriska programmeringsspråket, men det är verkligen det första kända. Hur gammal är den? Det skapades 1972 och den första implementeringen gjordes med stansade kort. Språket var tänkt som en parodi, men också att göra något helt nytt, en främling till programmeringsvärlden. Namnet är inte en akronym, enligt författarna:
det fullständiga namnet på kompilatorn är ”Kompilatorspråk utan uttalbar akronym”, vilket av uppenbara skäl förkortas ” INTERCAL.”
resten av INTERCAL Reference Manual (PS-format) är också full av nonsensiska eller humoristiska uttalanden. Detta är både för språket de beskriver och för hur de gör det. Till exempel är detta ett avsnitt om variabler
INTERCAL tillåter endast 2 olika typer av variabler, 16-bitars heltal och 32-bitars heltal. Dessa
representeras av en plats (. ) eller två-spot (:), följt av valfritt antal mellan 1 och 65535,
inklusive. Dessa variabler kan innehålla endast icke-negativa tal; således har de respektive områdena
värden: 0 till 65535 och 0 till 4294967295. Observera: .123 och: 123 är två olika variabler. Å andra sidan
.1 och .0001 är identiska. Dessutom kan den senare inte skrivas som 1E – 3 .
språket tillåter också användning av en modifierare PLEASE
. Men det kräver också användning av rätt mängd av detta sökord. Det kan inte användas för lite eller för mycket, det vill säga att du måste visa rätt mängd artighet. Den riktigt unfunny delen är att det var en odokumenterad funktion i originalhandboken. En skämtmanual för en skämtmanual kan vara okej, men en som den är ofullständig är oacceptabel.
Detta är en Hello World i en version av INTERCAL implementerad med C: C-INTERCAL.
DO ,1 <- #13PLEASE DO ,1 SUB #1 <- #238DO ,1 SUB #2 <- #108DO ,1 SUB #3 <- #112DO ,1 SUB #4 <- #0DO ,1 SUB #5 <- #64DO ,1 SUB #6 <- #194DO ,1 SUB #7 <- #48PLEASE DO ,1 SUB #8 <- #22DO ,1 SUB #9 <- #248DO ,1 SUB #10 <- #168DO ,1 SUB #11 <- #24DO ,1 SUB #12 <- #16DO ,1 SUB #13 <- #162PLEASE READ OUT ,1PLEASE GIVE UP
kort sagt, INTERCAL är ett mycket utarbetat skämt. Den typ av skämt som kan leda dig att beundra sin skapare för sin uthållighet eller att tvivla på dess förnuft, eller kanske båda.
JSFuck
brainfucks framgång stimuleras skapandet av många derivatspråk, för många för att nämna dem alla. Men den mest anmärkningsvärda är JSFuck.
JSFuck är inte ett korrekt språk, men det är mer av en esoterisk programmeringsstil för Javascript som kräver att endast 6 tecken används. De resulterande programmen är giltiga JavaScript-program och i själva verket uppfanns för att kringgå säkerhetstekniker som malware upptäckt. Dess egenskaper gjorde det också användbart för kodfördunkling.
det fungerar eftersom du kan utvärdera alla uttryck i Javascript som vilken typ som helst. Så representerar och tom array, men genom att förbereda den med en
+
kan du tvinga den att utvärdera som nummer 0. För att få ett brev som a
kan du manipulera värdet false
, etc. Slutresultatet är ett extremt verbalt språk: motsvarande alert("Hello World!")
är 22948 tecken långt.
Malbolge
Malbolge är ett språk som är särskilt utformat för att vara nästan omöjligt att använda:
via en kontraintuitiv ’galen operation’, bas-tre aritmetiska och självförändrande kod
i ord av sin egen skapare.
faktum är att författaren aldrig skrev ett arbetsprogram med det. Det första programmet genererades av ett annat program som implementerade en heuristisk sökalgoritm. Språket är inte Turing komplett och det är också baserat på en felstavning av Malebolge, helvetets åtta cirkel i Dante Alighieris Inferno. Så det har verkligen ingen återlösande kvalitet.
jag kommer inte att försöka beskriva det eftersom det hela är uttryckligen en övning i frustration. Men det finns en anmärkningsvärd” galen operation ” som är värt att nämna: kryptering. Språket ska fungera på en ternär virtuell maskin och har tre register, varav en innehåller en pekare till den aktuella instruktionen och heter . Efter instruktionen körs modulo 94 av värdet i
ersätter vad som är i
då resultatet krypteras enligt en krypteringstabell. Välkommen till helvetet, faktiskt.
någon modig själ har skapat ett Hello World-program.
(=<`#9]~6ZY32Vx/4Rs+0No-&Jk)"Fh}|Bcy?`=*z]Kw%oG4UUS0/@-ejc(:'8dc
Piet
Piet är ett språk där program representeras som abstrakta konstmålningar, i stil med Piet Mondrian. Det är stack baserat och Turing komplett.
det finns 18 färger beställda enligt nyans och ljusstyrka, plus svartvitt. Dessa två sista har speciell betydelse och används för kontrollflöde. Programkörningen bygger på två ”pekare”: en Riktningspekare och en Färgblockväljare. DP kan peka upp, ner, vänster och höger, medan CC bara kan peka åt vänster och höger. Kombinationen av dessa två pekare styr utförandet av programmet: i princip vilket Färgblock som körs nästa. Storleken på ett färgblock representerar ett heltal. När programövergången mellan olika färgblock bestämmer deras skillnad i nyans och ljusstyrka vilken typ av kommando som körs. Kommandona är de vanliga, som att mata ut ett värde, multiplicera etc.
Hello World-programmet har en viss skönhet.
Shakespeare
Shakespeare är ett språk som är utformat för att ha: ”vacker källkod som liknade Shakespeare-pjäser”. Språket har få kommandon och det liknar funktionellt monteringsspråk, men det är inte överraskande ganska verbose.
variablerna måste deklareras i ett första avsnitt och deras namn måste vara giltiga Shakespeare-tecken, som Romeo eller Juliet. Dessa variabler är staplar som senare kommer att utföras operationer som pop, push och input/output. Namnet på handlingar och scener fungerar som goto-etiketter och destinationen för vissa villkorliga uttalanden. Tecken, det vill säga variabler, måste kallas på scenen för att manipuleras och det kan bara finnas två åt gången på scenen.
linjerna representerar vanligtvis numeriska konstanter: vissa substantiv och adjektiv konverteras i numeriska värden.
Hamlet: You lying stupid fatherless big smelly half-witted coward!Juliet: You are as villainous as the square root of Romeo!
speciella ord, som ”kom ihåg”, eller kombinationer därav, som ”tala ditt sinne”, utför kommandon. Dessa är normala kommandon som att trycka på värden på stack-tecknet, mata ut värdet på den aktuella variabeln eller motsvarande ASCII-tecken.
ett villkorat uttalande representeras av en fråga från ett tecken och ett svar från det andra tecknet som bestämmer vart man ska gå, om villkoret för frågan utvärderar till Sant.
Juliet: Am I better than you?Hamlet: If so, let us proceed to scene III.
Hello World är lika lång och produktiv som en Shakespeare-pjäs.
The Infamous Hello World Program.Romeo, a young man with a remarkable patience.Juliet, a likewise young woman of remarkable grace.Ophelia, a remarkable woman much in dispute with Hamlet.Hamlet, the flatterer of Andersen Insulting A/S. Act I: Hamlet's insults and flattery. Scene I: The insulting of Romeo.Hamlet: You lying stupid fatherless big smelly half-witted coward! You are as stupid as the difference between a handsome rich brave hero and thyself! Speak your mind! You are as brave as the sum of your fat little stuffed misused dusty old rotten codpiece and a beautiful fair warm peaceful sunny summer's day. You are as healthy as the difference between the sum of the sweetest reddest rose and my father and yourself! Speak your mind! You are as cowardly as the sum of yourself and the difference between a big mighty proud kingdom and a horse. Speak your mind. Speak your mind! Scene II: The praising of Juliet.Hamlet: Thou art as sweet as the sum of the sum of Romeo and his horse and his black cat! Speak thy mind! Scene III: The praising of Ophelia.Hamlet: Thou art as lovely as the product of a large rural town and my amazing bottomless embroidered purse. Speak thy mind! Thou art as loving as the product of the bluest clearest sweetest sky and the sum of a squirrel and a white horse. Thou art as beautiful as the difference between Juliet and thyself. Speak thy mind! Act II: Behind Hamlet's back. Scene I: Romeo and Juliet's conversation.Romeo: Speak your mind. You are as worried as the sum of yourself and the difference between my small smooth hamster and my nose. Speak your mind!Juliet: Speak YOUR mind! You are as bad as Hamlet! You are as small as the difference between the square of the difference between my little pony and your big hairy hound and the cube of your sorry little codpiece. Speak your mind! Scene II: Juliet and Ophelia's conversation.Juliet: Thou art as good as the quotient between Romeo and the sum of a small furry animal and a leech. Speak your mind!Ophelia: Thou art as disgusting as the quotient between Romeo and twice the difference between a mistletoe and an oozing infected blister! Speak your mind!
Thue
Thue är ett programmeringsspråk baserat på ett strängomskrivningssystem, kallat semi-Thue-system. Det är icke-deterministiskt och följer begränsningsprogrammeringsparadigmet. Vilket innebär att variablerna definieras i termer av begränsning (ex. något är sant eller falskt). Det är en Turing tarpit.
när det gäller Thue representeras kostnaderna av en lista över substitutionsregler i formuläret:
<string>::=<replacement>
särskilda format i denna blankett representerar inmatning, utmatning eller slutet på listan över regler.
språkets icke-deterministiska karaktär kan visas genom att indikera två möjliga ersättningar för samma sträng. Exempelvis:
- du skriver en regel som säger att strängen
a
kan ersättas medstupid
- du skriver också en regel som säger att strängen
a
kan ersättas medyou are
när ETT program körs kan strängen a
ersättas med något av de två alternativen.
listan med regler följs av en sträng som representerar initialtillståndet.
medan du skriver ett användbart program kan det vara svårt, den typiska Hello World är ganska lätt och förståelig, åtminstone enligt standarden på esoteriska programmeringsspråk.
a::=~Hello World!::=a
Unlambda
Unlambda är ett (nästan) rent funktionellt språk som är utformat för att visa ett rent funktionellt språk (och förmodligen hur opraktiskt det skulle vara). Det är baserat på kombinatorisk logik. Det är Turing complete och den första funktionella Turing tarpit. Det bygger på några funktioner, en apply-operatör `
(backquote-tecknet) och det stöder också input/output. Tekniskt fungerar det bara på funktioner med ett enda argument, men flerargumentfunktioner kan översättas till en sekvens av funktioner.
ett Hello World-program ser nästan läsbart ut.
`r```````````.H.e.l.l.o. .w.o.r.l.di
andra intressanta esoteriska språk
Fugue är ett språk som använder MIDI-filer som källkod. Intervallen mellan varje anteckning översätts till specifika traditionella kommandon, till exempel input/output eller addition.
Beatnik är ett stackbaserat språk som består av en serie engelska ord; blanktecken och skiljetecken ignoreras. Orden konverteras i traditionella kommandon enligt deras värde i spelet Scrabble.
blanktecken är ett skämtspråk där endast blanktecken, till exempel flikar och mellanslag, är giltiga och alla andra tecken ignoreras. Detta är naturligtvis det omvända av det vanliga beteendet hos kompilatorer som ignorerar blanksteg. Med tanke på dessa egenskaper kan den användas i ett Polyglot-program, det vill säga ett program som är giltigt för mer än ett språk. Så länge det andra språket inte är Python, eller något språk där blanksteg är viktigt.
GolfScript är ett konkatenativt programmeringsspråk som är utformat för att vinna kodgolftävlingar, det är också Turing komplett.
Snowflake är ett reversibelt självmodifierande språk där både tolken och programmet ändras vid varje körning.
FRACTRAN är ett språk där program är en lista över fraktioner och ett initialt tal. Jag är inte säker på vad det gör, men det gör något, eftersom det har en Wikipedia-sida.
Iota och Jot är två formella språk, var och en utformad för att vara det enklaste formella systemet. Av sin natur kan de också betraktas som lika minimalistiska, Turing tarpit, programmeringsspråk. Båda använder bara två symboler och utför två operationer. En efterträdare, kallad Zot, stöder också input / output.
entropi är ett mycket lämpligt namngivet programmeringsspråk som är utformat för att acceptera tanken på att ge upp kontrollen. Alla utdata från programmet kommer att approximeras och varje gång data nås ändras det slumpmässigt. Språket ändrar inte det ursprungliga programmet, så varje gång körs utmatningen kommer att vara annorlunda, men det ursprungliga tillståndet kommer att bevaras. En nyfiken bieffekt av randomiseringen av data är Drunk Eliza, en webbversion av det klassiska Eliza-programmet där terapeuten verkar vara full.
Monicelli är ett skämtspråk baserat på komedifilmen mina vänner. Ett typiskt program ser ut som en serie nonsensiska italienska fraser. Överraskande är det meningsfullt eftersom filmen som används som inspiration också innehåller nonsensiska fraser. Det är galenskapens cirkel.
sammanfattning
världen av esoteriskt programmeringsspråk är lika spännande som det är galet: det finns inga regler, men många intressanta saker. Jag hoppas att ha gett dig en något sane fönster på vad du kan förvänta dig.
om du vill veta mer eller delta i denna gemenskap föreslår jag att du tittar på Esolangs. Den webbplatsen, tillsammans med Wikipedia, är källan till de flesta exempel som visas i den här artikeln. Där kan du också hitta lite inspiration i en lista över ideer för ett esoteriskt programmeringsspråk.
du kan också hitta intressant bloggen till Marc C. Chu-Carroll i dess många inkarnationer under åren. Som namnet bra matematik, Dålig matematik antyder, är det främst tillägnad matematik. Ändå har det också många analyser av esoteriska programmeringsspråk i en serie som kallas patologisk programmering (språk). Du kan till exempel se en dedikerad till det minsta programmeringsspråket.