INTERKALT

Don Woods , en av författarna till INTERCAL, 2010
Jim Lyon, den andra författaren till INTERCAL, 2005

Compiler Language With No Pronounceable Acronym ( INTERCAL ) är ett esoteriskt programmeringsspråk som skapades som en parodi av Don Woods och James M. Lyon [ ru ] , två Princeton University- studenter, 1972. Det satiriserar aspekter av de olika programmeringsspråken på tiden, såväl som spridningen av föreslagna språkkonstruktioner och notationer på 1960-talet.

Det finns två underhållna implementeringar av INTERCAL-dialekter: C-INTERCAL (skapad 1990), underhållen av Eric S. Raymond och Alex Smith, och CLC-INTERCAL, underhållen av Claudio Calvelli.

Historia

Enligt författarnas originalmanual,

Det fullständiga namnet på kompilatorn är "Compiler Language With No Pronounceable Acronym", som av uppenbara skäl förkortas "INTERCAL".

Den ursprungliga Princeton-implementeringen använde hålkort och teckenuppsättningen EBCDIC . För att tillåta INTERCAL att köras på datorer som använder ASCII måste två tecken ersättas: $ ersätts med ¢ som mingeloperator , "representerar den ökande kostnaden för mjukvara i förhållande till hårdvara", och ? ersattes med som den unära exklusiva-eller- operatören för att "korrekt uttrycka den genomsnittliga personens reaktion vid första mötet med exklusiv-eller". I de senaste versionerna av C-INTERCAL stöds de äldre operatörerna som alternativ; INTERCAL-program kan nu kodas i ASCII , Latin-1 eller UTF-8 .

Versionsnummer

C-INTERCAL byter ut de stora och små versionsnumren, jämfört med traditionen. HISTORY-filen visar utgåvor som börjar på version 0.3 och från och med maj 2020 har gått till 0.31, men innehåller 1.26 mellan 0.26 och 0.27.

CLC-INTERCAL versionsnumreringsschema var traditionellt fram till version 0.06, då det ändrades till schemat som dokumenterats i README -filen, som säger:

* Termen "version" har ersatts av "perversion" för korrektheten

* Perversionstalet består av ett flyttalstal med oberoende tecken för heltals- och bråkdelen. Negativa bråk anger pre-escapes (så 1.-94 betyder "94 pre-escapes att gå före 1.00". Eller så kan du bara lägga ihop siffrorna och få 0.06, vilket är helt och hållet en slump eftersom 0.06 inte utvecklas)

* Bråkdelen av ett perversionstal kan vara heltal eller flyttal, med en liknande betydelse för delarna. Den nuvarande pre-escape är 1.-94.-2 vilket betyder "2 pre-pre-escapes att gå före pre-escape 1.-94".

Detaljer

INTERCAL var tänkt att vara helt annorlunda än alla andra datorspråk. Vanliga operationer på andra språk har kryptisk och redundant syntax i INTERCAL. Från INTERCAL referensmanual:

Det är ett välkänt och ofta påvisat faktum att en person vars arbete är obegripligt hålls högt aktad. Om man till exempel skulle säga att det enklaste sättet att lagra ett värde på 65536 i en 32-bitars INTERCAL-variabel är:

   0 DO  :  1  <-  #  ¢#  256 

vilken vettig programmerare som helst skulle säga att det var absurt. Eftersom detta verkligen är den enklaste metoden, skulle programmeraren fås att se dum ut inför sin chef, som naturligtvis råkar dyka upp, som chefer vill göra. Effekten skulle inte vara mindre förödande för programmeraren som hade rätt.

INTERCAL har många andra funktioner som är utformade för att göra det ännu mer estetiskt obehagligt för programmeraren: den använder uttalanden som "LÄS UPP", "IGNERA", "GÖM", och modifierare som "VÄNLIGEN". Detta sista nyckelord ger två skäl till att programmet avvisades av kompilatorn: om "PLEASE" inte visas tillräckligt ofta, anses programmet vara otillräckligt artigt, och felmeddelandet säger detta; om det dyker upp för ofta kan programmet avvisas som överdrivet artigt. Även om denna funktion fanns i den ursprungliga INTERCAL-kompilatorn, var den odokumenterad.

