2 puan yazan GN⁺ 2024-11-29 | 1 yorum | WhatsApp'ta paylaş
  • Janet for Mortals, Janet programlama dilini ele alan ücretsiz bir çevrimiçi kitap; ancak bu değerlendirme kitabın kendisinden çok, web REPL’i ve örnek projeleri de içeren teknik kitap üretim sürecine odaklanıyor
  • Tüm çalışma 20 hafta sürdü; yalnızca yazım için öngörülen 12 haftayı aştı çünkü web sitesi, C++ binding’leri, tarayıcı demoları, CLI ayrıştırıcısı ve test araçları gibi ek işler eklendi
  • Kitabın web sitesi, CodeMirror ve Lezer gramerini kullanan yerleşik bir REPL sunuyor; otomatik tamamlama Janet ortamını WebAssembly ile sorguluyor ve (report) geri bildirimi SQLite’a kaydediyor
  • cmd, judge, to do, Toodle.Studio; Janet’in betik yazımı, CLI araçları, test, tarayıcıda çalıştırma ve JavaScript birlikte çalışabilirliği için kullanılabileceğini gösteren temel örnekler olarak kullanılıyor
  • Yayından hemen sonra yalnızca Hacker News ve Lobsters paylaşımlarıyla cuma 30.025, cumartesi 9.568, pazar 3.777 tekil ziyaretçi geldi; ancak 5 veya daha fazla bölümü okuyan tekil IP sayısının 387 olduğu tahmin ediliyor

Kitabın kapsamı ve gerçek iş yükü

  • Janet for Mortals, Janet programlama dilini ele alan ücretsiz bir çevrimiçi kitap
  • Toplam üretim süresi, boş zaman üzerinden hesaplandığında 20 hafta sürdü
    • İlk tahmin 12 haftaydı ve yalnızca İngilizce ana metnin yazım süresi açısından bakıldığında çok da şaşmamıştı
    • Gerçek takvime kitabın etrafındaki kodlama projeleri büyük ölçüde dahil oldu
  • Nihai hacim, kod parçaları hariç 44.000 kelimelik İngilizce düzyazı
    • Karşılaştırma için verilen The Great Gatsby 47.000 kelime
    • Önceki Nix yazı dizisinin yarısından daha kısa
  • 5 ay boyunca kitapla birlikte şu çalışmalar da yürütüldü
    • kitap web sitesi
    • jimmy: C++ kalıcı veri yapıları kütüphanesi binding’i
    • Toodle.Studio: etkileşimli turtle graphics oyun alanı
    • cmd: komut satırı argümanı ayrıştırma kütüphanesi
    • judge: satır içi snapshot test çerçevesi
    • to do: komut satırı yapılacaklar listesi yöneticisi

Web sitesi ve yerleşik REPL

  • Janet for Mortals web sitesinin temel bileşeni yerleşik REPL
    • Kullanıcı istediği anda Escape tuşuyla REPL’i açabiliyor
    • REPL, sayfanın altına sabitlenmiş olduğu için ana metni fazla kapatmıyor
  • Editör olarak CodeMirror kullanılıyor
    • CodeMirror varsayılan olarak Janet’i desteklemiyor
    • Daha önce Bauble üzerinde yapılan Janet dil desteği temel alındı
    • Bauble DSL’de önemli olmayan multi`backtick`quoted string’ler gibi Janet sözdizimi, kitapta gerekliydi
  • CodeMirror’un kullandığı Lezer grameri güçlendirilirken, aynı gramer kitaptaki kod parçalarının sözdizimi renklendirmesi için de yeniden kullanıldı
    • Bilinen statik site oluşturucular arasında Janet kod renklendirmesini destekleyen bir araç bulunamadı
    • Kitap ilk başta siyah-beyazdı, ancak Janet’in alışılmadık sözdizimini daha tanıdık göstermek için renk eklendi
  • Statik site oluşturucu redo kullanılarak özel olarak yazıldı
    • Oluşturucunun çekirdeği JavaScript ile yazıldığı için Lezer grameri entegre edilebildi
    • Genel yapı, shell ile birbirine bağlanmış kırılgan bir düzendi
  • Remark, hem kitap kaynağını ayrıştırmak hem de istemci tarafı REPL’de kullanıldı
    • Kod bloklarına etiket ekleyen basit bir genişletme eklendi
    • Janet standart kütüphanesi docstring’leri Markdown ile yazıldığından, REPL otomatik tamamlamasında anlık olarak HTML’e dönüştürülüyor

