4 puan yazan GN⁺ 2024-04-25 | 1 yorum | WhatsApp'ta paylaş
  • 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 push komutu 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
  • Mondrian adı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 -> red sırasını izler
  • Parlaklık döngüsü light -> normal -> dark -> light sırasını izler
    • light, 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 push komutu 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 ekler
    • pop: Stack’in en üstündeki değeri çıkarıp atar
    • add: En üstteki iki değeri toplar ve sonucu yeniden stack’e koyar
    • subtract: İkinci değerden en üstteki değer çıkarılır ve sonuç stack’e konur
    • multiply: En üstteki iki değeri çarpar
    • divide: İ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 çevrilir
    • greater: İkinci değer, en üstteki değerden büyükse 1; değilse 0 stack’e konur
    • pointer: 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 ekler
    • roll: 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

1 yorum

 
GN⁺ 2024-04-25
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

    • “Çalışan” koşulunu yeterince gevşek tutarsanız, çoğu boya sıçratmasının zaten geçerli bir Perl programı olduğu gösterilmişti
      https://www.mcmillen.dev/sigbovik/
    • Piet J., küçük bir galeride bir sanat eserine bakarken bunun bir Piet programına benzediğini düşünmüş; sanatçı ise bu dili hiç bilmediğini söylemiş
      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
    • π hesaplayan örnek de güzeldi
      “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
    • Ne yazık ki bu, npiet ile mevcut Piet belirtimi arasındaki bir farka dayanıyor
      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/
    • Böyle basit bir çizimin, yani birkaç büyük dikdörtgen bloktan oluşan bir görselin geçerli bir program olma olasılığının ne kadar olduğunu merak ediyorum
      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

    • Öyle ama Mondrian aslında çoğunlukla ana renkleri kullandığı için bu epey kısıtlayıcı 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

    • Piet'i elle yazmayı denerseniz, “algoritma neye benzer” sorusunu keşfetmenin eğlenceli bir tarafı var
      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)
    • Her algoritmanın, hatta her zihinsel kavramın görsel bir temsil ile bire bir ilişkisi olduğuna inanıyorum
      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
    • Basit bir program için, sembolleri renkler olan bir Turing makinesi gerçekleştirdiğimizi hayal etmek bile mümkün
  • 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