2 puan yazan GN⁺ 2024-01-15 | 1 yorum | WhatsApp'ta paylaş

K diliyle düşünmek

  • K programlama çoğunlukla REPL üzerinden yapılır.
  • ngn/k için rlwrap, ok tuşlarıyla geçmişte gezinmeyi sağladığı için büyük programlar geliştirmede kullanışlıdır.
  • Fonksiyonlar REPL'de test edildikten sonra gerçek koda taşınır.
  • ngn/k'nin güzel çıktısı her zaman geçerli K verisi döndürür ve programı hızlandırmak için önceden hesaplanabilir.
  • K betikleri, REPL'e girilmiş gibi çalıştırılır ve her satırın dönüş değeri, noktalı virgülle bitmediği sürece yazdırılır.
  • Betikler çok satırlı tanımlara izin verir; bu da okunabilirliğe yardımcı olur.
  • Çalışmanızı bir betiğe kaydedip REPL'de kullanmak için \lfile.k komutuyla dosyayı çalıştırıp verileri yükleyebilirsiniz.
  • Önceki verilerin üzerine yazmak için dosyayı REPL'e birden fazla kez yükleyebilirsiniz.
  • \ ile erişilen REPL yardımında çeşitli kullanışlı komutlar bulunur.

Dizi programlamayı sadeleştirmek

  • Dizi programlama, karmaşık kalıpları daha küçük, bildirimsel ve okunması daha kolay kalıplara sadeleştirmenin sürekli bir sürecidir.
  • Karmaşık kalıpların nasıl sadeleştirileceği, "APL'de Kalıplar ve Antipattern'ler: Başlangıç Plato'sundan Çıkış - Aaron Hsu - Dyalog '17" içinde ayrıntılı olarak ele alınır.

Matris çarpımının K'ye dönüştürülmesi

  • Wikipedia makalesinden alınan matris çarpımı için yinelemeli algoritma, K'ye doğrudan çevrilebilir.
  • K'ye çevrilmiş en kötü kod örneği, çok sayıda global değişken ataması, iç içe döngüler ve çok sayıda değişiklik gerektirir.
  • Kodu sadeleştirerek bu sorunları tek tek çözebilirsiniz.

İç döngünün sadeleştirilmesi

  • İç döngüde sum, fold(/) kullanılarak sadeleştirilebilir.
  • ' (each) bir dizi döndürdüğü için C global değişkeni kaldırılabilir.
  • i, j, k değişkenleri kaldırılarak döngü sadeleştirilebilir.

Döngüleri kaldırmak ve global değişkenleri en aza indirmek

  • k olmadan doğrudan satır ve sütunları eşleştirerek orta döngü kaldırılabilir.
  • j'yi kaldırmak için B'nin her sütunu A[i] ile eşleştirilebilir.
  • i'yi kaldırmak için eachleft kullanılarak A'nın her satırı, B'nin her sütunuyla eşleştirilebilir.
  • Artık global değişkenlere gerek yoktur.

Matris çarpımı fonksiyonunun son hali

  • + (transpose) maliyetli olduğundan kaldırılabilir.
  • x'in her satırını y'nin her sütunuyla çarpmak yerine, B'nin her satırı tüm A ile eşleştirilerek örtük olarak aynı işlem yapılabilir.
  • Sonuçta kısa ve açık bir matris çarpımı fonksiyonu elde edilir.
  • Kodu sadeleştirme süreci başlangıçta birçok adımdan geçse de, K'de ustalaştıkça daha kolay ve sezgisel hale gelebilir.
  • Matris çarpımı, K'nin dizi desteğiyle iyi örtüşen basit bir prosedürdür.
  • K ile daha az uyumlu başka algoritmalar ve bunların nasıl ele alınacağı gelecekteki bölümlerde incelenecektir.

GN⁺ görüşü

  • Bu yazı, K dili kullanılarak matris çarpımı gibi algoritmaların nasıl sadeleştirilebileceğini ve optimize edilebileceğini gösteriyor.
  • REPL üzerinden alınan anlık geri bildirim ve kodun yinelemeli olarak iyileştirilmesi, K programlamanın temel özelliklerindendir ve giriş seviyesindeki yazılım mühendisleri için de yararlı bir öğrenme yöntemidir.
  • Kodu sadeleştirme süreci, programlama becerilerini geliştirmede önemlidir ve bu yazı bunu somut örneklerle anlaşılır biçimde açıklar.

