- Incremental, girdiler değiştiğinde karmaşık hesaplamaları verimli biçimde güncellemeyi sağlayan bir kütüphanedir
- Umut Acar ve diğerlerinin self-adjusting computation (kendini ayarlayan hesaplama) araştırmalarından ilham almıştır
- Elektronik tablolar gibi büyük ölçekli hesaplamaların veri değişikliklerine verimli şekilde tepki verecek biçimde yapılandırılmasını sağlar
- GUI uygulamalarının görünümlerine yeni verilerin verimli biçimde yansıtılmasını sağlar
- Filtreleme veya eşlemelerin ters dönüşümü gibi türetilmiş verilerin kaynak verilerle sürekli senkronize kalmasını garanti edebilir
Kullanım alanları
- Değişen girdilere yanıt olarak karmaşık hesaplamaları verimli biçimde günceller
- Elektronik tablo biçimindeki büyük ölçekli hesaplamaların veri değişikliklerine tepki verecek şekilde yapılandırılmasını sağlar
- GUI görünümlerine yeni verileri verimli biçimde entegre edebilir
- Kaynaktan hesaplanan türetilmiş verileri sürekli senkronize eder
- Veri filtreleme
- Eşlemelerin ters dönüşümü
Tasarım arka planı ve belgeler
- Umut Acar ve diğerlerinin kendini ayarlayan hesaplama araştırmasından ilham almıştır
- Ayrıntılı API ve kullanım bilgileri incremental/src/incremental_intf.ml dosyasında bulunabilir
- Resmî olmayan giriş materyali olarak bir blog yazısı ve tanıtım videosu sunar
1 yorum
Hacker News yorumları
Bu tür reaktif programlama, günümüz JavaScript UI framework’lerinde signals adıyla yaygın biçimde kullanılıyor; ayrıca bir standartlaştırma önerisi de devam ediyor.
Vue, SolidJS, Svelte, Ember ve Angular bunu kullanıyor; React için de MobX ve Jotai gibi uygulamalar var. Değişiklik yayılımı ve yönlü çevrimsiz grafik (DAG) değerlendirme algoritmalarının da çeşitli türleri var; bildiğim kadarıyla SolidJS 2, Incremental’a benzer yükseklik tabanlı bir algoritma kullanıyor.
Ben düğümleri bir
Int32Arrayarenasında ayırıp bağlı listeyle birbirine bağlayarak bağımlılık kenarı sayısıyla orantılı GC yükünden kaçınan bir uygulama üzerinde denemeler yapıyorum.Rust’ta da çeşitli uygulamalar var; UI framework’ü olarak Leptos, rust-analyzer’ın kullandığı genel amaçlı artımlı hesaplama sistemi olarak da Salsa mevcut. Bunu, bağımlılıkları otomatik izleyen bir build sistemi olarak da görmek mümkün; tup, hangi dosyaların okunduğunu saptamak ve bağımlılık ilişkilerini kurmak için build işlerini enstrümante ediyor. Yazarın yazısı ve klasikleşmiş Build Systems à la Carte da okumaya değer.
Ancak artımlı hesaplama ile fonksiyonel reaktif programlama (FRP) aslında farklı alanlar. Artımlı hesaplama, deltalar üzerinde çalışan fonksiyonları açıkça türetir; FRP ise yalnızca bozulmuş kısımları bulup onarma yöntemini de kullanabilir.
Incremental kütüphanesi, kaynak veri değiştiğinde hesaplama grafiğini kısmen yeniden somutlaştırma problemini çözmeye çalışıyor gibi görünüyor. İyi tasarlanmış build sistemlerine benziyor ve fonksiyonel programlamada da sık kullanılan yararlı bir yaklaşım.
Artımlı hesaplama alanında Differential Dataflow, buna yakın Timely Dataflow ve DBSP de var. Feldera DBSP tabanlı; Materialize ise Differential Dataflow çevresindeki kişiler tarafından yönetiliyor.
Ben finansal veriler ve iş yüklerine özel ayrı bir yaklaşım olan modolap üzerinde çalışıyorum. Çözülmesi gereken büyük ve önemli çok sayıda problem var. Bu bağlamda Signals and Threads’in build sistemleri bölümü de bakmaya değer.
Goldman da yaklaşık 30 yıl önce finansal ürün fiyatlamasında aynı yaklaşımı kullanıyordu. Orada yaklaşık 13 yıl çalışırken Node Purpling hakkında uzun tartışmaları hatırlıyorum.
Bilgisayar bilimi ilerledi ve bana göre bu bir grafik yaklaşımı değil; ancak türev gibi hesaplamalar maliyetli olduğundan çalıştırma sayısını teorik minimuma olabildiğince yaklaştırmak gerekiyor. İlgili bir HN tartışması da var.
Özel kurum içi IDE’yi gördüğünüz anda öfkelenip istifa etmiyorsanız bile, yeni başlayanların alışması alışılmadık derecede uzun sürüyor; aylar geçtikten sonra bile temelden farklı unsurları öğrenmeye devam etmek zorunda kalmanız sorunu en iyi anlatan kısım. Benim de yaptığım işi tamamen anlamam yaklaşık iki buçuk yıl sürdü.
Yeniden eğitim verilmesi gerektiğini fark edene kadar modern eğitim de neredeyse yoktu. En kötü kısmı UI yapmak için kod yazmaktı ve yeni projelerde kullanım onayı verilmiyordu.
En sevdiğim teknik sunumlardan biri Seven Implementations of Incremental: https://www.janestreet.com/tech-talks/seven-implementations-of-incremental/
Birkaç yıl önce dataflow programlamaya büyük ilgi vardı ve pek çok kişi bu probleme farklı yönlerden yaklaşıyordu sanki. Bu kütüphaneyi görünce aklıma hemen Clojure’un Javelin’i geldi.
İlginizi çekiyorsa Incremental üzerine inşa edilmiş UI kütüphanesi Bonsai de bakmaya değer.
React gibi kütüphaneler sanal DOM ile gereksiz işleri verimli biçimde atlıyor; ancak sanal DOM’un kendisini oluşturmak da zaman alıyor. Bonsai, sanal DOM’u bile artımlı hale getiriyor ve onunla çalışmak da keyifli.
Ben artık bakımı yapılmayan Revery için bir masaüstü UI kütüphanesi geliştirmiştim, ancak oldukça eski bir Bonsai sürümü kullanıyor.
Bunun, girdiye yeni bir değer yayımlayıp hesaplamadan geçirerek yeni sonucu abonelere ileten observable pattern’dan nasıl farklı olduğunu tam olarak anlayamadım.
Değişiklik algılama ve değer aynı kaldığında yayılımı durduran bir optimizasyon vardır, ama observable’larda da bu mümkün.
stabilizeile yeniden hesaplamadan önce değişiklikleri toplu işleme kısmı da ilginç, ancak o da observable ile uygulanabilir.Temel farkın, iç inceleme yoluyla hesaplama grafiğini otomatik kurmakta mı, yoksa daha köklü bir unsurda mı olduğunu merak ediyorum.
Yalnızca bazı düğümler gözlemlendiğinde tüm grafiği somutlaştırmak gerekmez. Hesaplamayı herhangi bir anda durdurup grafiği yalnızca kısmen güncellenmiş durumda bırakabilir, girdilerde ek değişiklikler yaptıktan sonra ilgilendiğiniz düğümlerin somutlaştırılmasına devam edebilirsiniz; algoritma tüm değişiklikleri toparlar.
Artımlı hesaplama özünde bu tür özellikleri kapsayan bir terimdir; aynı sistem gözlemci ve abone modeliyle de kurulabilir. Klasik Excel elektronik tabloları iyi bir örnektir; Salsa algoritması açıklaması da bakmaya değer.
Ron Minsky’nin sunumu çok iyi.
Yüzlerce ara düğüme ayrılıp farklı uzunluktaki yollardan geçerek tekrar birleşen elmas biçimli bir alt grafiği düşünebilirsiniz. Bazı yollarda
min(A, B)olup yalnızca maksimum taraftaki değerin değiştiği durumlar da var.Basit bir observer yaklaşımı, hesaplama miktarının potansiyel olarak üstel biçimde patlamasına ve eşzamanlılık sorunlarına yol açmaya çok yatkındır. Bu kütüphane, grafik yapısı dinamik olarak değişse bile optimale yakın ve doğru çalışır. Observer vb. ile de aynı sonuç elde edilebilir, ancak performans uçurumlarından kaçınarak doğru şekilde uygulamak çok daha zordur.
Jane Street projelerinin güçlü yanı, araştırmada ya da niş sistemlerde kalan fikirleri geliştiricilerin gerçekten kullanabileceği bir biçimde paketlemeleri. Kütüphaneyi benimsemeseniz bile tasarım belgeleri genellikle okumaya değer.
Electric Clojure istemci-sunucu sınırını aşan artımlı rendering sunar. En benzeri bence SolidJS, ancak SolidJS yalnızca frontend tarafıyla ilgilidir.
Eskiden buna benzer bir şey yaparken neredeyse hiç emsal bulamamıştım. Kullanım amacı ortadan kalkınca projeyi sonlandırdım, ama tekrar bakmak istiyorum; npm’de
data-rambleradıyla duruyor.Fikir, JavaScript çalışma zamanına yüklenebilen alan-özel bir dile (DSL) veri akışları beslemekti. Modül verileri birden fazla çıktı akışına dönüştürüyor, bunları da ayrı bir rapor kütüphanesine aktararak şablon tabanlı dinamik raporlar üretiyordu.
İlk sürümden itibaren oldukça güçlüydü, ancak karmaşıklığı azaltmak için JavaScript’e daha uygun bir söz dizimiyle iyileştirmeye yönelik büyük planlarım da vardı.