distracția (și nebunia) limbajelor de programare ezoterice

un limbaj de programare ezoteric este un limbaj de programare conceput pentru a contesta normele designului limbajului. Este un limbaj conceput pentru a face un punct. Ideea ar putea fi orice: provocarea în sine de a crea ceva neobișnuit, de a face o glumă elaborată, de a crea un limbaj ca expresie artistică, de a testa idei promițătoare pentru programare etc.

acest lucru ar trebui să clarifice faptul că nu există o modalitate ușoară de a clasifica sau organiza în mod corespunzător toate diferitele limbaje de programare ezoterice, deoarece, prin definiție, ele sfidează regulile. Dar am putea folosi câteva concepte și principii de organizare pentru a înțelege mai bine comunitatea din jurul lor. Pentru a putea înțelege la ce le folosesc oamenii sau pentru a folosi aceste informații ca inspirație pentru a vă crea propriul limbaj ezoteric.

câteva concepte utile

Turing Tarpit

un Turing tarpit este un limbaj de programare care este Turing-complet, dar practic inutilizabil. Un limbaj Turing-complet poate simula orice mașină Turing. În termeni practici, puteți scrie orice program cu acesta. Deci, în teorie, toate aceste limbi sunt la fel de puternice, dar cele care sunt, de asemenea, o Tarpit Turing face incredibil de dificil de a scrie orice fel de program. O modalitate obișnuită de a face acest lucru este reducerea numărului de simboluri disponibile: încercați să scrieți chiar și un program Hello World cu doar 8 caractere.

Quine

un quine este un program care produce ca ieșire o copie a codului său sursă. Programul nu poate fi programul gol, chiar dacă programul gol este un program valid în limba specifică. Citirea codului sursă de pe disc sau memorie este, de asemenea, considerată înșelăciune. Numele” quine ” a fost inventat de Douglas Hofstadter, în cartea sa G Inktsidel, Escher, Bach: o împletitură eternă de aur, în onoarea filosofului Willard Van Orman Quine. Deci, conceptul de quine nu este unic pentru limbajele de programare ezoterice, dar este totuși o primă provocare tipică de depășit atunci când scrieți unul.

Cod Golf

un cod golf este un tip de competiție în care obiectivul este de a scrie cel mai scurt program posibil care implementează un anumit algoritm. În acest context, cel mai scurt înseamnă a avea cel mai scurt cod sursă. Aceasta nu înseamnă a avea dimensiunea mai mică a codului executabil binar. Codul de joc golf se numește „golf scripting”. Există, de asemenea, toate celelalte tipuri de concursuri legate de programare, care, având în vedere publicul, încurajează frecvent înșelăciunea creativă. În general, o provocare este un factor motivant pentru multe limbaje de programare ezoterice.

confuzie

conceptul de confuzie, adică ascunderea sensului real al unui mesaj, Nu este în mod evident exclusiv limbajelor de programare ezoterice sau chiar programării în general. Dar are o mare relevanță în multe limbaje de programare ezoterice. Mai ales dacă intenționați în sensul general mai larg de a induce în eroare sau de a confunda destinatarul. Nu ascundeți mesajul pentru că mesajul în sine este important, ci pentru că forma ascunsă este, în sine, obiectivul. Un mod tipic de a realiza acest lucru este prin minimizarea numărului de simboluri ale limbajului, dar puteți camufla și un limbaj de programare în ceea ce arată ca un text normal sau o imagine.

Non-Determinism

în acest sens mai larg de a induce în eroare, sau confuz publicul, non-determinism poate fi, de asemenea, utilizat pentru a atinge același obiectiv. Un limbaj nedeterminist este unul pentru care, având în vedere starea actuală a unui program, următoarea stare nu poate fi întotdeauna prezisă. Conceptul are o anumită utilizare în limbaje de programare normale, în esență datorită condițiilor imprevizibile în timpul rulării. Dar este dus la extrem de anumite limbaje de programare ezoterice, prin randomizarea variabilelor sau chiar randomizarea instrucțiunilor în sine.

grupuri de limbaje de programare ezoterice