Trots språkets avsiktligt trubbiga och ordrika syntax är INTERCAL ändå Turing-komplett : givet tillräckligt med minne kan INTERCAL lösa alla problem som en Universal Turing-maskin kan lösa. De flesta implementeringar av INTERCAL gör detta dock väldigt långsamt. En Sieve of Eratosthenes benchmark, som beräknade alla primtal mindre än 65536, testades på en Sun SPARCstation 1 1992. I C tog det mindre än en halv sekund; samma program i INTERCAL tog över sjutton timmar.

Dokumentation

"Kretsdiagrammet" från INTERCAL Reference Manual, påstås förklara hur den "select"-operatören fungerar

INTERCAL-referenshandboken innehåller många paradoxala, meningslösa eller på annat sätt humoristiska instruktioner:

Varning! Blanda under inga omständigheter ihop nätet med interfolieringsoperatören, förutom under förvirrande omständigheter!

Manualen innehåller också en " tonsil ", som förklaras i denna fotnot: "4) Eftersom alla andra referensmanualer har bilagor, beslutades att INTERCAL-manualen skulle innehålla någon annan typ av löstagbart organ."

INTERCAL-manualen ger ovanliga namn på alla icke-alfanumeriska ASCII- tecken: enkla och dubbla citattecken är "gnistor" respektive "kaninöron". (Undantaget är et -tecken : som jargongfilen säger, "vad kan vara dummare?") Tilldelningsoperatorn, representerad som ett likhetstecken (INTERCALs "halva mesh") i många andra programmeringsspråk, är i INTERCAL en vänsterpil , <- , som består av en "vinkel" och en "mask", uppenbarligen läses som "get".

Syntax

Ingång (med WRITE IN -instruktionen) och utgång (med READ OUT -instruktionen) använder inte de vanliga formaten; i INTERCAL-72, WRITE IN matar in ett nummer som skrivs ut som siffror på engelska (t.ex. SIX FIVE FIVE THREE FIVE), och READ OUT matar ut det i "slaktade" romerska siffror . Nyare versioner har sina egna I/O-system.

Kommentarer kan uppnås genom att använda inverterade satsidentifierare som involverar NOT eller N'T; dessa gör att linjer till en början avhålls så att de inte har någon effekt. (En rad kan avstå från även om den inte har giltig syntax; syntaxfel inträffar vid körning och först då när raden inte är avböjd.)

Data struktur

INTERCAL-72 (den ursprungliga versionen av INTERCAL) hade bara fyra datatyper : 16- bitars heltal (representerat med en . , kallad en "spot"), 32-bitars heltal ( : , en "twospot"), arrayen av 16-bitars heltal ( , , en "svans") och matrisen med 32-bitars heltal ( ; , en "hybrid"). Det finns 65535 tillgängliga variabler av varje typ, numrerade från .1 till .65535 för 16-bitars heltal, till exempel. Men var och en av dessa variabler har sin egen stack på vilken den kan skjutas och poppas (STASHed och HÄMT, i INTERCAL terminologi), vilket ökar den möjliga komplexiteten hos datastrukturer. Modernare versioner av INTERCAL har i stort sett behållit samma datastrukturer, med lämpliga modifieringar; TriINTERCAL, som modifierar radixen med vilken siffror representeras, kan använda en 10- tritstyp snarare än en 16-bitarstyp, och CLC-INTERCAL implementerar många av sina egna datastrukturer, såsom "klasser och föreläsningar", genom att göra grundläggande datatyper lagrar mer information snarare än att lägga till nya typer. Matriser dimensioneras genom att tilldela dem som om de vore en skalär variabel. Konstanter kan också användas, och representeras av ett # ("mesh") följt av själva konstanten, skriven som ett decimaltal ; endast heltalskonstanter från 0 till 65535 stöds.

Operatörer

Det finns bara fem operatörer i INTERCAL-72. Implementeringarna varierar i vilka tecken som representerar vilken operation, och många accepterar mer än ett tecken, så fler än en möjlighet ges för många av operatörerna.

INTERCAL operatörer
Operatör INTERCAL-72 tecken C-INTERCAL tecken CLC-INTERCAL tecken
INTERLEAVE / MINGLE c backsteg / ¢ , $ , c backsteg / ¢
VÄLJ ~ ~ ~
OCH & & &
ELLER V V V
XOR V backsteg - V backsteg - , ? , V backsteg - , ¥

