Hylo(Val), bahasa pemrograman sistem tingkat tinggi
(val-lang.dev)- Hylo berorientasi pada pemrograman sistem dan generik yang aman berbasis semantik nilai, dan meskipun kompiler serta pustaka standarnya masih pada tahap awal, contoh dapat dijalankan di Compiler Explorer
- Riset bahasa ini berfokus pada topik seperti perluasan inout projection pada subscript Swift, method bundles, konkurensi terstruktur, dan linked list ganda berbasis semantik nilai
- Kompilernya menggunakan LLVM dan juga membahas kompilasi generik dengan coherence, caching·serialisasi status program, serta riset interoperabilitas dengan C
- Lingkungan pengembangannya menyediakan ekstensi VSCode, kompiler dokumentasi, dan prototipe Language Server, serta mendukung SPM/CMake, Ninja/Xcode, Windows/Linux/macOS, dan image toolchain pengembangan Docker
- Contohnya menunjukkan aturan kepemilikan·deinisialisasi secara eksplisit di level kode melalui projection yang aman dan sink method, memperlihatkan bagaimana bahasa sistem dapat memaksakan keamanan
Cakupan dan status saat ini Hylo
- Kompiler dan pustaka standar Hylo masih berada pada tahap awal
- Contoh kode Hylo tingkat lanjut dapat dijalankan di Compiler Explorer
- Pada halaman awal juga tersedia tautan untuk mencoba Hylo di Compiler Explorer
Semantik nilai dan riset bahasa
- MVS & Theory berkembang dengan fokus pada semantik nilai, projection yang aman, konkurensi, dan representasi struktur data
- Memperluas subscript Swift dengan inout projection
- Method bundles
- Structured concurrency made easy: konkurensi terstruktur tanpa thread hopping dan function coloring
- Cara merepresentasikan linked list ganda dengan semantik nilai lebih aman dan cepat daripada implementasi dengan reference semantics
Kompiler dan pustaka standar
- Pekerjaan pada kompiler mencakup kompilasi berbasis LLVM, generik, penyimpanan status, dan interoperabilitas dengan C
- Kompilasi menggunakan LLVM
- Teknik baru untuk kompilasi generik dengan coherence
- Caching·serialisasi status program pada kompiler
- Riset C interop
- Di sisi pustaka standar, saat ini dipublikasikan dokumentasi implementasi dan pekerjaan terkait algoritme koleksi
- Dokumentasi implementasi saat ini mencakup trait dasar dan struktur data
- Positionless Collection Algorithms
- rs-stl: port Rust dari algoritme STL C++ untuk meningkatkan pemrograman generik
Pengalaman pengembang dan lingkungan build
- Disediakan pula alat untuk editor, dokumentasi, dan language server
- VSCode extension: mendukung syntax highlighting dan eksekusi kode
- Documentation compiler
- Prototipe Language Server
- Lingkungan build dan pengembangan mendukung berbagai sistem operasi dan alur berbasis kontainer
- Dukungan Development Containers mengurangi langkah awal penyiapan
- Dukungan SPM/CMake, Ninja/Xcode, Windows/Linux/macOS
- Plugin kompiler pembuat pengujian
- Image Docker Hylo development toolchain yang sudah dibangun sebelumnya
- Kompiler ditulis dengan Swift 6.2
Riset dan materi presentasi terkait Hylo
- Materi seputar Hylo dirangkum dalam bentuk makalah, presentasi, dan podcast
- Makalah·dokumen terbaru mencakup item berikut
- Who Owns the Contents of a Doubly-Linked List?, 2025-09
- High-Fidelity C Interoperability in Hylo, 2025-06
- Debugging Hylo, 2025-06
- On the State of Coherence in the Land of Type Classes, 2025-02
- Method Bundles, 2024-10
- Type Checking with Rewriting Rules, 2024-10
- Use Site Checking Considered Harmful, 2024-10
- Borrow checking Hylo, 2023-10
- The Val Object Model, 2022-10
- Implementation Strategies for Mutable Value Semantics, 2022
- Materi presentasi membahas konkurensi terstruktur, bahasa sistem·generik yang aman, HyloDoc, borrow checking, interoperabilitas C++, dan semantik nilai
- Hylo: The Safe Systems and Generic-programming Language Built on Value Semantics, C++ on Sea 2024-07
- HyloDoc: A Documentation Compiler for Hylo, C++ on Sea 2024-06
- Val: A Safe Language to Interoperate with C++, CppCon 2022-09
- Value Semantics: Safety, Independence, Projection, & Future of Programming, CppCon 2022-09
Contoh kode: projection aman dan pelepasan eksplisit
- Contoh Subscripts - A Safe Projection Mechanism menunjukkan struktur di mana tipe
Anglemenyimpan nilairadiansdan menyediakan propertidegreesmelalui blokletdaninoutletpadadegreesmengonversi radians ke derajat lalu mengembalikannyainoutmengekspos nilai derajat sementaraddenganyield &d, lalu mengonversi nilai yang telah diubah kembali ke radians dan menerapkannya keself.radiansmainmemperoleh projection denganinout d = &a.degrees, mengubahdmenjadi0.0, lalu memeriksaa.radians == 0.0
- Contoh Sink Methods - Capability for Deinitializing memperlihatkan struktur di mana tipe
Computermenyediakanshutdown()sebagai sink methodshutdown()mencetak isi memori lalu melakukan sink padaself.ramtest1membuatComputertetapi tidak memanggil shutdown sehingga munculCannot deinit computertest2hanya memanggil shutdown di dalamif random_bool(), sehingga pada jalur saat tidak masuk keifmunculCannot deinit computertest3memanggil shutdown di dalamwhile, sehingga setelah iterasi pertama muncul masalah penggunaan objek yang sudah consumed, dan pada jalur saat tidak masuk kewhiletetap tersisa kondisi tidak bisa dideinit
- Contoh tambahan dapat dilihat di compiler test suite
1 komentar
Komentar Hacker News
Sebagai penerus C++, mungkin Val malah lebih menjanjikan daripada CppFront karya Herb Sutter yang sangat bagus. Saya baru melihat dua presentasi di bawah ini, tetapi tampaknya poin intinya adalah kompilasi statis, tipe statis, interoperabilitas C++, keamanan memori, keamanan tipe, dan tidak adanya data race
Saat menjelaskannya, saya biasanya mengatakan, “Kalau memulai proyek C++ baru dan menganggap performa bukan perhatian utama, bukankah akan lebih baik jika semuanya diteruskan sebagai nilai dan dikembalikan sebagai nilai tanpa pointer atau referensi, sehingga tidak perlu khawatir soal efek samping atau data race?” Yang menarik dari Val adalah, meski pointer dan referensi dihapus dari bahasanya, kompiler secara internal tetap menerapkan pengoperan
constreference dan return value optimization sehingga semantik yang diinginkan dan performa bisa dipertahankan sekaligusVal: A Safe Language to Interoperate with C++ - Dimitri Racordon - CppCon 2022 https://www.youtube.com/watch?v=ws-Z8xKbP4w
https://cppcast.com/val-and-mutable-value-semantics/
https://adspthepodcast.com/
Saya rasa interpreter PHP cukup pintar untuk benar-benar memakai copy-on-write, tetapi saya belum pernah memprofilkannya sendiri. Meski begitu, walaupun pada setiap page load saya melakukan pemrosesan data yang cukup rumit, parsing DSL per karakter, pembuatan SQL dinamis, dan membentuk hasil ke struktur arbitrer, saya tidak pernah merasakan masalah performa
Pada era PHP 4, objek juga berperilaku seperti nilai yang disimpan di variabel, dan ketika kemudian variabel objek diubah menjadi semantik referensi, menurut saya itu kesempatan yang terlewat karena mereka tidak menjadikan “nilai, referensi variabel, dan pointer ke nilai” sebagai properti variabel yang ortogonal terhadap tipe penyimpanan
$a = $b; // salin nilai $b ke $a$a = &$b; // $a dan $b sekarang adalah variabel yang sama$a = *$b; // $a menunjuk ke objek yang sama dengan $b, tetapi tidak seperti $a = &$b, variabelnya sendiri tidak saling terikatSenang juga melihat begitu banyak bahasa zero-cost abstraction bermunculan, tetapi di sisi lain saya berharap para programmer sistem segera memilih satu pemenang. Saya tidak ingin komunitas programmer sistem yang sudah kecil ini makin terpecah ke Rust, Zig, Val, dan sebagainya, dan berharap perang bahasa sistem cepat selesai
Alur perasaan saya saat pertama kali mengenal Val hari ini kurang lebih begini. “Oh, bahasa sistem baru. Mungkin bukan apa-apa, tapi mari lihat. Dokumentasinya lumayan. Ide-ide terkait ownership cukup matang dan sintaksnya juga masuk akal. Tapi apakah cukup berbeda sampai punya alasan eksis sendiri? Siapa yang membuatnya?”
Lalu saya melihat Dave Abrahams yang sedang mengerjakannya, dan ketertarikan saya pun meningkat. Saya pernah bertemu dengannya di Apple dan juga ingat presentasi Crusty tentang Swift[1]. Saya suka pandangannya yang tegas, tetapi Apple belakangan menurunkan video itu dengan alasan ada saran lama di dalamnya. Sekarang ternyata dia ada di Adobe, jadi saya sempat bertanya-tanya apakah ini bahasa milik Adobe
Kesimpulannya, ini layak dipantau, dan setelah menonton presentasi yang ditautkan, saya memilih menunggu sambil melihat perkembangannya
[1] Saya menemukan presentasi Crusty itu: "I don't do Object Oriented!" https://www.youtube.com/watch?v=p3zo4ptMBiQ
Sebagai pengembang compiler, saya kaget melihat issue-issue berikut
https://github.com/val-lang/val/issues/758
https://github.com/val-lang/val/issues/711
Ini memberi kesan bahwa kondisi implementasinya kurang baik. Seharusnya mereka melakukan self-hosting secepat mungkin, dan dengan begitu akan menemukan lebih banyak bug mendasar seperti ini. Meski begitu, bintangnya sudah lebih dari 500
Self-hosting juga bukan segalanya. Itu lebih merupakan tonggak simbolis; ketika tercapai memang patut dirayakan, tetapi saya rasa itu bukan sesuatu yang layak dijadikan kelemahan bahasa tersebut sampai jauh di tahap akhir siklus pengembangan
Saya sudah lama menunda “bermain-main dengan Val”, dan akhirnya mencobanya hari ini, tetapi meski commit-nya sudah lebih dari 4.000, kondisinya masih jauh dari bisa dipakai. Sebagian besar contoh di tur bahasa tidak bisa dikompilasi, dan contoh yang terlihat sederhana pun gagal
Carbon juga belum benar-benar merilis sesuatu yang layak, sementara Sean Baxter membuat banyak kemajuan di compiler Circle dan sudah mengimplementasikan banyak bagian bagus dari Carbon. Jika itu masih sulit disebut sebagai sebuah bahasa, maka sulit juga menyebutnya sebagai penerus
Sekarang ada V, Val, Vala, dan Vale. Apakah ada bahasa lain yang saya lupa?
Ini memang komentar yang selalu muncul, tetapi satu-satunya hal yang tidak saya suka dari Val adalah bahwa Vale dan V juga merupakan bahasa sistem baru. Karena namanya, ketiganya terlalu mudah tertukar
Ada tulisan terkait. Apakah ada lagi?
Val, a new programing language inspired by Swift and Rust - https://news.ycombinator.com/item?id=31788527 - Juni 2022, 19 komentar
Saya sempat menelusuri makalah “mutable value semantics”, dan penasaran apakah saya benar memahami bahwa para penulis mengusulkan untuk mengganti reference dan pointer dengan a) sebagian indireksi dan pemeriksaan runtime melalui struct bersarang dan
Any, serta b) indeks arrayBagian yang menonjol adalah kalimat, “Wajar jika orang bertanya bagaimana tipe nilai yang dapat diubah bisa merepresentasikan struktur data self-reference seperti doubly linked list atau graf berarah. Faktanya, graf arbitrer dapat direpresentasikan sebagai adjacency list…” Saya tidak begitu melihat cara yang masuk akal untuk mengimplementasikan doubly linked list tanpa pada dasarnya membuat ulang memory heap dan semacam garbage collection di dalam implementasinya
Selain itu, saya juga menemukan diskusi di https://github.com/orgs/val-lang/discussions/736, dan sepertinya akan muncul jalan keluar seperti
unsafedi Rust. Jika begitu, semua masalah memang terselesaikan, tetapi pertanyaan “apakah subset aman dari Val saja cukup untuk membangun aplikasi praktis” tampaknya akan tetap menjadi bahan perdebatan untuk waktu yang lamaAlasan pendekatan itu tidak sebodoh yang terlihat adalah karena indeks-indeks ini terikat pada struktur data tertentu, misalnya doubly linked list atau graf, sehingga tidak mudah dimanipulasi untuk mengakses bagian lain dari program. Ini juga berlaku jika compiler memeriksanya, termasuk terhadap upaya untuk merusak program
Saya tidak paham bagaimana harus membaca penjelasan pada contoh di situs resminya. Tertulis, “Tidak ada alokasi yang tidak perlu. Hasil
longer_ofadalah projection dari argumen yang lebih panjang, sehingga jikaemphasizemengubah z, perubahan itu terjadi langsung pada nilai y. Nilai tersebut tidak disalin maupun dipindahkan, tetapi juga tidak diteruskan keemphasizesebagai referensi.”Dalam situasi ketika argumen string diteruskan ke fungsi lalu sebuah karakter ditambahkan, string yang sudah ada semestinya punya panjang awal serta lokasi dan ukuran tertentu di stack, jadi saya tidak mengerti bagaimana ini bisa dilakukan tanpa salinan baru dari y. Apakah string diberi padding ekstra di bagian akhir untuk berjaga-jaga jika seseorang menambahkan sesuatu? Jika begitu, padding-nya seberapa banyak, dan mengapa itu tidak malah jadi kurang efisien secara keseluruhan?
>untuk mengutip, dan itu bekerja baik meski parser tidak memberi perlakuan khususNamun saya punya pertanyaan serupa. Bagaimana jika yang diubah adalah string 1GB? Apakah ini copy-on-write?
Dalam 99% kasus mungkin akan hilang karena optimasi, tetapi terasa seperti 1% sisanya bisa menimbulkan penurunan performa yang sangat sulit ditemukan
longer_ofbukan fungsi melainkan subscript, dan subscript tidak mengembalikan nilai, melainkan mem-projection nilai dan memberi pemanggil hak akses baca/tulis sementaraSaya tetap tidak begitu paham bagaimana ini tidak dihitung sebagai perpindahan. Untuk string, mungkin seperti Rust, nilainya bisa ditempatkan di heap agar ukuran variabel tetap dimungkinkan