așa cum am spus deja, nu putem oferi o modalitate exhaustivă de organizare a tuturor limbajelor de programare ezoterice. Și chiar dacă cineva ar putea găsi, în curând altcineva ar inventa un nou limbaje de programare ezoterice doar pentru a face invalid. Deci, ceea ce încercăm să facem este pur și simplu să oferim câteva grupuri sau categorii, pentru a înțelege și explora mai bine lumea limbajelor de programare ezoterice.

  • limbi cu o valoare obiectivă, deși această valoare nu este neapărat una extrinsecă sau tipică. Un exemplu de bază este un limbaj conceput pentru a câștiga o competiție de golf de cod: valoarea sa poate fi măsurată, dar nu are niciun sens în afara comunității limbajelor de programare ezoterice. Dar cele mai utile sunt cele concepute pentru a atinge un obiectiv neobișnuit, cum ar fi ocolirea măsurilor de securitate (vezi JSFuck) sau definirea limbilor de tip 0 ale ierarhiei Chomsky (vezi Thue).
  • limbi inutilizabile. Acestea sunt limbi care sunt foarte dificil de utilizat. Acesta poate fi un obiectiv explicit al designerului sau pur și simplu un accident al designului în sine. Un utilizator poate găsi chiar distractiv să le folosească de ceva timp. O modalitate tipică de a obține un limbaj inutilizabil, atât prin design, cât și accidental, este cu minimalismul (vezi Brainfuck). Dar dacă doriți ceva aproape imposibil de utilizat, aveți nevoie de ceva de genul unui limbaj care utilizează un sistem ternar și care se auto-modifică în mod intenționat, printre altele (Vezi Malbolge).
  • limbi pentru a testa o idee sau pentru a dovedi ceva. Acestea sunt limbi care pot să nu fie direct utile, dar sunt un teren bun de testare pentru un concept nou sau pentru a dovedi ceva. De exemplu, un limbaj în care programele sunt aranjate într-o grilă bidimensională (vezi Befunge) sau un limbaj funcțional aproape pur (vezi Unlambda)
  • limbi artistice. Acestea sunt limbi care sunt concepute cu ideea de a avea o anumită valoare artistică. S-ar putea argumenta că ele fac efectiv parte fie din grupul limbilor de testare, fie din cele cu o valoare obiectivă. Le punem într-o altă categorie, pentru că nu arată ca programarea, dar tind să pară interesante, chiar dacă este posibil să nu doriți să le utilizați. De exemplu, arată ca arta abstractă (vezi Piet) sau ca o piesă Shakespereană (vezi Shakespeare).
  • glume limbi. Acestea sunt limbi inventate cu oameni cu un simț al umorului ciudat. Ca o persoană care spune: „Vrei să auzi o glumă? – apoi citește război și pace, înainte de a încheia – întreaga noastră viață este o glumă!”. Un exemplu este un limbaj satiric, unde chiar și manualul de referință este o glumă (vezi INTERCAL)

unele limbi ezoterice notabile

desigur, aceasta nu este o listă exhaustivă de limbaje de programare ezoterice notabile, ci mai modest o listă a câtorva notabile pentru succesul sau particularitatea lor.

Befunge

principala caracteristică ezoterică a Befunge este că programele sunt aranjate într-o grilă bidimensională. Este, de asemenea, un limbaj bazat pe stivă și un limbaj reflectorizant, deci permite unui program să se modifice. Obiectivul principal a fost proiectarea unui limbaj pentru care a fost cât mai greu posibil să se creeze un compilator.

versiunea originală, numită acum Befunge-93,nu este completă Turing, deoarece pune o limită de 80 de 25 de la dimensiunea rețelei. Dar o nouă versiune, numită Befunge-98, elimină această limită și ar trebui să fie completă Turing. Befunge a dat naștere unei întregi clase de limbi multidimensionale, numite Fungeoid.

Befunge are comenzi care controlează direcția sus, jos, stânga, dreapta și astfel pot crea și un ciclu, împreună cu comenzi mai tradiționale pentru ieșire, operații binare etc.

un program Hello Word arată astfel.

> vv ,,,,,"Hello"<>48*, vv,,,,,,"World!"<>25*,@

Brainfuck

probabil cel mai faimos dintre toate limbajele de programare ezoterice, este notabil pentru minimalismul său extrem. Atât în numărul de comenzi disponibile, cât și în a avea un compilator foarte mic. De fapt, a doua condiție este motivul pentru prima, deoarece autorul a dorit să creeze o limbă cu cel mai mic compilator posibil. Autorul a creat un compilator care a folosit doar 240 de octeți. Uneori, mai târziu, altcineva a creat unul cu doar 100 de octeți. O consecință firească a acestui obiectiv este că limba este greu de folosit, deși este Turing completă. Pe scurt, este o prelată Turing.

este uneori menționată cu o ortografie cenzurată, cum ar fi Brainf*ck sau multe alte variații.