00 I motsats till de flesta andra språk är AND, OR och XOR unära operatorer, som arbetar på på varandra följande bitar av deras argument; den mest signifikanta biten av resultatet är operatorn som appliceras på de minst signifikanta och mest signifikanta bitarna av ingången, den näst mest signifikanta biten av resultatet är operatorn som appliceras på de mest och näst mest signifikanta bitarna, den tredje- Den mest signifikanta biten av resultatet är operatorn som appliceras på de näst mest och tredje bitarna, och så vidare. Operatorn placeras mellan skiljetecken som anger ett variabelnamn eller konstant och numret som anger vilken variabel det är, eller precis innanför grupperingstecken (dvs. ett tecken senare än det skulle vara i programmeringsspråk som C .) SELECT och INTERLEAVE ( som är också känd som MINGLE) är binära infixoperatorer; SELECT tar bitarna av sin första operand som motsvarar "1"-bitar av dess andra operand och tar bort bitarna som motsvarar "0"-bitar, skiftar mot den minst signifikanta biten och fyller med nollor (så 51 (1 1 1 1 in ) binär) SELECT 21 (10101 i binär) är 5 ( 101 i binär)); MINGLE alternerar bitar från dess första och andra operand (på ett sådant sätt att den minst signifikanta biten av dess andra operand är den minst signifikanta biten av resultatet). Det finns ingen operatörsföreträde; grupperingsmärken måste användas för att disambiguera företrädet där det annars skulle vara tvetydigt (de tillgängliga grupperingsmärkena är ' ("gnista"), som matchar en annan gnista, och " ("kaninöron"), som matchar en annan kaninöron; programmeraren ansvarar för att dessa används på ett sådant sätt att de gör uttrycket entydigt).

Kontrollstrukturer

INTERCAL-satser börjar alla med en "satsidentifierare"; i INTERCAL-72 kan detta vara DO , PLEASE , eller PLEASE DO , som alla betyder detsamma för programmet (men att använda en av dessa för kraftigt leder till att programmet avvisas, en odokumenterad funktion i INTERCAL-72 som nämndes i C-INTERCAL-manualen), eller en inverterad form (med NOT eller N'T tillagd till identifieraren). Backtracking INTERCAL, en modern variant, tillåter också varianter som använder MAYBE (eventuellt kombinerat med PLEASE eller DO) som en satsidentifierare, vilket introducerar en valpunkt. Före identifieraren kan ett valfritt radnummer (ett heltal inom parentes) anges; efter identifieraren kan en procentuell chans att raden körs ges i formatet %50 , som är standard på 100%.

I INTERCAL-72 är de huvudsakliga kontrollstrukturerna NEXT, RESUME och FORGET. DO ( line ) NEXT förgrenar sig till den angivna linjen och kommer ihåg nästa rad som skulle exekveras om det inte vore för NEXT på en anropsstack (andra identifierare än DO kan användas på vilken sats som helst, DO ges som ett exempel) ; DO FORGET uttryck tar bort uttrycksposter från toppen av anropsstacken (detta är användbart för att undvika felet som annars inträffar när det finns fler än 80 poster), och DO RESUME uttryck tar bort uttrycksposter från anropsstacken och hoppar till sista raden kom ihåg.

C-INTERCAL tillhandahåller också COME FROM -instruktionen, skriven DO COME FROM ( rad ) ; CLC-INTERCAL och de senaste C-INTERCAL-versionerna tillhandahåller också beräknade COME FROM ( DO COME FROM expression ) och NEXT FROM, som är som COME FROM men också sparar en returadress på NEXT STACK.

Alternativa sätt att påverka programflödet, som ursprungligen var tillgängligt i INTERCAL-72, är att använda instruktionerna IGNORE och KOM IHÅG på variabler (som gör att skrivningar till variabeln tyst ignoreras och träder i kraft igen, så att instruktioner kan inaktiveras genom att orsaka dem att inte ha någon effekt), och instruktionerna AVBATT och ÅTERINSTÄTTA på rader eller på typer av uttalanden, vilket gör att raderna inte har någon effekt eller att de får effekt igen.

Hej världen

Den traditionella "Hej världen!" Programmet visar hur annorlunda INTERCAL är från vanliga programmeringsspråk. I C kan det lyda som följer:

 

  
    

     0
 #include  <stdio.h>  int  main  (  void  )  {  printf  (  "Hej världen!  \n  "  );  återvända  ;  } 

Motsvarande program i C-INTERCAL är längre och svårare att läsa:

   
      
     
     
     0
     
     
     
      
     
     
     
     
     
   
   DO  ,  1  <-  #  13  VÄNLIGEN GÖR  ,  1  SUB  #  1  <  -  #  238  DO  ,  1  SUB  #  2  <-  #  108  DO  ,  1  SUB  #  3  <-  #  112  DO  ,  1  SUB  #  4  <-  #  DO  ,  1  SUB  #  5  <-  #  64  DO  ,  1  SUB  #  6  <  -  #  194  DO  ,  1  SUB  #  7  <-  #  48  GÖR  ,  1  SUB  #  8  <-  #  22  DO  ,  1  SUB  #  9  <-  #  248  DO  ,  1  SUB  #  10  <-  #  168  DO  ,  1  SUB  #  11  <-  #  24  DO  ,  1  SUB  #  12  <-  #  16  DO  ,  1  SUB  #  13  <-  #  162  VÄNLIGEN  LÄS  UPP  ,  1  VÄNLIGEN  GE  UPP 

Dialekter

Den ursprungliga Woods–Lyon INTERCAL var mycket begränsad i sina inmatnings-/utgångsmöjligheter : den enda acceptabla inmatningen var siffror med siffrorna utskrivna, och den enda utgången var en utökad version av romerska siffror .

C-INTERCAL-omimplementeringen, som är tillgänglig på Internet, har gjort språket mer populärt bland anhängare av esoteriska programmeringsspråk. C-INTERCAL-dialekten har några skillnader från den ursprungliga INTERCAL och introducerade några nya funktioner, såsom ett COME FROM- uttalande och ett sätt att göra text I/O baserat på Turing Text Model.

Författarna till C-INTERCAL skapade också TriINTERCAL-varianten, baserad på det ternära siffersystemet och generaliserande INTERCALs uppsättning operatorer.

En nyare variant är Threaded Intercal, som utökar funktionaliteten i COME FROM till att stödja multithreading .

CLC-INTERCAL har ett bibliotek som heter INTERNET för nätverksfunktionalitet inklusive att vara en INTERCAL-server, och inkluderar även funktioner som Quantum Intercal, som möjliggör flervärdesberäkningar på ett sätt som påstås vara redo för de första kvantdatorerna .

I början av 2017 dök en .NET- implementering in mot .NET Framework GitHub . Denna implementering stöder skapandet av fristående binära bibliotek och samverkan med andra programmeringsspråk.

Genomslag och diskussion

I artikeln "A Box, Darkly: Obfuscation, Weird Languages, and Code Aesthetics" beskrivs INTERCAL under rubriken "Abandon all sanity, ye who enter here: INTERCAL". Kompilatorn och kommentarsstrategin är bland de "konstiga" funktioner som beskrivs:

Kompilatorn, lämpligen kallad "ick", fortsätter parodin. Allt som kompilatorn inte kan förstå, vilket på ett normalt språk skulle resultera i ett kompileringsfel, hoppas bara över. Denna "förlåtande" funktion gör det mycket svårt att hitta buggar; det introducerar också ett unikt system för att lägga till programkommentarer. Programmeraren infogar bara icke-kompilerbar text var som helst i programmet, och är noga med att inte råka bädda in lite giltig kod i mitten av sin kommentar.

I "Technomasochism" karakteriserar Lev Bratishenko INTERCAL-kompilatorn som en dominatrix:

Om PLEASE inte påträffades tillräckligt ofta, skulle programmet avvisas; det vill säga ignoreras utan förklaring av kompilatorn. Alltför ofta och det skulle fortfarande avvisas, den här gången på grund av sniveling. I kombination med andra ord som sällan används i programmeringsspråk men som visas som påståenden i INTERCAL, läses koden som att någon vädjar.

Populärkultur

Nitrome Enjoyment System, en fiktiv videospelskonsol skapad av den brittiska indiespelsutvecklaren Nitrome , har spel som är programmerade i INTERCAL.

externa länkar