Otomatik tamamlama ve tek yönlü geri bildirim

  • REPL otomatik tamamlama, Janet’i ilk kez gören okurlar için önemli görüldü
    • REPL başlatılırken Janet ortamı WebAssembly üzerinden dinamik olarak sorgulanıyor
    • Kullanıcı docstring’e sahip yeni bir sembol tanımlasa bile bu, otomatik tamamlama sonuçlarında görünmüyor
    • Her komut çalıştırıldıktan sonra otomatik tamamlama yeniden üretilebilirdi, ancak buna değmeyeceği düşünüldü
  • (report) fonksiyonu bir string alıp basit bir web sunucusuna POST ediyor; sunucu da bunu SQLite veritabanına kaydediyor
    • Yorum kutusuna benziyor, ama doğrudan REPL’den gönderiliyor olması ayırt edici yönü
    • Bu özellik sayesinde geri bildirimler okunup birçok hata düzeltildi
    • Yanıt verme yolu ise uygulanmadı
  • report backend’i Janet değil, küçük bir Haskell uygulaması
    • Tek işi POST isteğini alıp SQLite veritabanına yazmak
  • Web sunucusu Janet ile yapılmadı
    • Web sunucusunda en kritik unsurun güvenlik olduğu düşünülüyor
    • Janet ve Janet HTTP kütüphanesinin doğrudan internete açık olacak kadar yeterince olgunlaştığına inanılmadı

jimmy: C++ birlikte çalışabilirlik deneyi

  • jimmy, immer için bir Janet binding’i
    • immer, kalıcı veri yapıları kütüphanesi
  • Binding tamamlanmadı ve gerçekten ihtiyaç doğana kadar da tamamlanmayabilir
  • Yine de Janet’in C++ koduyla birlikte çalışmasının nasıl olduğunu gösteren bir örnek olarak başarılı olduğu düşünülüyor

Toodle.Studio ve tarayıcı içinde Janet

  • Bauble, daha önce yapılmış küçük bir sanat oyun alanıydı ve Janet’i tarayıcıya gömme konusundaki ilk deneyimdi
    • O dönemde Janet embedding hakkında çok az kaynak vardı
    • Tarayıcıda WebAssembly, Emscripten ve TypeScript’i birlikte kullanmak gerektiği için zorluk seviyesi yüksekti
  • Bauble’ın nihai sonucu, uygulama mantığı Janet ile yazılmış bir web sitesiydi
    • UI tarafında çokça JavaScript kullanıldı ama çekirdek mantık Janet’teydi
  • Tarayıcıda Janet kullanma tekniğini daha erişilebilir hale getirme isteği, kitabı yazmanın önemli nedenlerinden biriydi
  • Kitapta Bauble yerine Toodle.Studio örnek olarak geliştirildi
    • Bauble, durumsuzdu ve string’den string’e dönüşüm yapan saf bir fonksiyona daha yakındı; bu yüzden birlikte çalışabilirlik açısından basitti
    • Toodle.Studio, Bauble’ın bariz bir fork’u olsa da JavaScript ile Janet arasındaki birlikte çalışabilirlik daha karmaşık
  • Toodle.Studio, kitap örneği olarak daha uygun teknik özelliklere sahipti
    • Uzun süre çalışan Janet programlarının zaman içine yayılmış şekilde asenkron yürütülmesi gerekiyor
    • JavaScript kodu aynı Janet değerine birden fazla referans tuttuğundan bellek yönetimi dikkate alınmalı
    • Karmaşık iç içe veri yapıları C++ üzerinden Janet ile alınıp verilmeli
  • Toodle.Studio logosu, Bauble ile yapılmış animasyonlu bir kaplumbağa
    • Bu bir turtle graphics demosu olmasına rağmen kaplumbağa olmaması yönünde geri bildirim gelince eklendi
    • Gözleri fareyi takip edecek şekilde yapıldı