limba constă în opt comenzi diferite care manipulează un indicator de date și două fluxuri de octeți pentru intrare și ieșire. De asemenea, acceptă bucle. Alte caractere, pe lângă cele care reprezintă comenzile, sunt considerate comentarii și ignorate de compilator.

acesta este un exemplu al modului în care funcționează limba (preluat din esolangs wiki).

Code: Pseudo code:>> Move the pointer to cell2 Set cell2 to 0 << Move the pointer back to cell0 End while

un program Hello World arată astfel.

++++++++>+>+>->>+<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.

dacă doriți să aflați mai multe puteți vedea pe pagina Wikipedia corespunzătoare sau pagina Esolangs.

INTERCAL

INTERCAL poate că nu a fost primul limbaj de programare ezoteric, dar este cu siguranță primul celebru. Câți ani are? A fost creat în 1972 și prima implementare a fost făcută cu carduri perforate. Limbajul a fost conceput ca o parodie, dar și pentru a face ceva complet nou, străin de lumea programării. Numele nu este un acronim, potrivit autorilor:

numele complet al compilatorului este „limbajul compilatorului fără acronim Pronunțabil”, care este, din motive evidente, abreviat ” INTERCAL.”

restul manualului de referință INTERCAL (format PS) este, de asemenea, plin de afirmații fără sens sau pline de umor. Aceasta este atât pentru limba pe care o descriu, cât și pentru modul în care o fac. De exemplu, aceasta este o secțiune privind variabilele

INTERCAL permite doar 2 tipuri diferite de variabile, întreg pe 16 biți și întreg pe 32 de biți. Aceste
sunt reprezentate de un punct ( . ) sau, respectiv, două puncte ( : ), urmate de orice număr între 1 și 65535,
inclusiv. Aceste variabile pot conține numai numere non-negative; astfel, ele au intervalele respective de
valori: 0 la 65535 și 0 la 4294967295. Notă:.123 și: 123 sunt două variabile distincte. Pe de altă parte,
.1 și .0001 sunt identice. Mai mult, acesta din urmă nu poate fi scris ca 1E-3 .

limba permite, de asemenea, utilizarea unui modificator PLEASE. Cu toate acestea, necesită și utilizarea cantității adecvate a acestui cuvânt cheie. Nu poate fi folosit prea puțin sau prea mult, adică trebuie să arătați cantitatea adecvată de politețe. Partea cu adevărat neplăcută este că a fost o caracteristică nedocumentată în manualul original. Un manual de glumă pentru un manual de glumă poate fi în regulă, dar unul care este incomplet este inacceptabil.

aceasta este o lume salut într-o versiune de INTERCAL implementat cu 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

pe scurt, INTERCAL este o glumă foarte elaborată. Genul de glumă care te poate determina să-i admiri Creatorul pentru perseverența sa sau să te îndoiești de sănătatea sa, sau poate de ambele.

JSFuck

succesul Brainfuck sunt stimulat crearea multor limbi derivate, prea multe pentru a le menționa pe toate. Dar cel mai notabil este JSFuck.

JSFuck nu este un limbaj adecvat, dar este mai mult un stil de programare ezoteric al Javascript care necesită utilizarea a doar 6 caractere. Programele rezultate sunt programe JavaScript valide și, de fapt, a fost inventat pentru a ocoli tehnicile de securitate, cum ar fi detectarea malware-ului. Proprietățile sale au făcut-o utilă și pentru ascunderea codului.

funcționează deoarece puteți evalua orice expresie din Javascript ca orice tip. Deci reprezintă și matrice gol, dar prin prepending – l cu un + puteți forța să evalueze ca numărul 0. Pentru a obține o literă ca a puteți manipula valoarea false etc. Rezultatul final este un limbaj extrem de detaliat: echivalentul alert("Hello World!") are 22948 de caractere.

Malbolge

Malbolge este un limbaj special conceput pentru a fi aproape imposibil de utilizat:

printr-o ‘operație nebună’ contraintuitivă, aritmetică de bază-trei și cod de auto-modificare

în cuvintele propriului creator.

de fapt, chiar autorul nu a scris niciodată un program de lucru cu el. Primul program a fost generat de un alt program care a implementat un algoritm de căutare euristică. Limba nu este completă Turing și se bazează, de asemenea, pe o scriere greșită a Malebolge, cercul opt al iadului din Infernul lui Dante Alighieri. Deci, într-adevăr nu are nici o calitate răscumpărătoare.

