Herkes İçin Janet (2023)
(ianthehenry.com)- 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üphanesijudge: satır içi snapshot test çerçevesito 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`quotedstring’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
redokullanı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’ınCore.Commandkü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.Commandkadar 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.Commandbunu otomatik üretiyorcmdAPI’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-macrovetest-stdoutyardımcıları eklendi
- Testler yalnızca
test-stdoutiç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
--interactivemodu eklendi- Kitapta Judge ile test ve hata ayıklamayı anlatan bir bölüm bulunuyor
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
dateişlemleri pratikte imkânsız görülüyordu
- Janet’te PEG,
sh,cmdkullanı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
- Örneğin
- 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-autoquoterile 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
-
- bölüm, ana sayfa ziyaretçilerinin %22’si
-
- bölüm, 1. bölüm ziyaretçilerinin %20’si
-
- bölüm, 2. bölüm ziyaretçilerinin %69’u
-
- 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
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
unknown symbol twistderleme hatası veriyorerror: script:16:1: compile error: unknown symbol twistin evaluate [lib/evaluator.janet] on line 81, column 7in bauble-evaluator/evaluate [lib/init.janet] on line 8, column 12Janet’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
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
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
<https://www.gnu.org/software/guile/manual/html_node/PEG-Pars...> bölümüne bakın
sporkmodülü bir tür libc konumunda ve regex alt modülü de var; bu yüzden kurulu olma ihtimali yüksekPEG 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/regexveelm/parseryerleşik değil amaelm/regexbunun 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ı
Janet topluluğunda bir ölçüde aktif olduğum için, eksik kısımları bilirsem dokümantasyonu iyileştirmeye katkıda bulunabilirim
Ç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
sporkmodü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üksekDokü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
Esctuşuna basıp altta beliren yerleşik REPL’i açma yöntemi iyi bir karar olmayabilirTarayıcıda zaten
Esciçin varsayılan kısayollar var ve Firefox’taEsctuşuna basınca tam ekrandan çıkılıyor