cmd: Janet için CLI argüman ayrıştırıcısı

  • cmd, bir komut satırı argümanı ayrıştırma kütüphanesi
    • Kitapta yalnızca üç paragraf kadar yer kaplıyor, ama Janet’in iyi bir betik dili olduğunu açıkça göstermek için gerekliydi
  • cmd, OCaml’ın Core.Command kütüphanesinden güçlü biçimde etkilenmiş
    • Core.Command, kullanılmış komut satırı argümanı ayrıştırma kütüphaneleri arasında en iyisi olarak görülüyor
    • Amaç, bu deneyimi Janet’te yeniden üretmekti
  • cmd, Core.Command kadar iyi değil
    • Tür sistemi olduğunda her şeyin çok daha kolay olduğu düşünülüyor
    • Buna rağmen önem verilen özelliklerin %95’ine sahip ve kısa sözdizimi sayesinde ad-hoc betiklerde kullanımı daha rahat bulunuyor
  • Henüz Bash otomatik tamamlama fonksiyonu üretme özelliği yok
    • Core.Command bunu otomatik üretiyor
    • cmd API’si, bu özelliğin sonradan eklenebilmesine uygun biçimde tasarlandı

judge: satır içi snapshot test çerçevesi

  • judge, 2021’de Janet ile yapılan ilk projelerden biriydi
  • Janet daha iyi öğrenildikten sonra baştan yeniden yazıldı
    • API daha kullanışlı hale geldi
    • Uygulama da çok daha basit ve değiştirmesi kolay oldu
  • Judge v1 ile v2 arasındaki temel fark, test konumu ve yardımcılar
    • Testler yalnızca test/ dizininde değil, normal kaynak dosyalarının içinde de yer alabiliyor
    • test-macro ve test-stdout yardımcıları eklendi
  • test-stdout için OCaml karşılığı yaklaşım, profesyonel olarak test yazarken neredeyse tek kullanılan yöntem olarak anlatılıyor
    • OCaml’da rastgele veriyi kaynak koda gömme konusunda iyi bir yol olmadığından, her şeyi string’e dönüştürme yaklaşımı izleniyor
  • Kitap yayımlandıktan sonra Judge’a --interactive modu eklendi

to do: Bash yerine Janet ile yazılmış yapılacaklar aracı

  • to do, betik yazımı bölümü için örnek olarak seçildi
    • Daha önce Bash ile yazılmış, önemsiz olmayan bir araçtı ve Bash uygulaması acı vericiydi
  • Bash’te özellikle zor olan kısımlar metin ayrıştırma ve tarih işlemleriydi
    • Sed ile çok satırlı metin ayrıştırmak keyifli değildi
    • macOS ve Linux’ta aynı şekilde çalışan date işlemleri pratikte imkânsız görülüyordu
  • Janet’te PEG, sh, cmd kullanılarak, özgün Bash yapılacaklar listesinden daha hızlı ve daha fazla özellikli bir sürüm yapılabildi
    • Örneğin fzf çoklu seçim özelliği eklendi
    • Bash’te null-terminated string’ler oluşturmanın zor olduğu düşünülüyor
  • Kitapta yalnızca sadeleştirilmiş sürüm ele alınıyor
    • Gelecekteki işleri planlama özelliği yok
    • İşi “atlama” kavramı yok
    • Temel işlevler, listeye öğe ekleme ve tamamlandı olarak işaretleme
  • zsh-autoquoter ile birlikte kullanıldığında şaşırtıcı derecede faydalı bir uygulama olduğu düşünülüyor

