Piet er et esoterisk programmeringssprog udviklet af David Morgan-Mar. Piet-sproget bruger farverige billeder som programmer. Et Piet-program ligner en post-malerisk abstraktion . Piet har fået sit navn fra den hollandske kunstner Piet Mondrian .
Programkode på Piet-sproget præsenteres i form af en abstrakt tegning.
#FFC0C0 lys rød |
#FFFFC0 lysegul |
#C0FFC0 lysegrøn |
#C0FFFF lys cyan |
#C0C0FF lyseblå |
#FFC0FF lys magenta |
#FF0000 rød |
#FFFF00 gul |
#00FF00 grøn |
#00FFFF cyan |
#0000FF blå |
#FF00FF magenta |
#C00000 mørkerød |
#C0C000 mørkegul |
#00C000 mørkegrøn |
#00C0C0 mørkeblå |
#0000C0 mørkeblå |
#C000C0 mørk magenta |
#FFFFFF hvid | #000000 sort |
Der bruges 20 forskellige farver (tabel til højre). De 18 farver i de første tre rækker i tabellen er forbundet cyklisk med følgende to cyklusser:
Dette indebærer, at lys er mørkere end mørkt, og omvendt. Hvide og sorte farver er ikke inkluderet i cyklerne.
Komplementærfarver kan også bruges, selvom deres effekt er implementeringsafhængig. I det enkleste tilfælde behandles ikke-standardfarver som hvide af sprogtolken (ellers kan de bruges som analoge med sort).
Piet-kode er en form for grafik, der er samlet ud fra genkendelige farver. Individuelle farvepixel er vigtige i et sprog, så reglen gælder for programmer, der skal forstørres for at vise detaljer. I sådanne forstørrede programmer bruges udtrykket kodel til at beskrive en blok med en farve svarende til én kodepixel, for at undgå forveksling med de faktiske pixels i den forstørrede grafik, som faktisk kan være én kode.
Hovedelementet i Piet-sproget er farveblokken. En farveblok er en blok af et vilkårligt antal sammenhængende koder af samme farve, afgrænset af blokke af en anden farve eller af kanten af programmets grafik. Farvede blokke, der kun er diagonalt stødende op, betragtes ikke som tilstødende. En farvet blok kan have enhver form og kan have "huller" af andre farver indeni, som ikke er en del af blokken.
Piet bruger en stak til at gemme alle data. Dataene eksisterer kun som heltal, selvom de kan læses eller udlæses som Unicode-tegn ved de relevante kommandoer.
D.P. | CC | Udvalgt kode |
---|---|---|
ret | til venstre | øverste |
ret | laveste | |
langt nede | til venstre | længst til højre |
ret | længst til venstre | |
til venstre | til venstre | laveste |
ret | øverste | |
op | til venstre | længst til venstre |
ret | længst til højre |
Piet-sprogfortolkeren begynder at udføre programmet i den farvede blok, der indeholder programmets øverste venstre kode. Tolken indeholder en Direction Pointer (DP), som i første omgang peger mod højre. DP kan pege til højre, venstre, op, ned. Tolken indeholder også en kodevælger (CC), der peger først til venstre. CC kan pege til venstre eller højre. Retningen af DP og CC ændres normalt ofte under programafviklingen.
Under programafviklingen krydser tolken farvede blokke i henhold til følgende regler:
Tolken fortsætter med at udføre disse handlinger, indtil programmet afsluttes.
Hver ikke-sort og ikke-hvid farvet blok i Piet er det heltal, der svarer til antallet af koder i den blok. Bemærk, at negative heltal ikke kan repræsenteres, selvom de kan konstrueres af operatorer. Når tolken koder et tal, behøver den ikke at gøre noget ved det. Især skubber den den ikke automatisk ind på stakken - der er en speciel kommando til dette (se nedenfor).
Sorte blokke og programgrænser begrænser programmets flow. Hvis Piet-programtolken forsøger at bevæge sig ind i en sort blok eller uden for rammerne, stopper den og CC skifter. Dernæst forsøger tolken at flytte fra denne aktuelle blok igen. Hvis det fejler en anden gang, ændres DP i urets retning med 90 grader. Disse forsøg gentages, mens CC og DP skifter mellem alternative forsøg. Hvis tolken efter otte forsøg ikke kan forlade den aktuelle blok, er der ingen udgangssti, og programmet afsluttes.
Hvide blokke er frie gennem zoner, som tolken frit springer over. Hvis den bevæger sig fra en farvet blok til et hvidt rum, bevæger tolken sig gennem de hvide koder mod DP, indtil den rammer en ikke-hvid blok. Hvis tolken rammer en sort blok eller kant, anses den for at være afgrænset, ellers flytter den til den farvede blok, den ramte. At flytte gennem en hvid blok til en ny farvet udløser ikke en kommando (se nedenfor). I dette tilfælde kan hvide blokke bruges til at ændre den aktuelle farve uden at udføre kommandoer, hvilket er meget nyttigt til loop-kodning.
Afklaring på hvid blok
Bevægelse langs den hvide blok fører tolken i en lige linje, før den rammer en farvet pixel eller kant. Den bruger ikke proceduren beskrevet ovenfor til at bestemme, hvor tolken vil forlade en ikke-hvid farveblok.
Præcis hvad der sker, når tolken bevæger sig over en hvid blok og rammer en sort blok eller kant, fremgik ikke af den oprindelige specifikation. Fortolkningen følger af en bogstavelig læsning af følgende tekst:
Ændring af lysstyrke | |||
---|---|---|---|
Farveændring | Ikke | Mørkere med 1 | Mørkere med 2 |
Ikke | skubbe | pop | |
1 trin | tilføje | trække fra | formere sig |
2 trin | dele | mod | ikke |
3 trin | større | pointer | kontakt |
4 trin | duplikere | rulle | i (antal) |
5 trin | i (char) | ud (antal) | ud (char) |
Kommandoer defineres ved at flytte fra en farvet blok til en anden i overensstemmelse med bevægelsen gennem programmet. Antallet af trin gennem farvecyklussen og luminanscyklussen i hver overgang bestemmer den kommando, der skal udføres, som vist i tabellen til højre. Hvis overgangen er gennem en hvid blok, udføres kommandoen ikke.
Nogle er beskrevet nedenfor.
Handlinger, der ikke kan udføres, ignoreres (eksempel: popning af en ikke-eksisterende værdi fra stakken).
Programmeringssprog | |
---|---|
|