Nu voi încerca să o descriu pentru că totul este în mod explicit un exercițiu de frustrare. Cu toate acestea, există o „operațiune nebună” notabilă care merită menționată: criptarea. Limba ar trebui să funcționeze pe o mașină virtuală ternară și are trei registre, dintre care unul conține un pointer la instrucțiunea curentă și se numește . După ce instrucțiunea este executată modulo 94 a valorii în înlocuiește orice este în atunci rezultatul este criptat conform unui tabel de criptare. Bun venit în iad, într-adevăr.

un suflet curajos a creat un program Hello World.

(=<`#9]~6ZY32Vx/4Rs+0No-&Jk)"Fh}|Bcy?`=*z]Kw%oG4UUS0/@-ejc(:'8dc

Piet

Piet este un limbaj în care programele sunt reprezentate ca picturi de artă abstractă, în stilul lui Piet Mondrian. Se bazează pe stivă și Turing complet.

există 18 culori ordonate în funcție de nuanță și luminozitate, plus alb-negru. Aceste ultime două au o semnificație specială și sunt utilizate pentru controlul fluxului. Execuția programului se bazează pe două „pointeri”: un Pointer de direcție și un selector de blocuri de culoare. DP poate indica în sus, în jos, la stânga și la dreapta, în timp ce CC poate indica doar la stânga și la dreapta. Combinația acestor doi indicatori guvernează execuția programului: practic ce Bloc de culoare este executat în continuare. Dimensiunea unui bloc de culoare reprezintă un număr întreg. Când tranziția programului între diferite blocuri de culoare, diferența lor în nuanță și luminozitate determină tipul de comandă care este executat. Comenzile sunt cele obișnuite, cum ar fi ieșirea unei valori, înmulțirea etc.

programul Hello World are o anumită frumusețe.

Salut lume în Piet de Thomas Schoch

Shakespeare

Shakespeare este un limbaj conceput pentru a avea: „cod sursă frumos care seamănă cu piesele lui Shakespeare”. Limbajul are puține comenzi și este funcțional similar cu limbajul de asamblare, dar nu este surprinzător de detaliat.

variabilele trebuie declarate într-o secțiune inițială, iar numele lor trebuie să fie caractere shakespeariene valide, cum ar fi Romeo sau Julieta. Aceste variabile sunt stive pe care ulterior vor fi executate operații precum pop, push și input/output. Numele actelor și scenelor funcționează ca etichete goto și destinația anumitor declarații condiționale. Personajele, adică variabilele, trebuie chemate pe scenă pentru a fi manipulate și pot exista doar două la un moment dat pe scenă.

liniile reprezintă de obicei constante numerice: unele substantive și adjective sunt convertite în valori numerice.

Hamlet: You lying stupid fatherless big smelly half-witted coward!Juliet: You are as villainous as the square root of Romeo!

cuvinte speciale, cum ar fi „amintiți-vă”, sau combinații ale acestora, cum ar fi „vorbește-ți mintea”, execută comenzi. Acestea sunt comenzi normale, cum ar fi împingerea valorilor pe caracterul stivei, afișarea valorii variabilei curente sau a caracterului ASCII corespunzător.

o afirmație condiționată este reprezentată de o întrebare de la un caracter și un răspuns de la celălalt caracter care determină unde să meargă, dacă condiția întrebării evaluează la adevărat.

Juliet: Am I better than you?Hamlet: If so, let us proceed to scene III.

Hello World este la fel de lungă și productivă ca o piesă shakespeariană.

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 este un limbaj de programare bazat pe un sistem de rescriere șir, numit sistem semi-Thue. Este nedeterminist și urmează paradigma programării constrângerilor. Ceea ce înseamnă că variabilele sunt definite în termeni de constrângere (ex. ceva este adevărat sau fals). Este o prelată Turing.

în cazul Thue costtraints sunt reprezentate de o listă de reguli de substituție în forma:

<string>::=<replacement>

formatele speciale ale acestui formular reprezintă intrarea, ieșirea sau încheierea listei de reguli.

natura nedeterministă a limbajului poate fi arătată prin indicarea a două posibile înlocuiri pentru același șir. De exemplu:

  • scrieți o regulă care spune că șirul a poate fi înlocuit cu stupid
  • scrieți și o regulă care spune că șirul a poate fi înlocuit cu you are

când un program este executat șirul a ar putea fi înlocuit cu oricare dintre cele două opțiuni.

lista de reguli este urmată de un șir care reprezintă starea inițială.

în timp ce scrierea unui program util poate fi greu, lumea tipică Hello este destul de ușoară și de înțeles, cel puțin după standardul limbajelor de programare ezoterice.

a::=~Hello World!::=a

Unlambda

Unlambda este un limbaj funcțional (aproape) pur conceput pentru a arăta un limbaj pur funcțional (și probabil cât de impracticabil ar fi). Se bazează pe logica combinatorie. Este Turing complete și prima prelată Turing funcțională. Se bazează pe câteva funcții, un operator de aplicare ` (caracterul backquote) și acceptă, de asemenea, intrare/ieșire. Din punct de vedere tehnic, funcționează numai pe funcții cu un singur argument, dar funcțiile multi-argument pot fi traduse într-o secvență de funcții.

un program Hello World pare aproape lizibil.

`r```````````.H.e.l.l.o. .w.o.r.l.di

alte limbi ezoterice interesante

Fugue este un limbaj care utilizează fișiere MIDI ca cod sursă. Intervalele dintre fiecare notă este tradus la comenzi tradiționale specifice, cum ar fi intrare/ieșire sau Adăugare.

Beatnik este un limbaj bazat pe stivă care constă într-o serie de cuvinte în limba engleză; spațiul alb și punctuația sunt ignorate. Cuvintele sunt convertite în comenzi tradiționale în funcție de valoarea lor în Scrabble joc.

spațiul alb este un limbaj de glumă în care numai caracterele spațiului alb, cum ar fi filele și spațiile, sunt valide și orice alt caracter este ignorat. Acesta este, desigur, inversul comportamentului obișnuit al compilatoarelor care ignoră spațiul alb. Având în vedere aceste caracteristici, poate fi utilizat într-un program poliglot, adică un program valabil pentru mai multe limbi. Atâta timp cât cealaltă limbă nu este Python sau orice limbă în care contează spațiul alb.

GolfScript este un limbaj de programare concatenativ conceput pentru a câștiga competiții de cod-golf, care este, de asemenea, Turing complete.

Snowflake este un limbaj reversibil de auto-modificare în care atât interpretul, cât și programul sunt modificate la fiecare rulare.

FRACTRAN este un limbaj în care programele sunt o listă de fracții și un număr inițial. Nu sunt sigur ce face, dar face ceva, deoarece are o pagină Wikipedia.

Iota și Jot sunt două Limbaje formale, fiecare fiind conceput pentru a fi cel mai simplu sistem formal. Prin natura lor, ele pot fi, de asemenea, considerate la fel de minimaliste, Turing tarpit, limbaje de programare. Ambele folosesc doar două simboluri și efectuează două operații. Un succesor, numit Zot, sprijină, de asemenea, de intrare/ieșire.

entropia este un limbaj de programare numit foarte bine conceput pentru a accepta ideea de a renunța la control. Orice ieșire a programului va fi aproximată și de fiecare dată când datele sunt accesate este modificat aleatoriu. Limba nu modifică programul original, astfel încât de fiecare dată când este rulat ieșirea va fi diferită, dar starea inițială va fi păstrată. Un efect secundar curios al randomizării datelor este Drunk Eliza, o versiune web a programului clasic Eliza în care terapeutul pare să fie beat.

Monicelli este un limbaj de glumă bazat pe filmul de comedie prietenii mei. Un program tipic arată ca o serie de fraze italiene fără sens. În mod surprinzător, acest lucru are sens, deoarece filmul folosit ca inspirație conține și fraze fără sens. Este cercul nebuniei.

rezumat

lumea limbajului de programare ezoteric este la fel de interesantă pe cât de înnebunitoare: nu există reguli, ci o mulțime de lucruri interesante. Sper să-ți fi dat o fereastră ușor sănătos pe ceea ce te-ai putea aștepta.

dacă doriți să aflați mai multe sau să participați la această comunitate, vă sugerez să vă uitați la Esolangs. Acest site web, împreună cu Wikipedia, este sursa celor mai multe exemple prezentate în acest articol. Acolo puteți găsi, de asemenea, o inspirație într-o listă de idei pentru un limbaj de programare ezoteric.

de asemenea, puteți găsi interesant blogul lui Marc C. Chu-Carroll în numeroasele sale încarnări de-a lungul anilor. După cum sugerează și numele matematică bună, matematică proastă, este dedicat în principal matematicii. Cu toate acestea, are și multe analize ale limbajelor de programare ezoterice într-o serie numită programare patologică (limbaj). Puteți vedea, de exemplu, unul dedicat celui mai mic limbaj de programare.

Lasă un răspuns

Adresa ta de email nu va fi publicată.

Previous post roți de citrice uscate de casă
Next post Sânge și ciocolată (2007)