Yazım sırasında kod çalışmaları ve bakım

  • Kitap için harcanan 20 haftanın neredeyse yarısı kod yazımıydı
    • 8 hafta kod çalışmasına gitti ve bazı dönemlerde yazım ile kodlama aynı anda sürdü
  • Başta yalnızca Judge iyileştirmeleri ve bir argüman ayrıştırıcısı yazılması bekleniyordu
    • Argüman ayrıştırıcısını uygulamak beklenenden çok daha zordu
    • Bauble fazla basit kaldığı için yeni bir sanat oyun alanı daha yapılacağı öngörülmemişti
  • Asıl yazım, Sublime Text içinde Markdown olarak yapıldı
    • Uzun düzyazılar yazmak için tercih edilen editör Sublime Text
  • Yazım sürecinde Janet’in 2 yeni sürümü çıktı
    • Hata ayıklama ve native modül bölümleri, dildeki değişikliklere uyacak şekilde güncellenmek zorunda kaldı
    • Kitabın en güncel Janet sürümüyle uyumlu tutulması planlanıyor

Yayın sonrası ilgi ve gerçekten ne kadar okunduğu

  • Kitabın tanıtımı, Hacker News gönderisi, Lobsters gönderisi ve birkaç tweet ile sınırlıydı
    • Hacker News’te gün boyunca ana sayfada kaldı ve bir süre 1 numarada yer aldı
  • Nginx erişim loglarına göre tekil ziyaretçiler şöyleydi
    • Cuma: 30.025
    • Cumartesi: 9.568
    • Pazar: 3.777
  • Bu sayıların bağlantıya tıklayan kişi sayısına daha yakın olduğu, kitabı gerçekten okuyanların ise çok daha az olduğu düşünülüyor
  • Sitede istemci taraflı davranış izleme analitiği yok
    • Bu yüzden yalnızca erişim loglarıyla kaba tahmin yapılabildi
  • Bölüm ziyaret akışı, tutma oranının iyi görünmediğini gösterdi
      1. bölüm, ana sayfa ziyaretçilerinin %22’si
      1. bölüm, 1. bölüm ziyaretçilerinin %20’si
      1. bölüm, 2. bölüm ziyaretçilerinin %69’u
      1. bölüm “Pegular Expressions” ve 9. bölüm “Xenofunctions”, 3. bölümden daha fazla ziyaret aldı
  • Yayın hafta sonu sonunda gerçek okur sayısına dair en iyi tahmin 387 kişi
    • Ölçüt olarak 5 veya daha fazla farklı bölümü yükleyen tekil IP sayısı alındı

İsmin kökeni ve geri bildirimlerin gösterdiği sınırlamalar

  • Janet dilinin adı, The Good Place dizisindeki ölümsüz varlık Janet’ten geliyor
    • Bu varlık, öte dünyada dolaşan mortals’a yardım ettiği için kitap adıyla da bağlantı kuruluyor
  • En az ziyaret edilen bölüm “Testing and Debugging” oldu
    • Kitabın sondan üçüncü bölümü
    • Son üç bölümün kitapta en ilgi çekici bölümler olduğu düşünülüyor
    • O bölümdeki test yaklaşımının, kişisel mühendislik kariyerindeki en büyük verimlilik artışlarından biri olduğu söyleniyor
  • Yerleşik REPL’in report özelliğiyle 494 adet geri bildirim alındı
    • Bunların çoğu “iyi kitap” ya da test amaçlı mesajlardı
    • Onlarcası ise yazım hatası bildirimi, açıklama isteği ve faydalı yorumlardı
  • Bazı kullanıcılar iletişim bilgisi bırakmadan soru gönderdi ve yanıt özelliği olmadığı için cevap verilemedi
    • report özelliği, çok ilkel bir tek yönlü geri bildirim mekanizması olarak uygulanmıştı

