Λ-2D: Bir programlama dili olarak çizimi keşfetmek
(media.mit.edu)- λ-2D, çizimin kendisini kod olarak alan bir dil deneyi; metin tabanlı dillerin ele almakta zorlandığı görsel ifadeleri ve programların estetik biçimini birlikte hedefliyor
- Dilin iskeleti lambda calculus; belirli bir yürütme sırasından çok değerlendirmeye yakın yapısının, bir çizime bakma biçimine benzemesinden yola çıkıyor
- Hem elle çizmesi kolay hem de makinelerin yorumlayabileceği şekilde veri akışını ifade etmek için ızgara tabanlı semboller ve kablolar kullanıyor
- Saf lambda calculus tek başına düşük kullanılabilirliğe sahip olduğundan sayılar, matematik operatörleri, çerçeveler ve kaydırıcılar gibi sözdizimsel şeker ve etkileşim öğeleri eklenmiş
- Mevcut uygulama, λ-2D programlarını tek bir JavaScript ifadesine dönüştürüp çalıştırıyor; ancak hâlâ devre şeması gibi görünme sınırı ile öğrenme ve tarama zorlukları var
Çizimle kodlama yapan bir dil deneyi
- λ-2D, “çizim aracılığıyla kod yazılabilir mi?” sorusundan yola çıkan dilsel olmayan bir programlama dili deneyi
- Metin dışı dil yaklaşımlarının halihazırda birkaç farklı türü var
- Tasarım hedefleri üç başlıkta özetleniyor
- Programın çiziliyor olmasını kullanarak metin tabanlı dillerle gerçekleştirmesi zor özellikler eklemek
- Komut sayısının çok az olup basit programları bile zorlaştırdığı ya da çok fazla olup minimal olmaktan çıktığı ve bilgisayarlı görüyle işlenmesini zorlaştırdığı durumlardan kaçınmak
- Programın kendisinin görsel açıdan çekici, çerçeveletilip duvara asılmak istenecek kadar bir çizim olmasını sağlamak
Lambda calculus ve ızgara tabanlı temsil
- λ-2D, buyurgan ve düşük seviyeli bir yaklaşım yerine dili lambda calculus üzerine kuruyor
- Lambda calculus, “yürütme”den çok “değerlendirme”ye yakın; bu da bir çizime bakarken gözün belirli bir sıra olmadan nokta, çizgi, biçim ve kompozisyonu takip etme biçimiyle örtüşüyor
- İlk yapı ızgara tabanlı bir sistem
- Kullanıcı, birden fazla ızgarayı kesen kesintisiz çizgiler çizebiliyor
- Her ızgara nihayetinde sonlu bir sembol kümesinden biri olarak yorumlanıyor
- İnsanlar için çizmesi kolay, bilgisayarlar için ayrıştırması kolay bir uzlaşma sunuyor
Fonksiyon sembolleri ve kabloların veri akışı
- Lambda calculus’ün temel komutları yalnızca iki tane
- Fonksiyon uygulama
- Fonksiyon tanımı
- λ-2D, fonksiyon uygulamayı fincan biçimli bir sembolle, fonksiyon tanımını ise Yunan harfi λ ile temsil ediyor
- Temel lambda calculus’te olduğu gibi fonksiyon her zaman tek bir argüman alıyor ve tek bir çıktı üretiyor
- Birden fazla argümanla çalışmak için birden fazla fonksiyonu bağlayan currying yöntemi kullanılıyor
- Semboller arasındaki kablolar, verinin aktığı yollar gibi işlev görüyor
- Bu aşamadaki dil teknik olarak Turing-tam olsa da pratik kullanım çok zahmetli olduğundan sayılar ve matematik operatörleri gibi ek semboller dahil edilmiş
- Bu ek semboller sözdizimsel şeker niteliğinde
- İstenirse Church numerals gibi saf lambda calculus yapıları da kullanılabiliyor
Çerçeveler, çizim verisi ve kaydırıcılar
- λ-2D, Scratch’te sprite’ların aynı düzenleyicide çizilip hemen kullanılabilmesi deneyimini daha doğal biçimde genişletmeyi amaçlıyor
- Çerçeve, tuvalin belirli bir alanını kabloyla çevreleyip sol üste bir gösterim sembolü koyma yöntemi
- Alanın içindeki karalamalar veri olarak kullanılabiliyor
- Matematiksel bir fonksiyonun biçimi doğrudan eskizlenip animasyonlarda vb. kullanılabiliyor
- Denklem bulmaya yönelik ayrı bir adım olmadan biçim veri olarak ele alınıyor
- Çalışma zamanında sürüklenebilen kaydırıcılar da eklenmiş
- Programı parametrelerle kontrol etmek için kullanılıyor
- Gelecekte başka GUI öğeleri de değerlendiriliyor
Düzenleyici ve 5×5 semboller
- İlk fikir, noktalı bir deftere elle çizilmiş örnek programlardan doğdu
- Kağıt üzerindeki programları tarayacak bilgisayarlı görü kısmı hazır olmadığı için önce programların dijital olarak çizilebildiği basit bir düzenleyici geliştirildi
- Her sembol, ızgara tuvale kolayca yerleştirilebilmesi için 5×5 pikselden oluşuyor
- Kullanıcı, kalem aracıyla olduğu gibi serbest el çizimleri de yapabiliyor
- Geçici bir çözüm olarak başlayan düzenleyici giderek daha çok özellik barındıran bir düzenleyiciye yaklaşıyor
Saf fonksiyonel dilde çıktı sorunu
- λ-2D saf fonksiyonel ve durum bilgisiz olduğu için alışıldık bir
printifadesini uygulamak zor - Çıktı, durum değişikliği anlamına gelir; belirli bir sırayla çıktı üretilmesini beklemek için ifade değerlendirme sırasını da varsaymak gerekir
- Çözüm, “çıktı”yı fonksiyonel biçimde yeniden tanımlamak
- Boş bir tuvali fonksiyona vermek
- Metin ya da istenen karalamaya benzeyecek şekilde pikselleri değişmiş yeni bir tuval geri almak
- Dil, dizgeler ve karakterler yerine tuval ve pikselleri merkeze alacak şekilde tasarlanıyor
JavaScript’e dönüştürme ve yürütme görselleştirmesi
- Temel ayrıştırıcı, λ-2D programının tamamını eşdeğer bir JavaScript ifadesine dönüştürüyor
- Ortaya çıkan JavaScript, çok fazla parantez içeren tek bir dev ifade; verimsiz olsa da çalışıyor
- Mevcut ayrıştırıcı JavaScript çıktısı üretiyor ve yürütmeyi tarayıcının JavaScript motoru üstlendiği için gerçek yürütme sürecini görselleştirmek zor
- Buna karşılık ayrıştırma süreci kolayca görselleştirilebiliyor ve bir tree-walk yorumlayıcının programı yürütürken izlediği yola benzer görünebiliyor
- Ayrıştırma animasyonuna her sembol için ses eklenirse program yürütmesi bir şarkı gibi “duyulabiliyor”
- Sonuç, 8-bit döneminden tuhaf bir bilgisayar oyunu sesine benziyor
- Çevrimiçi demo içindeki
Menu > Program > Animated Runbölümünden görülebilir
Kalan sınırlar ve sonraki adımlar
- λ-2D başlangıçta, programları kalem ve kağıtla çizip artırılmış gerçeklikle etkileşimli geri bildirim almayı amaçlayan daha büyük bir araştırmanın parçası olarak başladı
- Proje giderek ilginç hale geldikçe bağımsız bir projeye dönüştü
- İlk hedefleri tam olarak karşılamış değil
- Programlar çizimden çok devre şemasına benzeme eğiliminde
- Sıradan insanların öğrenmesi kolay olur mu, emin olmak zor
- Bilgisayarlı görü sisteminin hatasız tarama yapması da kolay olmayabilir
- λ-2D daha da iyileştirildikten sonra, çizimi hesaplama olarak ele alan sisteme entegre edilebilecek başka programlama dilleri de tasarlamayı planlıyorlar
- λ-2D beta sürümü çevrimiçi olarak denenebilir; ayrıştırıcı ve düzenleyicinin kaynak kodu yakında GitHub’da yayımlanacak
1 yorum
Hacker News görüşleri
Eğer bu tür şeyler hoşunuza gidiyorsa, otomasyon proje mühendisi işi de size eğlenceli ya da en azından tanıdık gelebilir
Fonksiyon blok diyagramları (FBD) oldukça benzer; fonksiyon blokları çizgilerle birbirine bağlanır ve işlem sırası blokların sırasıyla tanımlanır. Blokların kendisi motorun yerleşik fonksiyonları gibi olabilir ya da bileşik bloklar olabilir. Diyagram her kontrol döngüsünde bir kez çalıştırılır ve genelde atlama bloğu yoksa, giriş değişmiş olsun ya da olmasın her blok her kontrol döngüsünde tam olarak bir kez yürütülür
Bira üretim tesislerinden petrokimya tesislerine kadar kontrol mantığı bu şekilde uygulanır. FBD tabanlı kontrol sistemlerinin UI tarafında çalıştığım için bunlarla her gün karşılaşıyorum
BitGrid[1] ile benzer ama aynı değil. FPGA'nın aşırı basitleştirilmiş bir hali gibi; bitlerin bir ızgara üzerinde paralel biçimde ilerlediğini hayal ediyorum
Bu fikir son derece pratik, yani kitleler için petaflops olabilir de olmayabilir de; sonuçta ASIC'te tek bir DFF'nin ne kadar enerji tükettiğine bağlı. Uzun zamandır aradığım sayılar statik güç ve tek bir biti yüklemenin enerjisi
Programlama modeli de sorun. Kimse mantığı doğrudan ızgara üzerine yerleştirmek istemiyor; herkes mümkün olan en kısa sürede soyutlamaya gitmek istiyor. O kısmı çözmeye yetecek kadar odaklanamadım
Bunu araştırırken Von Neumann hücresel otomatı[2] ve Nobili hücresel otomatları[3] ile karşılaştım; onlarca yıldır benzer fikirlere ilgi duymama rağmen bunları ilk kez görüyorum. Bilgisayar biliminin bu alanının keşfedilebilirliğinin bu kadar düşük olması sinir bozucu
İkisi de aynı absürt temeli paylaşıyor. Bir FSA kümesi sonsuz büyüklükte bir hücre uzayı tanımlıyor ve tüm FSA'ler aynı durum geçiş fonksiyonuna ya da kural kümesine sahip. İşte tam da bu tek “basitleştirme” yüzünden sanki code golf alanına itilmiş gibi geliyor
[1] https://github.com/mikewarot/Bitgrid
[2] https://en.wikipedia.org/wiki/Von_Neumann_cellular_automaton
[3] https://en.wikipedia.org/wiki/Nobili_cellular_automata
Eğer birileri BitGrid fikrini devam ettirmek isterse memnun olurum
“Teknik olarak bu noktada dil Turing-tam, ama kullanması o kadar acı verici ki tasarım kuralım #2'yi ihlal ediyor” kısmında, benim Lambda Diagrams[1] 1. adımda kaldı
O sayfanın altında bildiğim diğer tüm grafik lambda kalkülüsü gösterimleri bağlantılanmış durumda ve az önce bunu da ekledim
[1] https://tromp.github.io/cl/diagrams.html
Artık tarayıcıya “bana göre hepsi Yunanca!” dedirten bir dil yaptığını iddia edebilirsin; bence bu oldukça havalı bir başarı
Yüksek çözünürlüklü ekranlar ortaya çıktığında, 90'larda bunları zaten geride bırakmıştık
https://worrydream.com/AlligatorEggs/
Bu tür şeyler LabVIEW'de de denendi ve ne kadar ileri götürmenin zor olduğu görüldü. Ses/müzik üretim yazılımlarında da yapıldı; Max [max] bunun atası sayılır
Bir şeyler üretilebiliyor ama çok çabuk dağınık hale geliyor. Güzel görünüyor mu derseniz, bence hayır
[max] https://en.wikipedia.org/wiki/Max_(software)
Karmaşık sinyal akışını takip etmek, özellikle gerçek zamanlı sayısal değerlerin animasyonlu olarak gösterildiği diyagramlarda, statik metin bloklarına göre görsel yerleşimle çok daha kolay
Son dönem Max/MSP'de ayrıca
mcde var; bu, aynı türden birçok sinyal için ayrı çizgi/düğüm oluşturma ihtiyacını ortadan kaldıran çok kanallı bağlantılar sağlıyor.~genve JavaScript ile metin tabanlı programlama düğümleri de mümkünBu tür “blok programlama dilleri” kara kutulaştırma yoluyla soyutlama yapıp kutuların içinde kutular oluşturduğu için umut verici görünüyor. Sorun kötü uygulama mı, kullanıcıların kullanamaması mı, yoksa paradigmanın kendisinde mi, merak ediyorum
Dikkate alınması gereken bir nokta, bunların genelde programlama ve soyutlamayı bilmeyen kişiler tarafından kullanılması. Programlamayı iyi bilen biri belki ortalığı bu kadar dağıtmazdı ama o zaman da doğrudan kod yazardı; bu yüzden durum biraz muğlak
LabVIEW'in berbat olduğu konusunda hemfikirim. Sadece bu sorun yüzünden değil; güncellemeler her şeyi bozuyor, lisans tarafı da öyle, kısacası tam bir baş ağrısı
Uzman LabVIEW geliştiricilerinden oluşan küçük bir topluluk vardı ve genel olarak çok okunabilir, iyi kod yazıyorlardı. Çoğu kişinin alışık olduğu yaklaşımdan farklıydı ama iyiydi
Yine de birkaç yıl önce o dünyayı bıraktım. Çünkü LabVIEW'in, ne yapılabiliyor olursa olsun, sonunda öleceğine dair işaretler çok açıktı
Yaklaşık 10 yıl önce Petri ağlarını ilk duyduğumdan beri grafiksel biçimsel belirtimlere ilgi duyuyordum
Korkutucu matematiksel gösterimler ve diller yerine grafiksel ifade olsa mühendislerin biçimsel yöntemleri daha iyi kullanacağını hep düşünürdüm. Ne yazık ki diğer mühendislere Petri ağlarını her gösterdiğimde ilgilerini neredeyse anında kaybettiler
University of York'ta doktorayı bırakmadan önce RoboChart ve RoboSim[1] diye bir şeyle uğraşıyordum; bunun aslında daha erişilebilir olabileceğini düşünüyorum. Yine de robotik semantiğine epey bağlı. Kişisel bir proje olarak RoboSim'i ağlar ve sunucu dünyasında daha faydalı olacak şekilde uyarlayıp genişletmeye çalışıyordum
[1] https://robostar.cs.york.ac.uk/robotool/
Bunu gerçekten çok sevdim. Özellikle JavaScript ile uygulanmış olması daha da güzel
Saflık tutkunları yataklarında ya da mezarlarında ters dönecektir ama en azından görselleştirme ve sesle ilgili sonraki adımları açıkça kolaylaştırmıştır. Görseller harika ve sonraki adım sanki mevcut programların üst düzey yapısını bir şekilde bu biçime çevirmek gibi görünüyor. Dijkstra algoritmasını ya da yapay sinir ağlarının geri yayılım algoritmasını duvara asmak için para verecek epey tuhaf tip çıkabilir
Eğlenceli kısım, dilin o kadar saf işlevsel ve tamamen durumsuz olması nedeniyle
printifadesinin uygulanamamasıydı. Çıktı üretmek durumu değiştiren bir şeydir ve çıktının belli bir sırayla gelmesini beklemek, ifadelerin belli bir sırayla değerlendirildiğini varsaymak anlamına gelirBu sadece “emirsel değil” demek değil mi? Yine de durumun nasıl kodlanacağını merak ediyorum. Değişkenler, mesela ikon+renk, eklenebilir ve tekil ifadeler bir eksene ya da iki eksene göre hizalanabilir belki
“Dil dışı programlama dili alanı keşfedilmemiş değil”
Daha ikinci cümlede agresif bir üçlü olumsuzlamayla başlıyor
1987 tarihli Wireworld'ü hatırlattı. Doğal olarak Wikipedia maddesi de var [1]
Wireworld ile yapılmış 8 bitlik bir sayaç görmüştüm ve oldukça etkileyiciydi. Ama bu biraz daha özlü görünüyor
[1]: https://en.wikipedia.org/wiki/Wireworld
Ama şu anda oynaması zor. Web sayfası[1] ve Steam sürümü Flash'a bağımlıydı, bu yüzden üçüncü taraf bir Flash yeniden uygulamasıyla uğraşmak gerekiyor
Yine de yarı iletken davranışını uygulama konusunda Wireworld'den çok daha iyi olduğunu düşünüyorum
[1] https://www.zachtronics.com/kohctpyktop-engineer-of-the-peop...
Çevrimiçi demo için doğrudan bağlantı: https://l-2d.glitch.me/
Benim bulduğum diğer çok görsel programlama ortamları/dilleri. Düğümleri çizgilerle bağlayan diğer görsel programlamalardan farklılar
Farklı şekilde sınıflandırılabilirler ama buna ne deneceğini bilmiyorum
Piet https://www.dangermouse.net/esoteric/piet.html
Turnstyle https://jaspervdj.be/turnstyle/ https://github.com/jaspervdj/turnstyle
Markovjunior https://github.com/mxgmn/MarkovJunior
Cellpond https://cellpond.cool/ https://github.com/TodePond/CellPond https://www.youtube.com/watch?v=xvlsJ3FqNYU
Imagegram https://zaratustra.itch.io/imagegram
Color Code http://colorcode.bananabanana.me/ https://www.youtube.com/watch?v=5M5hy9xsqKc Color Code 2 http://colorcode2.bananabanana.me/ https://www.youtube.com/watch?v=tTvvX4sjZWw Splaty Code http://splatycode.bananabanana.me/ https://www.youtube.com/watch?v=gd_e85lAKOs (Muril Polese tarafından yapılmış https://github.com/murilopolese/ http://gallery.bananabanana.me/)
Alchemy Online https://maxbittker.github.io/alchemy-online/ https://github.com/MaxBittker/alchemy-online