- Piet, kodun bir soyut resim gibi görünmesi için tasarlanmış esoterik bir programlama dilidir; adını geometrik soyut sanatın öncülerinden Piet Mondrian’dan alır
- Programlar, tanınan 20 renkten oluşan grafiklerden ibarettir ve yürütücü renk blokları arasında ilerlerken renk değişim miktarını komut olarak yorumlar
- Tüm veriler yalnızca tamsayı olarak bulunur ve stack üzerinde saklanır; renk bloğunun boyutu bir değerdir ama
pushkomutu olmadan stack’e otomatik olarak eklenmez - Akış kontrolü Direction Pointer ve Codel Chooser ile, ayrıca siyah bloklar, kenarlar ve beyaz blok kurallarıyla belirlenir; bazı davranışlar uygulamaya göre değişebilir
- Örnekler ve harici araç ekosistemi bulunsa da yetkili bir resmi yorumlayıcı yoktur; hata işleme ve standart dışı renk yorumları da uygulama bağımlı kalır
Piet’in temel fikri
- Piet, program kodunun soyut sanat gibi görünmesini amaçlayan bir programlama dilidir
- Adı, geometrik soyut sanatın öncülerinden Piet Mondrian’dan gelir
Mondrianadını kullanmak istemişti ancak aynı isimde başka bir betik dili zaten olduğu için Piet adı kullanıldı- Spesifikasyon yazıldıktan sonra küçük bir topluluk oluştu ve programlar, yorumlayıcılar, IDE’ler ve derleyiciler üretildi
- Yetkili bir resmi yorumlayıcı yoktur ve kullanılabilir uygulamalar spesifikasyonu kısmen farklı yorumlayabilir
- Spesifikasyona bazı ek açıklamalar yapılmış olsa da mevcut uygulamaların bir kısmı bunları izlemiyor olabilir
Renkler ve kod birimleri
- Piet toplam 20 renk kullanır
- 18 renk, renk döngüsü ve parlaklık döngüsüne dahildir
- Beyaz ve siyah bu iki döngüye dahil değildir
- Renk döngüsü
red -> yellow -> green -> cyan -> blue -> magenta -> redsırasını izler - Parlaklık döngüsü
light -> normal -> dark -> lightsırasını izlerlight,darktan bir kademe daha koyu sayılabildiği gibi bunun tersi de geçerlidir
- Turuncu veya kahverengi gibi standart dışı renkler kullanılabilir ama etkileri uygulamaya bağlıdır
- En basit durumda standart dışı renkler beyaz gibi işlenir
- Başka bir olasılık da siyah gibi işlenmeleridir
Codel ve renk blokları
- Piet kodu, tanınabilir renklerden oluşan bir grafiktir
- Tek tek kod pikselleri dilsel anlam taşıdığı için, okunabilirlik amacıyla büyütülmüş programlarda koddaki tekil piksele codel denir
- Temel yürütme birimi renk bloğudur
- Renk bloğu, aynı renkteki codel’lerin yukarı, aşağı, sağ ve sol yönlerde bitişik olduğu alandır
- Yalnızca çaprazdan temas eden bloklar bitişik sayılmaz
- Renk blokları herhangi bir şekle sahip olabilir ve içinde başka renklerden boşluklar barındırabilir
- İç boşluklar o bloğun parçası değildir
Stack ve değer gösterimi
- Piet tüm veri değerlerini stack üzerinde saklar
- Veri değerleri yalnızca tamsayıdır
- Komuta bağlı olarak Unicode karakter değeri olarak giriş yapılabilir veya çıktı verilebilir
- Stack kavramsal olarak sonsuz derinliktedir ama uygulamalar sonlu bir azami stack boyutu koyabilir
- Sonlu stack’te taşma oluşursa bu bir çalışma zamanı hatasıdır ve nasıl ele alınacağı uygulamaya bağlıdır
- Siyah ve beyaz dışındaki renk blokları, o bloktaki codel sayısına eşit bir tamsayı değeri temsil eder
- Pozitif olmayan tamsayılar doğrudan temsil edilemez
- Ancak işlemler yoluyla üretilebilirler
- Renk bloğu değeri stack’e otomatik olarak push edilmez; açık bir
pushkomutu gerekir
- Tamsayı boyutu da kavramsal olarak sonsuzdur ama uygulamalar sonlu bir azami tamsayı boyutu koyabilir
- Tamsayı taşması bir çalışma zamanı hatasıdır ve nasıl ele alınacağı uygulamaya bağlıdır
Yürütme akışı
- Yorumlayıcı yürütmeye, programın sol üst codel’ini içeren renk bloğunda başlar
- Yürütme sırasında iki durum bilgisi korunur
- Direction Pointer (DP): başlangıçta sağa bakar ve sağ, sol, aşağı veya yukarı yönlerinden birini gösterir
- Codel Chooser (CC): başlangıçta sola bakar ve sol veya sağ seçeneklerinden birini gösterir
- Bir sonraki hareket hedefi, mevcut renk bloğunun sınırı ile DP ve CC birleşimine göre belirlenir
- DP yönünde en uzakta olan mevcut renk bloğu kenarı bulunur
- O kenarda, DP ilerleme yönüne göre CC tarafında en uzakta kalan codel seçilir
- O codel’den DP yönünde hemen sonraki codel’in ait olduğu renk bloğuna geçilir
- Bu süreç tekrarlanır; sonlanma koşuluna ulaşıldığında program biter
Siyah bloklar, kenarlar ve beyaz bloklar
- Siyah renk blokları ve program kenarı, yürütme akışını durduran engeller olarak davranır
- Yorumlayıcı siyah bloğa geçmeye çalıştığında veya kenarın dışına çıkmak istediğinde durur ve CC’yi değiştirir
- İkinci deneme de başarısız olursa DP saat yönünde bir kademe döndürülür
- CC ve DP sırayla değiştirilerek toplam 8 denemeden sonra da mevcut renk bloğundan çıkılamazsa program sona erer
-
Beyaz blokta hareket
- Beyaz renk blokları, yorumlayıcının engellenmeden içinden geçtiği serbest alanlardır
- Bir renk bloğundan beyaz alana geçildiğinde yorumlayıcı, DP yönünde düz ilerleyerek beyaz olmayan bir renk bloğuna ulaşana kadar devam eder
- Beyaz blok üzerinden yeni renge geçerken komut çalıştırılmaz
- Bu özellik sayesinde beyaz bloklar, komut çalıştırmadan mevcut rengi değiştirebildiği için döngü yazımında yararlıdır
- Beyaz blok içinde hareket, beyaz olmayan renk bloklarında çıkış seçme prosedürünü kullanmaz; yalnızca düz ilerleme yapılır
-
Beyaz blokta engellenince
- Beyaz blok içinde düz ilerlerken siyah blok ya da kenarla karşılaşılırsa bu bir kısıta takılma olarak değerlendirilir
- Bu durumda CC değiştirilir ama gidilmek istenen konum değişmediği için DP hemen saat yönünde bir kademe döndürülür
- Ardından mevcut beyaz codel’den yeni DP yönünde yeniden düz ilerlenir
- Beyaz blok içinde her engelle karşılaşmada CC değiştirme ve DP döndürme tekrarlanır
- Bir renk bloğuna girilirse yürütme sürer; beyaz blok içinde yol geri izlenmeye başlanırsa çıkış yolu kalmadığından yürütme sona erer
Komut sistemi
- Piet komutları, bir renk bloğundan sonraki renk bloğuna geçerken oluşan renk değişimi ile belirlenir
- Renk döngüsünde kaç adım ilerlenildiği ve parlaklık döngüsünde kaç adım geçildiği komutu belirler
- Beyaz blok üzerinden yapılan renk geçişlerinde komut çalıştırılmaz
-
Stack ve aritmetik komutları
push: Az önce çıkılan renk bloğunun değerini stack’e eklerpop: Stack’in en üstündeki değeri çıkarıp ataradd: En üstteki iki değeri toplar ve sonucu yeniden stack’e koyarsubtract: İkinci değerden en üstteki değer çıkarılır ve sonuç stack’e konurmultiply: En üstteki iki değeri çarpardivide: İkinci değer, en üstteki değere bölünerek tamsayı bölmesi yapılır- 0’a bölme, uygulamaya bağlı bir hatadır; komutun yok sayılması önerilir
mod: İkinci değerin en üstteki değere bölümünden kalan kalanı stack’e koyar- Sonuç, bölenle yani stack’in en üstündeki değerle aynı işarete sahiptir
- En üstteki değer 0 ise bu bir 0’a bölme hatasıdır; komutun yok sayılması önerilir
- Negatif bölünenler için
mod, Wikipedia’daki modulus operation maddesinde anlatılan floored division ile aynıdır
-
Karşılaştırma, gösterici, giriş/çıkış komutları
not: Stack’in en üstündeki değer 0 değilse 0’a, 0 ise 1’e çevrilirgreater: İkinci değer, en üstteki değerden büyükse 1; değilse 0 stack’e konurpointer: Stack’in en üstündeki değer alınır ve DP bu sayı kadar saat yönünde döndürülür- Negatifse saat yönünün tersine döndürülür
switch: Stack’in en üstündeki değer alınır ve CC bu sayı kadar değiştirilir- Negatifse mutlak değeri kadar değiştirilir
duplicate: Stack’in en üstündeki değerin kopyasını stack’e eklerroll: En üstteki iki değer alınır ve stack’in kalan kısmının bir bölümü belirtilen derinlik ve tekrar sayısı kadar döndürülür- Derinlik negatifse bu bir hatadır ve komut yok sayılır
- Uygulamaya bağlı azami stack derinliğini aşan
roll, uygulamaya bağlı bir hatadır; komutun yok sayılması önerilir in: STDIN’den sayı veya karakter okuyup stack’e ekler- Girdi yoksa ya da tamsayı girdisinde tamsayı okunamazsa bu bir hatadır ve komut yok sayılır
out: Stack’in en üstündeki değeri sayı ya da karakter olarak STDOUT’a yazar- Yetersiz stack değeri nedeniyle gerçekleştirilemeyen işlemlerde komut yok sayılır ve bir sonraki komuta geçilir
Örnekler ve araçlar
- Piet örnekleri Sample programs sayfasında görülebilir
- Harici yorumlayıcılar ve geliştirme araçları Third-party Piet interpreters and development tools sayfasında listelenmiştir
1 yorum
Hacker News yorumları
Örnekler sayfasındaki son program gerçekten şaşırtıcı: Piet adında biri, Piet dilini akla getiren bir sanat eserini görüp çalıştırmayı denemiş
Çalışmış; bu da muhtemelen bir grafik sanatçısının tesadüfen çalışan bir bilgisayar programı çizdiği tarihteki ilk örnek olabilir
https://www.dangermouse.net/esoteric/piet/samples.html
https://gitlab.fabcity.hamburg/hofalab/piet-get-together
https://www.mcmillen.dev/sigbovik/
Piet eserin fotoğrafını çekip Piet paletine yakın renklerle düzenlenmiş bir görüntü dosyasına dönüştürdükten sonra çalıştırmış; gerçekten çalışmış ve kod, ASCII karakterlerini okuyup ilgili ASCII sayısal değerini yazdıran sonsuz bir döngüymüş
Bu gerçekten inanması güç bir şey
“Elbette daha büyük bir program kullanırsanız daha doğru bir değer elde edebilirsiniz” açıklaması bana daha önce görmediğim türden bir şaka gibi geldi
Belirtime göre yorumlayıcı, mevcut beyaz codel’den yeni yöndeki DP ile kaymaya başlamalı ve bir renk bloğuna girene ya da başka bir sınıra rastlayana kadar ilerlemeli
Ama npiet yorumlayıcısı boşluğa baktıktan sonra son renkli codel konumuna geri sarıyor. Bir gün bu davranışı Piet derleyicimin lexer’ına bir seçenek olarak eklemek istiyorum ama henüz el atmadım
Belirtime uyulursa, o program neredeyse tüm blokların uç köşeleri beyaza bitişik olduğu için basit bir sonlanmayan döngüye dönüşüyor. Birden fazla yorumlayıcı ve derleyiciyi hedefleyen karmaşık Piet programları yazmak epey zor; hepsinde belgelenmemiş ince yorum farkları var
Kendi Piet backend çıktımın genel olarak yorumlayıcıya daha az bağımlı olduğunu düşünüyorum, ama ayrıntılı incelediklerim yalnızca üç dört başka yorumlayıcı
https://github.com/boothby/repiet/
Belgeleri hızlıca tarayınca, “yığından çıkarılacak yeterli değer olmadığı için gerçekleştirilemeyen işlemler gibi yapılamayan işlemler sadece yok sayılır ve bir sonraki komutla devam edilir” koşulu nedeniyle bu tür görüntülerin hepsi hatasız çalışabilir gibi görünüyor
Tabii bu rastgele görüntülerden ne kadarının gerçekten “anlamlı” bir şey yaptığı ayrı mesele
Piet, ezoterik programlama dilleri arasında kilometre taşı niteliğinde bir deney olsa da, geliştirici gerçekten özellikle uğraşmadıkça programı Mondrian tablosu gibi gösterme hedefine ulaşamadığını düşünüyorum
Dil yapısının kendisi, ne “yazarsanız” yazın Mondrian tablosu gibi görünecek şekilde tasarlanmış olsa iyi olurdu
Aklıma hep şu soru geliyor: Algoritma neye benzer?
Herman Hesse'nin The Glass Bead Game romanındakine benzer bir şeyi gerçek hayatta yapabilir miyiz? Özgün adı Magister Ludi
Görsel yönelimli biri olarak bunun mümkün olduğuna inanmak istiyorum; hatta gerçekten böyle araçlar da denedim
https://community.carbide3d.com/uploads/default/original/3X/5/b/5b0872a5666fec9b7bb6fd623c431de03263372d.jpeg
Ama yukarıdaki soruya net bir yanıt yoksa, bu tür araçlar her zaman şuna dönüşme riski taşıyor
https://blueprintsfromhell.tumblr.com/
https://scriptsofanotherdimension.tumblr.com/
Görsel ifade gücü ile modülerlik arasında denge kurmak da zor; modülerliği zorlayınca, kaçınmaya çalıştığımız metin bariyerine çok kolay geri dönülüyor
Sergei Lewis ve ben ayrı ayrı Piet kodu üreten araçlar yaptık. Sergei'nin assembler'ı, benim Piet backend'imden çok daha güzel görünen kod üretiyor
Benim derleyici çıktımda gerçekten görünen şey, trampoline'i ne kadar tembelce kullandığım
http://www.toothycat.net/wiki/wiki.pl?MoonShadow/Piet
https://github.com/boothby/repiet/
https://en.wikipedia.org/wiki/Trampoline_(computing)
Steven Pinker'ın kitabını okurken edindiğim bir düşünce: soyut sözcükler daha basit sözlere ayrılabiliyor ve sonunda bir tür uzamsal ilişkiyi anlatıyor. Örneğin “rekindle”, “iki şeyi yeniden bir araya getirmek” olarak görülebilir
Benzer şekilde for döngüsü de “bir şeyin başka birçok şeyin üzerinden geçmesi” şeklinde zihinsel bir kavram ve bunun “100” -> “010” -> “001” gibi görsel bir temsili var
O halde bu yapı taşlarını saf görsel dönüşümler olarak tanımlayan bir dil yapılıp yapılamayacağını merak ediyorum
Böyle bir şey, bir suç geriliminde kahramanı ya da dedektifleri tıkayıp bırakan, sonra birinin bunun kod olduğunu fark ettiği sahneye çok yakışırdı
QR kodların işe yarayan tek şey olduğunu sanıyordum oysa
Biri Piet ile bir quine yapmış: http://mamememo.blogspot.com/2009/10/piet-quine.html?m=1
Yazıdaki görsel bozulmuş ama bir kopyası burada var: https://codegolf.stackexchange.com/a/23255/103045
Piet'i keşfetme anı; hayranlık, kafa karışıklığı ve şaşkınlığın karıştığı özel bir an
Benim durumumda, arkadaşım Oz ile yaptığım bilgisayar bilimi podcast'i “The CS Primer Show”daki şu konuşmada yer alıyor: https://show.csprimer.com/episodes/e2-dont-let-a-gpt-have-all-the-fun
Üniversitede ezoterik programlama dilleri üzerine küçük bir dersimiz vardı
Herkesin Brainfuck, Piet gibi dillerden birini seçip onunla oynaması gerekiyordu; ben Piet'i seçtim ve epey keyif aldım
Açıkçası yaptığım küçük örnek uygulama estetik açıdan pek harika değildi; Piet ile sanat yapmak için Piet uzmanı olmak gerekiyor gibi
Örnekler sayfası harika
Tuvalin giderek daha rafine ve hoş görünümlü hale nasıl evrildiğini görebiliyorsunuz
https://www.dangermouse.net/esoteric/piet/samples.html
“light, dark'tan bir kademe daha koyu kabul edilir” demek; oldukça derin
Python ya da daha az ezoterik başka dillerdeki kodu alıp Piet olarak çıktılamayı öğrenen bir autoencoder yapılabilse harika olurdu
Böylece Stable Diffusion'a benzer şekilde rastgele algoritmalar da üretilebilir gibi