- Flix adalah bahasa inovatif yang menggabungkan pemrograman fungsional dengan model berorientasi efek
- Bahasa ini memudahkan pemodelan aturan logika dan ketergantungan data, serta unggul dalam representasi pengetahuan secara deklaratif
- Relasi dependensi yang kompleks dan alur proses dapat ditulis secara ringkas dalam bentuk kode
- Pendekatan ini memberikan efisiensi untuk pekerjaan perancangan algoritme dan penalaran
- Melalui fitur kueri, data berbasis pengetahuan dapat dijelajahi dengan mudah
Gambaran Umum Bahasa Flix
- Flix adalah bahasa fungsional baru yang memperkenalkan paradigma pemrograman berorientasi efek
- Programmer dapat mendeskripsikan sistem bukan dengan kode prosedural, melainkan berpusat pada relasi dan aturan logis
- Dengan aturan logika (dideklarasikan di dalam
#{}), skenario manufaktur yang kompleks seperti komponen, dependensi, waktu perakitan, dan tanggal pengiriman dapat dinyatakan secara ringkas
Aturan Deklaratif dan Pemodelan Data
- Dalam contoh kode, digunakan fakta dan aturan seperti PartDepends, AssemblyTime, DeliveryDate, ReadyDate
- Mendefinisikan relasi dependensi antarproduk seperti
PartDepends("Car", "Chassis")
- Menetapkan waktu perakitan per komponen seperti
AssemblyTime("Engine", 2)
- Juga mencantumkan tanggal pengiriman komponen seperti
DeliveryDate("Piston"; 1)
- Melalui aturan logika bernama ReadyDate, tanggal kesiapan akhir untuk komponen dengan tanggal pengiriman yang telah ditentukan maupun komponen rakitan dapat dihitung
- Dengan kata lain, siklus pasokan dan perakitan tiap komponen dapat diinferensikan secara sederhana
Penalaran Berorientasi Efek dan Kueri
- Mesin aturan logika Flix menggabungkan orientasi efek dan transparansi referensial, sehingga mendorong perancangan program yang intuitif sekaligus minim kesalahan
- Dengan sintaks kueri, tanggal kesiapan semua komponen yang termasuk dalam ReadyDate dapat diperoleh dengan mudah
- Pendekatan ini dapat diterapkan di berbagai bidang seperti manufaktur, manajemen rantai pasok, dan otomatisasi berbasis penalaran
Ringkasan dan Keunggulan
- Flix menggabungkan Effects dan penalaran berbasis aturan logika untuk memodelkan secara ringkas hubungan antara komponen dan proses dalam sistem yang kompleks
- Dibandingkan bahasa yang sudah ada, Flix memiliki keunggulan yang berbeda dalam hal kejelasan logis dan keringkasan kode
- Bahasa ini berpotensi menawarkan solusi yang cocok untuk berbagai masalah perangkat lunak modern seperti knowledge graph, workflow engine, dan inferensi data
1 komentar
Komentar Hacker News
Saya sangat terkesan dengan kedalaman dan keluasan bahasa ini
Tipe data aljabar, pemrograman logika, varians, dan fitur-fitur esensial lainnya semuanya sudah tersedia sejak awal
Dari tabel perbandingannya, bagian yang paling saya sukai adalah satu executable tunggal yang sekaligus berperan sebagai package manager, LSP, dan compiler
Dalam kasus Haskell, LSP harus mengimplementasikan ulang banyak hal di antara ghc dan file cabal, dan juga ada stack, jadi status resmi package manager-nya agak ambigu
Bukan bermaksud mengkritik Haskell; itu benar-benar bahasa yang luar biasa
Hanya saja agak disayangkan karena fitur-fitur terbaiknya terasa sedikit tersembunyi
Saya penasaran seberapa nyaman Flix terintegrasi dengan Java dan lainnya di atas JVM
Karena compiler JVM menghapus sebagian besar informasi tipe, konsep
regionsdi Flix yang mendukung interaksi imperatif sebagai warga kelas satu terasa positifMenggunakan JVM juga merupakan keunggulan besar karena kita bisa dengan mudah memanfaatkan standard library berkualitas tinggi bernilai miliaran dolar
Karena itu, saya pikir JVM atau .NET Core adalah pilihan paling masuk akal untuk lebih dari 90% proyek
F# tampak sebagai satu-satunya bahasa pembanding yang relevan
Akan sangat bagus jika ada dokumen yang merangkum keterbatasan interoperabilitas antara Flix dan JVM
Sebagai referensi, ada informasi terkait di sini
Pada dasarnya, nilai Flix/Java melewati proses boxing/unboxing
Selain itu,
Recordjuga merupakan warga kelas satuJika Anda menyukai gagasan bahwa package manager, LSP, dan compiler semuanya adalah satu executable, Anda mungkin juga akan sangat menyukai Unison
Bagian pemrograman logika dan datalog terasa agak seperti tambahan
Fitur-fitur lainnya jelas terlihat meningkatkan type safety codebase, tetapi pemrograman logika terasa seperti fitur yang cukup niche, jadi mungkin lebih baik jika berada terpisah dari bahasanya sendiri
Pernyataan bahwa compiler JVM menghapus semua informasi tipe tidak sepenuhnya benar (dalam kasus kelas anonim, parameter tipe tetap dipertahankan)
Ada juga berbagai jalan memutar
Dan sebenarnya, dari sudut pandang compiler, ini bukan masalah besar
Cukup acak nama kelas yang telah menerapkan type constructor dan render seperti kelas biasa
F# (masih) tidak mendukung type class, jadi ada banyak keterbatasan pada pemrograman berbasis monad
Jika F# melompati monad gaya Haskell dan langsung menuju algebraic effects, menurut saya itu akan lebih cocok dengan filosofi F#
Bagian
StringBuilderagak disayangkanDalam hal ini rasanya sedikit terlalu condong ke sisi Java, jadi saya belum yakin
Selain itu, sekilas bagian lainnya tampak cukup bagus
Dari sisi semantik bahasa, semantik perluasan/pembatasan record polimorfik tampaknya mengikuti pendekatan scoped label milik Leijen (tautan makalah)
Misalnya jika ada record
r1 = { color = "yellow" }, kita bisa memperluasnya menjadir2 = { +color = "red" | r1 }r2#colorakan menghasilkan"red", lalu jika field"color"dihapus lagi menjadir3 = { -color | r2 }r3#colorakan kembali menghasilkan nilai asli"yellow"Menurut saya ini jauh lebih masuk akal daripada gaya sebelumnya, yang mengarah pada sistem tipe yang sangat rumit hanya agar field dengan label yang sama tidak bisa ditambahkan dua kali
Saya penasaran mengapa Aarhus (terutama universitas/tech hub-nya) punya pengaruh kuat dalam riset bahasa pemrograman
C++, C#/Typescript, Dart, dan lainnya semuanya memiliki akar kuat di wilayah kecil Denmark ini
Tempat ini bukan universitas elite khas seperti Ivy League atau Oxbridge, juga bukan seperti Delft atau INRIA
Apa yang membuatnya begitu istimewa? Sekadar penasaran apakah airnya yang spesial, atau ada alasan lain
Satu hal yang perlu dicatat, C# dibuat oleh Anders Hejlsberg, dan dia belajar di DTU (Kopenhagen)
Turbo Pascal juga dibuat olehnya, dan Borland adalah perusahaan yang didirikan oleh orang Denmark
Secara umum, Denmark memang kuat dalam teori bahasa pemrograman
Misalnya, buku teks pascasarjana standar di bidang analisis program statis (oleh Nielson & Nielson) juga berasal dari Denmark
Mads Tofte memberi kontribusi besar pada Standard ML
Aarhus memang bukan sekelas Ivy League atau Oxbridge, tetapi tetap universitas yang hebat
Di Eropa ada puluhan universitas seperti ini: namanya mungkin tidak terlalu besar, tetapi kualitas pendidikan dan penelitiannya sangat tinggi
Aarhus punya tradisi kuat dalam logika, type theory, dan bahasa fungsional/berorientasi objek
Banyak peneliti berpengaruh di bidang ini berasal dari Aarhus
Selain itu, riset bahasa pemrograman terasa sangat bias ke AS di tingkat global
Institusi seperti Aarhus cenderung jauh lebih hemat dalam pemasaran atau self-promotion, dan lebih fokus pada riset yang baik
Bukan berarti lebih baik atau lebih buruk secara khusus, tetapi itu membuatnya lebih sulit mendapat sorotan global
Flix terus mengesankan saya sebagai bahasa yang paling dirancang dengan cermat di antara keluarga bahasa ML
Kombinasi paradigma fungsional, imperatif, dan logika, plus dukungan warga kelas satu untuk sistem tipe & efek polimorfik serta constraint Datalog, benar-benar unik
Pemisahan ketat antara kode murni/tidak murni pada level tipe terasa segar sebagai alternatif yang lebih mudah untuk inferensi efek dibanding Monad
Filosofi "satu bahasa, tanpa perlu flag" dan hanya mengejar error saat compile time juga terasa sederhana dan bisa diprediksi
Bahwa Flix berhasil mengimplementasikan penghapusan tail call penuh meski JVM sendiri tidak mendukung tail recursion elimination secara native adalah pencapaian teknis yang patut diperhatikan
Saya penasaran dengan pengalaman orang-orang yang benar-benar memakai Flix di lingkungan produksi atau riset
Khususnya, saya ingin mendengar kesulitan yang mereka alami saat memakainya untuk pemrograman logika atau konkurensi, seperti terkait closed-world assumption atau tidak adanya dukungan exception, serta perbedaan integrasi Datalog dibanding bahasa logika lain seperti Prolog
Saat dulu saya melihat Flix, saya merasa ini sangat menarik sampai saya menulis artikel berjudul "Flix untuk programmer Java"
Sekarang memang sudah agak lama dan perlu diperbarui, tetapi...
Kalau tertarik, bisa dilihat di sini
Tulisan blognya benar-benar keren
Kalau diizinkan, akan bagus kalau itu ditambahkan ke kumpulan blog resmi Flix (tautan)
Sejak tulisan itu, bahasa Flix sudah berkembang pesat
Terutama sistem efeknya telah diperluas besar-besaran, interoperabilitas Java ditingkatkan, dan ada pembaruan sintaks
Blog itu terasa seperti harta karun
Rasanya seperti versi yang lebih matang dari pemikiran-pemikiran yang sudah lama mengganggu saya
Saya antusias membayangkan membaca semuanya
Keren juga karena mendukung HKT
Tapi saya tidak melihat penjelasan tentang typeclass, jadi saya penasaran
Kalau mendukung typeclass dan macro gaya Scala, saya ingin mencoba memindahkan library yang saya buat (
distage,izumi-reflect,BIO) ke Flix dan mungkin serius mempertimbangkan berpindah dari Scala ke FlixBelakangan saya menemukan bahwa typeclass di sana disebut trait
Saya juga penasaran bagaimana dengan macro
Selain itu, agak disayangkan Flix juga tidak mendukung nominal inheritance eksplisit
Jadi bahkan bentuk trait Scala yang paling tidak berbahaya pun tidak diizinkan
Menurut saya, typeclass tidak bisa menggantikan interface, dan tanpa abstraksi itu banyak fitur berguna yang sama sekali tidak bisa diimplementasikan, atau hasil kodenya bisa jadi jelek dilihat
Trait juga bisa menyediakan implementasi fungsi default, tetapi dapat dioverride di instance
Flix sama sekali tidak memiliki inheritance
Trait hanya digunakan pada waktu kompilasi dan diproses melalui monomorphization, jadi tidak ada overhead runtime
Inliner Flix juga mengoptimalkan bagian dalam trait, sampai secara agresif menghapus closure
Misalnya, fungsi orde tinggi atau pipeline bisa berubah menjadi loop biasa di level bytecode, tanpa alokasi closure atau indirection sama sekali
Flix masih belum mendukung macro
Tampaknya mereka takut memperkenalkannya karena pengalaman (penyalahgunaan) di bahasa lain
Mereka sedang mencari penulis library baru, jadi kalau tertarik, akan bagus jika mampir ke kanal Gitter
Terkait bagian "fitur yang tidak didukung Flix" di dokumentasi resmi Flix
Ada item bernama "No Code Before Main"
Namun penjelasan sebenarnya berbunyi "Flix tidak menjalankan kode apa pun sebelum main dan sama sekali tidak punya static initializer"
Menurut saya nama fiturnya akan lebih akurat jika diubah menjadi "Code Before Main"
Saya penasaran mengapa Flix mengharuskan fungsi secara eksplisit ditandai sebagai murni
Rasanya dalam hampir semua kasus ini bisa diinferensikan cukup lewat analisis statis, jadi saya ingin tahu alasannya
Setahu saya, jika Anda menandai sebuah fungsi sebagai murni, compiler akan menjaminnya
Jika melihat kalimat "Flix secara akurat melacak kemurnian setiap ekspresi dalam program" dan contoh definisi fungsi tanpa penanda murni/tidak murni
tampaknya compiler memang mampu menginferensikan kemurnian secara otomatis dalam sebagian besar kasus
Jadi saya mendapat kesan bahwa penanda murni/tidak murni mungkin bersifat opsional
FAQ Flix (tautan) mulai dengan biasa saja lalu makin lama makin lucu
Beberapa contoh yang mengundang tawa:
Saya penasaran apakah code agent yang kompatibel dengan bahasa ini bekerja dengan baik, atau kita tetap harus benar-benar berpikir sendiri
Saya mengatakannya setengah bercanda, tetapi sebenarnya saya sedih karena bahasanya terlihat keren
Jika LLM justru menghambat adopsi bahasa baru, saya penasaran bagaimana masalah ini akan dipecahkan
Saya justru punya firasat bahwa LLM akan menurunkan hambatan adopsi bahasa baru
Kode standard library sudah cukup bagi LLM untuk mempelajari sintaks baru, dan kalaupun tidak, agent bisa belajar dengan mengamati output compiler
Pekerjaan porting kode sendiri bukanlah hal yang butuh kreativitas tinggi; itu pekerjaan yang definisinya jelas, jadi akan menjadi salah satu area otomatisasi pertama bagi LLM
Ke depan, menurut saya kita justru perlu serius memakai otak kita untuk memikirkan 'mengapa kita melakukan ini' dan 'dampak apa yang ditimbulkannya pada dunia'
Saya mendapat hasil yang lumayan dengan menulis di prompt agar wajib memakai indexed/dependent types milik Idris
(tanpa instruksi seperti itu, biasanya mentok di level GADT)