- Flix, fonksiyonel programlama ile etki odaklı modeli birleştiren yenilikçi bir dildir
- Mantıksal kuralları ve veri bağımlılıklarını modellemek kolaydır; bildirimsel bilgi ifadesi güçlü yanıdır
- Karmaşık bağımlılık ilişkileri ve süreç akışları kodla kısa ve öz biçimde yazılabilir
- Bu yaklaşım, algoritma tasarımı ve çıkarım çalışmalarında verimlilik sağlar
- Sorgu özellikleri sayesinde bilgi tabanlı veriler kolayca keşfedilebilir
Flix diline genel bakış
- Flix, etki odaklı programlama paradigmasını benimseyen yeni bir fonksiyonel dildir
- Programcılar prosedürel kod yerine, mantıksal ilişkiler ve kurallar merkezinde sistemleri tanımlayabilir
- Mantıksal kurallar (
#{} içinde tanımlanır) ile bileşenler, bağımlılıklar, montaj süresi ve teslim tarihleri gibi karmaşık üretim senaryoları kısa ve öz şekilde ifade edilebilir
Bildirimsel kurallar ve veri modelleme
- Örnek kodda PartDepends, AssemblyTime, DeliveryDate, ReadyDate gibi olgular ve kurallar kullanılır
PartDepends("Car", "Chassis") gibi ifadelerle ürünler arasındaki bağımlılık ilişkileri tanımlanır
AssemblyTime("Engine", 2) gibi ifadelerle parça bazında montaj süreleri belirlenir
DeliveryDate("Piston"; 1) gibi ifadelerle parça teslim tarihleri de belirtilir
- ReadyDate adlı mantıksal kural sayesinde, teslim tarihi tanımlı parçaların veya montajla oluşan parçaların nihai hazır olma tarihi hesaplanabilir
- Böylece tek tek parçaların tedarik ve montaj döngüleri basit biçimde çıkarımlanabilir
Etki odaklı çıkarım ve sorgular
- Flix'in mantıksal kural motoru, etki odaklı yaklaşımı ve referans şeffaflığını birleştirerek sezgisel ve daha az hataya açık program tasarımını teşvik eder
- Sorgu sözdizimi kullanılarak ReadyDate kapsamındaki tüm parçaların hazır olma tarihleri kolayca elde edilebilir
- Bu yaklaşım, üretim, tedarik zinciri yönetimi ve çıkarım tabanlı otomasyon gibi çeşitli alanlarda uygulanabilir
Genel değerlendirme ve avantajlar
- Flix, etkiler (Effects) ile mantıksal kural tabanlı çıkarımı birleştirerek karmaşık sistemlerdeki bileşenler ve süreçler arasındaki ilişkileri kısa ve öz biçimde modeller
- Mevcut dillere kıyasla mantıksal açıklık ve kod sadeliği açısından ayırt edici avantajlar sunar
- Bilgi grafikleri, workflow engine'ler ve veri çıkarımı gibi çeşitli modern yazılım problemleri için uygun bir çözüm sağlayabilir
1 yorum
Hacker News görüşleri
Bu dilin derinliği ve kapsamı beni gerçekten çok etkiledi
cebirsel veri tipleri, mantık programlama, değişkenlik gibi temel özelliklerin hepsi en baştan dahil edilmiş
karşılaştırma tablosuna bakınca en çok hoşuma giden şey, tek bir çalıştırılabilir dosyanın paket yöneticisi, LSP ve derleyici olarak da görev yapması oldu
Haskell tarafında ise LSP'nin ghc ve cabal dosyaları arasında epey şeyi yeniden uygulaması gerekiyordu, bir de stack kullanılıyordu; dolayısıyla paket yöneticisinin resmîliği biraz belirsizdi
amacım Haskell'i eleştirmek değil, gerçekten harika bir dil
ama en iyi özelliklerinin biraz gizli kalmış olması üzücü
Flix'in JVM üzerinde Java vb. ile ne kadar rahat entegre olduğunu merak ediyorum
JVM derleyicileri tip bilgisinin çoğunu sildiği için, Flix'in
regionskavramının buyurgan etkileşimi birinci sınıf vatandaş olarak desteklemesi olumluJVM kullanınca milyarlarca dolar değerinde, yüksek kaliteli standart kütüphaneleri kolayca kullanabilmek çok büyük avantaj
bu yüzden JVM ya da .net core'un projelerin %90'ından fazlası için en mantıklı seçim olduğunu düşünüyorum
tek gerçek karşılaştırma adayı dil F# gibi görünüyor
Flix ile JVM arasındaki birlikte çalışabilirlikteki sınırlamaları özetleyen bir belge olsa gerçekten harika olurdu
bu arada, ilgili bilgi burada var
temelde Flix/Java değerleri boxing/unboxing sürecinden geçiyor
ayrıca Record da birinci sınıf vatandaş
Paket yöneticisi, LSP ve derleyicinin tek bir çalıştırılabilir dosya olması hoşuna gidiyorsa Unison'ı da muhtemelen çok seversin
Mantık programlama ve datalog kısmı biraz sonradan eklenmiş gibi geliyor
diğer özelliklerin kod tabanının tip güvenliğini gerçekten artırdığı açık, ama mantık programlama oldukça niş bir özellik; bu yüzden belki dilden ayrı olması daha iyi olurdu diye düşünüyorum
JVM derleyicilerinin tüm tip bilgisini sildiği tamamen doğru değil (anonim sınıflar tip parametrelerini koruyor)
çeşitli dolambaçlı yöntemler de var
ve aslında derleyici açısından bu büyük bir sorun değil
tip yapıcıları uygulanmış sınıf adlarını rastgeleleştirip normal sınıflar gibi üretmek yeterli
F# (henüz) type class desteklemediği için monad tabanlı programlamada birçok kısıt var
eğer F#, Haskell tarzı monad aşamasını atlayıp doğrudan cebirsel etkilere geçerse, bunun F# felsefesine daha uygun olacağını düşünüyorum
StringBuilderkısmı biraz hayal kırıklığı yarattıbu açıdan Java tarafına biraz fazla eğilmiş gibi, o yüzden tam emin olamadım
bunun dışındaki kısımlar ilk bakışta iyi görünüyor
Dil anlambilimi açısından bakınca, çok biçimli kayıtların genişletme/kısıtlama anlambiliminin Leijen'in scoped label yaklaşımını izlediği anlaşılıyor (makale bağlantısı)
örneğin elimizde
r1 = { color = "yellow" }şeklinde bir kayıt varsa, bunur2 = { +color = "red" | r1 }ile genişletebilirizr2#colorsonucu"red"olur ve sonra"color"alanını kaldırırsakr3 = { -color | r2 }elde ederizr3#colorise yeniden özgün değer olan"yellow"döndürürbence bu yaklaşım, önceki tarzlara kıyasla çok daha makul; önceki yaklaşımlar aynı label alanının iki kez eklenmesini engellemek için aşırı karmaşık tip sistemleri kullanıyordu
Aarhus'un (özellikle üniversite/teknoloji merkezi olarak) programlama dili araştırmalarında neden bu kadar güçlü bir etkiye sahip olduğunu merak ediyorum
C++, C#/Typescript, Dart gibi şeylerin hepsinin Danimarka'daki bu küçük bölgeyle güçlü bağları var
Delft ya da INRIA gibi yerler gibi klasik bir Ivy League ya da Oxbridge seçkinliği de yok
onu bu kadar özel yapan ne acaba? sudan mı kaynaklanıyor, yoksa başka bir sebep mi var diye merak ettim
Bir noktayı düzeltmek gerekirse, C#'ı Anders Hejlsberg yaptı ve kendisi DTU'da (Kopenhag) okudu
Turbo Pascal'ı da o yaptı, ayrıca Borland da Danimarkalılar tarafından kurulmuş bir şirketti
genel olarak Danimarka programlama dili teorisinde güçlü
örneğin statik program analizi alanındaki standart lisansüstü ders kitabı da (yazarlar Nielson & Nielson) Danimarkalı
Mads Tofte, Standard ML'ye büyük katkılar yaptı
Aarhus, Ivy League ya da Oxbridge seviyesinde olmasa da çok iyi bir üniversite
Avrupa'da bu şekilde adı daha az bilinen ama eğitim ve araştırma kalitesi çok yüksek onlarca üniversite var
Aarhus'un mantık, tip teorisi, işlevsel/nesne yönelimli diller konusunda güçlü bir geleneği var
bu alanlarda etkili olmuş birçok araştırmacı Aarhus çıkışlı
ayrıca programlama dili araştırmalarında küresel ölçekte ciddi bir ABD merkezlilik hissediliyor
Aarhus gibi kurumlar pazarlama ya da öz tanıtım konusunda belirgin biçimde isteksiz; daha çok iyi araştırmaya odaklanıyorlar
bu onları özel olarak daha iyi ya da daha kötü yapmıyor ama küresel ilgi görmelerini zorlaştırıyor
Flix, ML ailesi dilleri arasında en özenli tasarlanmış olanlardan biri olarak etkileyiciliğini sürdürüyor
işlevsel, buyurgan ve mantıksal paradigmaların birleşimiyle birlikte çok biçimli tip ve etki sistemi ile Datalog kısıtlarını da birinci sınıf vatandaş olarak desteklemesi gerçekten benzersiz
saf/saf olmayan kodu tip seviyesinde katı biçimde ayırması, Monad yerine etkileri çıkarsamak için daha kolay bir alternatif gibi durduğu için tazeleyici
tek dil, bayrak yokfelsefesi ve yalnızca derleme zamanı hatalarını hedeflemesi de basit ve öngörülebilir olduğu için hoşJVM'in kendisi yerel olarak tail recursion elimination desteklememesine rağmen Flix'in tam tail-call elimination uygulamış olması dikkat çekici bir teknik başarı
Flix'i gerçek üretim ortamında ya da araştırmada kullanan kişilerin deneyimlerini merak ediyorum
özellikle mantık programlama ya da eşzamanlılık alanlarında kullanırken
closed-world assumptionveya exception desteğinin olmaması gibi konularda yaşanan zorlukları, ayrıca Prolog gibi diğer mantık dilleriyle Datalog entegrasyonunun farklarını duymak isterimBir zamanlar Flix'e bakmıştım ve çok ilginç bulduğum için hatta
Java programcıları için Flixbaşlıklı bir yazı bile yazmıştımşimdi biraz eskidiği için güncellenmesi gerekiyor gerçi...
ilgilenen olursa buradan bakabilir
Blog yazısı gerçekten harika
izin verirseniz bunu Flix'in resmî blog yazıları listesine (bağlantı) eklemek güzel olurdu
o yazıdan bu yana Flix dili çok gelişti
özellikle etki sistemi ciddi biçimde genişletildi, Java ile birlikte çalışabilirlik iyileştirildi ve sözdizimi güncellendi
Blog tam bir hazine sandığı gibi görünüyor
uzun zamandır kafamı kurcalayan düşüncelerin daha rafine bir versiyonunu toparlamış gibi hissettirdi
hepsini okuyacak olmak heyecan verici
HKT desteği de var, bu harika
ama typeclass hakkında bir açıklama göremedim, o yüzden merak ettim
eğer typeclass ve Scala tarzı makrolar da desteklense, kendi yazdığım kütüphaneleri (
distage,izumi-reflect,BIO) Flix'e taşımayı denemek isterdim; hatta Scala'dan Flix'e geçmeyi ciddi ciddi düşünürdümsonradan typeclass'ların burada trait olarak adlandırıldığını fark ettim
makro durumu nasıl, onu da merak ediyorum
ayrıca Flix'in açık isim tabanlı kalıtımı da desteklememesi biraz üzücü
Scala trait'lerinin en zararsız biçimine bile izin verilmiyor yani
bence typeclass'lar interface'in yerini tutamaz; o soyutlama olmazsa birçok yararlı şeyi ya hiç yapamazsınız ya da kod çok çirkinleşir
trait'ler fonksiyonlar için varsayılan uygulamalar da sağlayabiliyor ama instance tarafında override edilebiliyor
Flix'te inheritance hiç yok
trait'ler yalnızca derleme zamanında kullanılıyor ve monomorphization sayesinde çalışma zamanı ek yükü oluşturmuyor
Flix inliner'ı trait içlerini de optimize edip closure'ları agresif şekilde kaldırıyor
örneğin yüksek mertebeden fonksiyonlar ya da pipeline'lar bytecode seviyesinde sıradan döngülere dönüşüyor ve closure allocation ile dolaylı başvurular tamamen ortadan kalkıyor
Flix henüz makro desteklemiyor
sanırım başka dillerdeki (ve kötüye kullanım içeren) deneyimler yüzünden bunu eklemekten çekiniyorlar
yeni kütüphane yazarları arıyorlar; ilgileniyorsan Gitter kanalına uğramanı isterlerdi
Flix resmî belgelerindeki
Flix'te desteklenmeyen özelliklerbölümündeNo Code Before Maindiye bir madde varama açıklamanın kendisi aslında
Flix, main'den önce hiçbir kod çalıştırmaz ve static initializer gibi şeyler hiç yokturdiyorbence özellik adı
Code Before Mainolmalıydı; bu daha doğru olurduFlix'te fonksiyonun saf olduğunu neden mutlaka açıkça işaretlemek gerektiğini merak ediyorum
neredeyse her durumda statik analizle yeterince çıkarım yapılabilir gibi görünüyor; neden böyle olduğunu öğrenmek isterim
Bildiğim kadarıyla, bir fonksiyonu saf olarak işaretlersen derleyici bunun gerçekten öyle olduğunu garanti ediyor
Flix, programdaki tüm ifadelerin saflığını doğru biçimde takip edercümlesine ve saf/saf olmayan işaretleri olmayan fonksiyon tanımı örneklerine bakıncaçoğu durumda derleyicinin saflığı otomatik olarak çıkarabildiği anlaşılıyor
bu yüzden saf/saf olmayan işaretlemenin isteğe bağlı olabileceği izlenimini veriyor
Flix FAQ'su (bağlantı) normal başlıyor ama giderek daha eğlenceli hale geliyor
birkaç komik örnek:
Bu site JavaScript gerektirir<br> C: JavaScript kullanımını eleştiren insanlar: [1],[2],[3],[4],[5], fiilen HTML'e dönüştürmeye yardım etmeyi teklif eden insanlar: 0Bu dille uyumlu kod ajanlarının iyi çalışıp çalışmadığını, yoksa gerçekten insanın kendi beynini kullanması gerekip gerekmediğini merak ediyorum
şaka yollu söylüyorum ama dil gerçekten havalı göründüğü için biraz üzücü
LLM'lerin yeni dil benimsenmesini aslında zorlaştıracak olmasından endişe ediyorum; bunun nasıl aşılacağını merak ediyorum
Benim sezgim tam tersi yönde: LLM'ler yeni dillerin benimsenme eşiğini düşürecek
standart kütüphane kodu, LLM'nin yeni sözdizimini öğrenmesi için yeterli olur; olmasa bile ajanlar derleyici çıktısını gözlemleyerek öğrenebilir
kod taşıma işi doğası gereği yüksek yaratıcılık gerektirmeyen, iyi tanımlı bir görev; dolayısıyla LLM otomasyonunun ilk hedeflerinden biri olacaktır
gelecekte asıl bizim beynimizi kullanmamız gereken konu, neden bunu yaptığımız ve dünyada nasıl bir etki yarattığı olacak
Prompt'ta Idris'in indeksli/bağımlı tiplerini mutlaka kullanmasını söylüyorum, o zaman fena olmayan sonuçlar alıyorum
(böyle bir yönlendirme olmazsa en fazla GADT seviyesine geliyor)