Whitespace (programmeringsspråk)

Whitespace hello world-program med syntaxmarkering
 flikar
 mellanslag

Whitespace är ett esoteriskt programmeringsspråk utvecklat av Edwin Brady och Chris Morris vid University of Durham (även utvecklare av programmeringsspråken Kaya och Idris ). Den släpptes den 1 april 2003 ( April Fool's Day ). Dess namn är en referens till blanksteg . Till skillnad från de flesta programmeringsspråk, som ignorerar eller tilldelar de flesta blankstegstecken liten betydelse, ignorerar blankstegstolken alla icke-blankstegstecken. Endast mellanslag , flikar och radmatningar har betydelse.

En konsekvens av denna egenskap är att ett blankstegsprogram lätt kan innehållas i blankstegstecken i ett program skrivet på ett språk som ignorerar blanksteg, vilket gör texten till en polyglot .

Språket i sig är ett imperativt stackbaserat språk . Den virtuella maskinen som programmen körs på har en stack och en heap . Programmeraren är fri att skjuta heltal med godtycklig bredd på stacken (för närvarande finns det ingen implementering av flyttal) och kan också komma åt högen som ett permanent lager för variabler och datastrukturer .

Historia

Whitespace skapades av Edwin Brady och Chris Morris 2002. Slashdot gav en recension av detta programmeringsspråk den 1 april 2003.

Idén att använda blanktecken som operatorer för C++ -språket hade fem år tidigare föreslagits av Bjarne Stroustrup .

Syntax

Kommandon består av sekvenser av mellanslag, tabbstopp och radmatningar. Alla andra tecken ignoreras och kan därför användas för kommentarer. Till exempel utför tab-space-space-space aritmetisk addition av de två översta elementen i stacken.

Koden skrivs som en Instruction Modification Parameter (IMP) följt av operationen. Tabellen nedan visar en lista över alla IMPs i Whitespace.

IMP Menande
[Plats] Stack manipulation
[Tab][Mellanslag] Aritmetisk
[Tab][Tab] Hög tillgång
[Radmatning] Flödeskontroll
[Tab][LineFeed] I/O

Varje IMP följs av en operation definierad för den IMP, och en parameter vid behov. Listan över operationer som stöds i Whitespace är:

IMP Kommando Parameter Menande
[Plats] [Plats] siffra Skjut numret på stapeln
[Plats] [LF][Rymden] - Duplicera det översta föremålet på stapeln
[Plats] [Tab][Mellanslag] siffra Kopiera det n:e objektet på högen (givet av argumentet) till toppen av högen
[Plats] [LF][Tab] - Byt ut de två översta föremålen på högen
[Plats] [LF][LF] - Släng det översta föremålet på högen
[Plats] [Tab][LF] siffra Skjut n föremål från stapeln, behåll det översta föremålet
[Tab][Mellanslag] [Utrymden][Utrymden] - Tillägg
[Tab][Mellanslag] [Mellanslag][Tab] - Subtraktion
[Tab][Mellanslag] [Space][LF] - Multiplikation
[Tab][Mellanslag] [Tab][Mellanslag] - Heltalsdivision
[Tab][Mellanslag] [Tab][Tab] - Modulo
[Tab][Tab] [Plats] - Förvara i hög
[Tab][Tab] [Flik] - Hämta från högen
[LF] [Utrymden][Utrymden] Märka Markera en plats i programmet
[LF] [Mellanslag][Tab] Märka Ring en subrutin
[LF] [Space][LF] Märka Hoppa till en etikett
[LF] [Tab][Mellanslag] Märka Hoppa till en etikett om toppen av stapeln är noll
[LF] [Tab][Tab] Märka Hoppa till en etikett om toppen av stapeln är negativ
[LF] [Tab][LF] - Avsluta en subrutin och överför kontrollen tillbaka till den som ringer
[LF] [LF][LF] - Avsluta programmet
[Tab][LF] [Utrymden][Utrymden] - Skriv ut tecknet överst i stapeln
[Tab][LF] [Mellanslag][Tab] - Skriv ut numret överst i stapeln
[Tab][LF] [Tab][Mellanslag] - Läs ett tecken och placera det på den plats som anges av toppen av stapeln
[Tab][LF] [Tab][Tab] - Läs en siffra och placera den på den plats som anges av toppen av högen

Operationerna "copy" och "slide" lades till i Whitespace 0.3 och kanske inte stöds av alla implementeringar.

Tal

Siffror består av mellanslag (0) och flikar (1), och de avslutas med en radmatning. Det första mellanslag/fliken i talet representerar talets tecken, om det är ett mellanslag är talet positivt, om det är en tabb är talet negativt. Resten av de efterföljande utrymmena och flikarna representerar resten av det binära numret.

Exempel

space-tab-space-space-tab-space-tab-tab-linefeed (STSSTSTTL) representerar det binära talet 1001011 (positivt, eftersom talet börjar med ett mellanslag) => 75 i decimal.

tab-tab-tab-space-space-tab-space-linefeed (TTTSSTSL) representerar det binära talet 110010 (negativt, eftersom talet börjar med en tabb) => -50 i decimal.

Etiketter

Etiketter är helt enkelt [LF] avslutade listor med mellanslag och flikar. Det finns bara ett globalt namnområde så alla etiketter måste vara unika.

Exempelkod

Följande är ett kommenterat Whitespace-program som helt enkelt skriver ut "Hello, world!" , där varje blanksteg , tabb eller radmatningstecken föregås av den identifierande kommentaren "S", "T" respektive "L":

   	  	   	     		  	 		     		 		  	     		 		  	     		 					     	 		  	     	     	     			 				     		 					     			  	 	     		 		  	     		  	  	     	    		   S  S  S  T  S  S  T  S  S  S  L:Push_+1001000=72='H'_onto_the_stack T  L S  S  :Output_'H';_S  S  T  T  S  S  T  S  T  L  :Push_+1100101=101=' e'_onto_the_stack T  L S  S  :Output_'e';_S  S  S  T  T  S  T  T  S  S  L:+1101100=108='l' T  L S S  S  S  S  T T  S  T  T  S  S  L  :  +1101100= 108='l' T  L S S  S  S  T  T  S  T  T  T  T  L  :+1101111=111='o' T  L  S  S  S  S  S  T  S  T  T  S  S  L:+101100=44=',' T  L S  S  S  S  S  T  S  S  S  S  S  L:+100000=32=Utrymme T  L S  S  S  S  S  T  T  T  S  T  T  L  :+1110111=119='w' T  L S  S  S  S  S  T  T  S  T  T  T  T  L:+1101111=111='o' T  L  S  S  S  S  S  T  T T  S  S  T  S  L  :+1110010=114='r' T  ​​L S  S  S  S  T  T  S  T  T  S  S  L  :+1101100=108='l' T  L S S  S  S  S  T  T  S  S  T  S  S  L=+1100100=100='d' T  L S S  S  S  S T  S  S  S  S  T  L  :  + 100001=33='!' T   L S  S  :Output_'!';_L L L:Avsluta_programmet 

Observera att när Whitespace-källkoden visas i vissa webbläsare är det horisontella avståndet som skapas av ett tabbtecken inte fast, utan beror på dess plats i texten i förhållande till nästa horisontella tabbstopp . Beroende på programvaran kan tabbtecken också ersättas av motsvarande variabla antal mellanslagstecken.

Se även

  1. ^ a b c d e "Whitespace" . Compsoc . Arkiverad från originalet den 18 juni 2015 . Hämtad 8 december 2015 .
  2. ^ a b   Parker, Matt (2019). Humble Pi: en komedi av matematiska fel . Allen Lane. sid. 21. ISBN 978-0-241-36023-1 .
  3. ^ Timothy (1 april 2003). "Nytt programmeringsspråk för endast blanksteg" . Slashdot . Hämtad 23 januari 2014 .
  4. ^ Stroustrup, Bjarne. "Generalisera överbelastning för C++2000" (PDF) . Florham Park, NJ, USA: AT&T Labs . Hämtad 23 januari 2014 .

externa länkar