1 yorum

 
GN⁺ 2024-11-29
Hacker News yorumları
  • Aynı yazarın https://bauble.studio/ sitesini de es geçmemek gerek
    Eski bilgisayarımın tarayıcısında çalışmıyor ama kütüphanede ders çalışırken mola vermek istediğimde kütüphane bilgisayarında bauble ile yarım saat kadar oynuyorum
    Sadece sayıları sağa sola değiştirerek bile üretilebilen grafikler inanılmaz; umarım Janet uzun ömürlü olur

    • 2021 model MacBook Pro M1 Max, MacOs 15.1.1 üzerinde Chrome’da çalışıyor ama Firefox’ta unknown symbol twist derleme hatası veriyor
      error: script:16:1: compile error: unknown symbol twist
      in evaluate [lib/evaluator.janet] on line 81, column 7
      in bauble-evaluator/evaluate [lib/init.janet] on line 8, column 12
  • Janet’i GNU Guile ile karşılaştırmak ilginç
    Guile’ın asıl avantajı, C ile yan yana kullanımı kolay olacak şekilde tasarlanmış bir dil olması; ancak eski bir dil olduğu için dil araç zincirine paket yöneticisini varsayılan olarak dahil etmek gibi modern yaklaşımları henüz benimseyememiş görünüyor
    Guile’da hoşuma giden şey, RNRS standardı ile uyumluluğunu açıklamak için epey çaba harcamış olması
    Janet’in gerçekte ne kadar Scheme’e benzediğini bilmiyorum ama merak ediyorum

    • Janet hiç Scheme’e benzemiyor
      Daha çok birinin Lua’nın üstüne Clojure yapmış olmasına yakın
  • Kitap https://janet.guide/, dil ise https://janet-lang.org/ adresinde

  • Bu kitabın pratik yaklaşımını sevdim; şu anda Everybody Codes’u Janet ile çözerek öğrenmemin başlıca nedenlerinden biri de bu
    https://everybody.codes

  • “Kaplumbağa bir metafordur” ifadesi pek hoşuma gitmedi
    Kaplumbağa metafor değil, gerçekten vardı: http://classicacorn.computinghistory.org.uk/8bit_focus/logo/...
    Elbette “başka bir şeyi temsil eden bir şey, simge” şeklindeki metafor tanımına uyuyor ama disket kaydetme simgesini buzdolabı sanma şakası gibi duyuluyor
    Eskiden gerçekten eğlenceli ve sevimli bir donanım kaplumbağası olduğu bağlamı eksik kalmış gibi

    • O sayfada görünen şeyin “gerçek” kaplumbağa sayılması pek mümkün görünmüyor
  • Sadece başlığa bakınca The Good Place’teki Janet’tan esinlenmiş bir başka yapay zeka asistanı sandım; aslında bir programlama dili çıkınca hoş bir şekilde şaşırdım
    Janet dili adını, insanların ölüm sonrası dünyada yolunu bulmasına yardım eden The Good Place’teki ölümsüz varlık Janet’tan alıyor; başlık da buna uygun zekice bir şaka
    Varsayılan düzenli ifade motoru yerine PEG (parsing expression grammar) ile birlikte gelmesi de beklenmedikti
    Varsayılan regex kütüphanesi sunan bir dilin düzgün bir PEG’i de yanında getirmesini hep istemişimdir

    • GNU Guile’ın standart kütüphanesinde de bir PEG kütüphanesi var
      <https://www.gnu.org/software/guile/manual/html_node/PEG-Pars...> bölümüne bakın
    • Janet’in spork modülü bir tür libc konumunda ve regex alt modülü de var; bu yüzden kurulu olma ihtimali yüksek
      PEG ile ilk kez Janet sayesinde karşılaştım; güçlü ve kullanımı kolay olmasını sevdim
      Regex ile 20 yılı aşkın süredir ara ara uğraşmış olmama rağmen PEG’i birkaç ay içinde daha iyi anladım
      Janet topluluğunda The Good Place’e yapılan göndermeler de çok; birçok üçüncü taraf modülü karakterlerin adını taşıyor
    • Elm de benzer bir yaklaşım izliyor
      elm/regex ve elm/parser yerleşik değil ama elm/regex bunun yerine elm/parser kullanılmasını öneriyor
      İsmin kökeni hoşuma gidiyor, ama Janet adlı bir dilin kontrolü önceleme yükümlülüğü de var gibi görünüyor
  • Kitabı okudum; epey ilginç ve oyunbaz bir havası olduğu için Janet öğrenmeyi çok daha eğlenceli hale getirdi
    Ancak dil dokümantasyonu birçok açıdan yetersizdi
    Fonksiyonlar veya komutlar çoğu zaman sadece listelenmişti; örnek ya da açıklama yoktu veya ne yaptıklarının açıklaması eksikti
    Kitapta gördüğüm özellikleri dokümantasyonda bulamadığım çok oldu; bu da Janet’i sevmeme rağmen öğrenmeyi bırakmamın nedenlerinden biri oldu
    Mantıklı varsayılanların çok olması ve eski Lisp geleneklerinde ısrar etmek yerine ana akım dillere benzeyen yanlarının bulunması hoşuma gidiyor
    Sonuçta cons listeleri olmadığı için aslında Lisp değil, ama bu sorun değil
    Sorun, dilin yeterince belgelenmemiş olması

    • Belgelenmemiş olan fonksiyonları veya komutları hatırlayıp hatırlamadığını merak ediyorum
      Janet topluluğunda bir ölçüde aktif olduğum için, eksik kısımları bilirsem dokümantasyonu iyileştirmeye katkıda bulunabilirim
    • Kitabı okumamış olmam dışında aynı deneyimi yaşadım
      Çoğu zaman yalnızca fonksiyon imzası vardı ve hiçbir ek açıklama yoktu
      Kapsamlı dokümantasyon hazırlamanın çok zaman ve emek aldığını biliyorum ama bu o kadar sık oluyordu ki vazgeçip ikili dosyaya derlenebilen başka bir Lisp aramaya başladım
  • Janet’e pek alışamadım; sorun bende mi bilmiyorum
    Uzun süre kullandığım tek diğer Lisp Emacs Lisp; Janet yeterince benzer ama ince farkları yüzünden sürekli küçük hatalar yapıyordum
    PEG özelliği belgelerde çekici görünüyordu ama sözdizimi kullanması zor ve kafa karıştırıcıydı
    Dokümantasyon, tüm fonksiyonların açıklaması olması anlamında eksiksizdi; fakat örnekler ve faydalı kullanım bilgileri eksik olduğundan çok kısaydı
    JSON ayrıştırma gibi temel işlevler de dahil değil gibiydi
    Hızlı betikler yazmak için kullanılan bir dilde önce JSON ya da XML ayrıştırıcısı yazmanız gerekiyorsa iş zaten başarısız olmuştur
    Bu yaklaşık 4 yıl önceydi; ekosistem gelişmiş olabilir ya da Janet’i betik dili olarak değerlendirme ölçütüm baştan yanlış olabilir
    Yine de bu yazıyı görünce tekrar kurup denemek istedim

    • JSON ve regex gibi şeyler spork modülüne konmuş; bu modül bir tür libc konumunda
      Çekirdeği hafif tutmaya yönelik güçlü bir iç yönelim var
      Pek çok proje sporka bağımlı olduğu için erken aşamada kurulmuş olma ihtimali yüksek
      Dokümantasyon fena değil, ancak pratik örneklerde hâlâ boşluklar olduğu konusunda katılıyorum
      Bu kısmı https://janetdocs.com tamamlıyor ve her fonksiyon için “topluluk örnekleri”ne bağlantı veriyor
  • Konu dışı ama özgün metindeki başka bir blog yazısı sayesinde ayrık mekanik klavye kullanmaya başladım
    Birkaç yıldır omuz ve bilek ağrılarım vardı; faydası oldu ve Ian’ın diğer yazılarına da bakmanızı şiddetle öneririm

  • Her an Esc tuşuna basıp altta beliren yerleşik REPL’i açma yöntemi iyi bir karar olmayabilir
    Tarayıcıda zaten Esc için varsayılan kısayollar var ve Firefox’ta Esc tuşuna basınca tam ekrandan çıkılıyor