1 yorum

 
GN⁺ 2024-01-15
Hacker News görüşleri
  • Birçok kişi dizi dillerinin kullanışlılığı ve anlaşılabilirliği konusunda şüphelerini dile getiriyor.

    • Dizi dilleri her probleme uygun değil.
    • Birçok problem türünde şaşırtıcı derecede yetkinler.
    • Dizi dili kullanıcıları genelde çok zeki oluyor.
    • Dizi dillerinin nasıl çalıştığını öğrenmek büyük bir meydan okuma.
    • Dizi dillerinde "prosedürel" kod yazmak çok kötü bir şey.
    • Örtük programlamayı (tacit programming) anlamak, zihni genişleten harika bir deneyim.
    • Fiil zincirlerini (verb trains) içselleştirmenin nasıl bir deneyim olduğu.
    • Dizi tabanlı dillerin her boyuttaki dizileri nasıl ele aldığını anlamak.
    • "under"ın nasıl çalıştığını anlamak.
    • Fonksiyon üslerinin (function exponents) nasıl çalıştığını anlamak.
  • Dizi dillerinin şaşırtıcı birçok yönü var ve yukarıdaki liste bunların yalnızca bir kısmı.

    • Aaron Hsu'nun paralel bir APL derleyicisi geliştirirken izlenmesi, dizi dillerinin gerçek potansiyeline ikna olmaya yol açtı.
    • APL kodunun "anlamsal yoğunluğu" (semantic density) üzerine bir tartışma.
  • Dizi programlamayı daha önce duymadıysanız ve bir giriş istiyorsanız, "The Array Cast" öneriliyor.

  • 70'lerde APL/APL2 ile tanışıp hayran kalındı, ancak işlevleri birleştirme yeteneği daha çekici bulundu.

    • Haskell saf ve tipli olduğu için APL'den daha eğlenceli ve daha güçlü.
    • APL'nin "düşünce aracı olarak gösterim" yaklaşımı, aşırı kısalığı meşrulaştıran bir mantık gibi görünüyor.
  • Dizi dili kullanırken en önemli farkındalıklar:

    • Fiiller algoritmadır.
    • Fiillerin (veya zarfların) ardışıklığı, şimdiye kadar kullanılan en doğrudan bileşim biçimidir.
    • Program, cümleler ve ifadeler kümesi değil, algoritmaların bileşimidir.
    • Alan ve değer kümesini diziler, map'ler ve fonksiyonlar boyunca tutarlı ele alma kavramı.
    • Kodu okurken gözlerin "zıplaması" gerekmeyen soldan sağa değerlendirme.
    • Kodu veriye göndermek mümkündür ve tercih edilir.
    • K dilinin ek avantajları: görünümler (yani bağımlılıklar) doğrudan uygulanabilir ve yorumlayıcı üzerinden hot code loading yapılabilir.
  • Dizi dilleriyle ilgili bir soru: "N'den küçük sayılar içinde P koşulunu sağlayan tüm sayıları bul" gibi işler nasıl yapılır?

    • Dizi dillerinde genelde 1'den N'ye kadar bir dizi üretilir, dizi üzerinde koşul test edilir ve ardından yalnızca koşulu sağlayan öğeleri almak için bir maske uygulanır.
    • N büyükse ve koşul sık sağlanmıyorsa, gereksiz yere çok sayıda geçici dizi oluşturmak bellek ve kaynak israfı gibi görünüyor.
    • Dizi dili uygulamaları bu sorunları optimize edebilir ya da lazy evaluation gibi tekniklerle çözebilir.
  • J diliyle ilgili deneyim: dizi dili paradigması önyargılı ve her problemi dizilerin iç içe geçmesi olarak düşünmenin gerçekten yardımcı olup olmadığı belirsiz.

    • Problemi basitleştirebilecek veri yapılarını özgürce oluşturmak, algoritma kısmını büyük ölçüde sadeleştirebilir.
    • APL/J/K kullanmak için bu önyargı nedeniyle daha zeki olmak gerekiyor.
  • K dili problemlerini çözerken edinilen izlenim: K dili kasıtlı olarak anlaşılmaz.

    • Bulmacalar ve zekice çözümler için uygun bir dil, ancak Python'da numpy dizileriyle çalışmak dizi dillerini öğrenmeyi ve dizilerle düşünmeyi öğretir.
  • J diline bir örnek: dot =: +/ . * kullanılarak P ve Q'nun nokta çarpımı (dot product) hesaplanır.

  • K dilinin sözdizimi daha kısa, ancak K dilinin nasıl çalıştığına dair birçok yerleşik bağlamı zihinde tutmak gerekiyor.