Die High-Level-Systemprogrammiersprache Hylo (Val)
(val-lang.dev)- Hylo zielt auf sichere System- und generische Programmierung auf Basis von Wertsemantik; Compiler und Standardbibliothek befinden sich noch in einer frühen Phase, aber Beispiele lassen sich im Compiler Explorer ausführen
- Die Sprachforschung konzentriert sich auf Themen wie die Erweiterung von Swifts subscript um inout projection, method bundles, strukturierte Nebenläufigkeit und doppelt verkettete Listen auf Basis von Wertsemantik
- Der Compiler verwendet LLVM und behandelt zugleich generische Kompilierung mit Coherence, Caching und Serialisierung von Programmzustand sowie Forschung zur C-Interoperabilität
- Die Entwicklungsumgebung bietet eine VSCode-Erweiterung, einen Dokumentations-Compiler und einen Language-Server-Prototyp und unterstützt SPM/CMake, Ninja/Xcode, Windows/Linux/macOS sowie Docker-Toolchain-Images für die Entwicklung
- Die Beispiele machen über sichere projection und sink methods Eigentums- und Freigaberegeln auf Code-Ebene sichtbar und zeigen, wie eine Systemsprache Sicherheit erzwingen kann
Umfang und aktueller Stand von Hylo
- Compiler und Standardbibliothek von Hylo befinden sich noch in einer frühen Phase
- Fortgeschrittene Hylo-Codebeispiele lassen sich im Compiler Explorer ausführen
- Schon auf der Startseite gibt es einen Link, um Hylo im Compiler Explorer auszuprobieren
Wertsemantik und Sprachforschung
- MVS & Theory entwickelt sich rund um Wertsemantik, sichere projection, Nebenläufigkeit und die Darstellung von Datenstrukturen
- Erweiterung von Swifts subscript um inout projection
- Method bundles
- Structured concurrency made easy: strukturierte Nebenläufigkeit ohne thread hopping und function coloring
- Die Darstellung doppelt verketteter Listen mit Wertsemantik ist sicherer und schneller als eine Implementierung mit reference semantics
Compiler und Standardbibliothek
- Die Arbeit am Compiler umfasst LLVM-basierte Kompilierung, Generics, Zustandsverwaltung und C-Interoperabilität
- Kompilierung mit LLVM
- Neue Technik für generische Kompilierung mit Coherence
- Caching und Serialisierung des Programmzustands im Compiler
- Forschung zu C interop
- Auf Seiten der Standardbibliothek werden derzeit Dokumentation zur Implementierung und Arbeiten zu Collection-Algorithmen veröffentlicht
- Die aktuelle Implementierungsdokumentation enthält grundlegende Traits und Datenstrukturen
- Positionless Collection Algorithms
- rs-stl: Rust-Port der C++-STL-Algorithmen zur Verbesserung generischer Programmierung
Developer Experience und Build-Umgebung
- Es werden auch Tools für Editor, Dokumentation und Sprachserver bereitgestellt
- VSCode extension: unterstützt Syntax-Highlighting und Codeausführung
- Documentation compiler
- Prototyp eines Language Server
- Build- und Entwicklungsumgebung unterstützen mehrere Betriebssysteme und containerbasierte Workflows
- Unterstützung für Development Containers verkürzt den Einstieg
- Unterstützung für SPM/CMake, Ninja/Xcode, Windows/Linux/macOS
- Compiler-Plugin zur Testgenerierung
- Vorgebaute Docker-Images der Hylo development toolchain
- Der Compiler ist in Swift 6.2 geschrieben
Forschung und Vortragsmaterial zu Hylo
- Rund um Hylo sind Materialien in Form von Papers, Vorträgen und Podcasts zusammengestellt
- Zu den neueren Papers und Dokumenten gehören unter anderem folgende Einträge
- 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
- Die Vortragsmaterialien behandeln strukturierte Nebenläufigkeit, sichere System- und generische Sprachen, HyloDoc, Borrow Checking, C++-Interoperabilität und Wertsemantik
- 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
Codebeispiele: sichere projection und explizite Freigabe
- Das Beispiel Subscripts - A Safe Projection Mechanism zeigt eine Struktur, in der der Typ
Angleden Wertradiansspeichert und die Propertydegreesüberlet- undinout-Blöcke bereitstellt- Das
letvondegreeskonvertiert radians in degree und gibt den Wert zurück inoutlegt den temporären degree-Wertdüberyield &doffen, konvertiert danach den geänderten Wert zurück in radians und übernimmt ihn inself.radiansmainholt sich mitinout d = &a.degreeseine projection, setztdauf0.0und prüft anschließenda.radians == 0.0
- Das
- Das Beispiel Sink Methods - Capability for Deinitializing zeigt eine Struktur, in der der Typ
Computershutdown()als sink method bereitstelltshutdown()gibt den Speicherinhalt aus und behandelt danachself.ramals sinktest1erstellt einenComputerund fährt ihn nicht herunter, wodurchCannot deinit computerentstehttest2ruftshutdown()nur innerhalb vonif random_bool()auf, sodass auf dem Pfad ohne Eintritt in dasifweiterhinCannot deinit computerentstehttest3ruftshutdown()innerhalb vonwhileauf; dadurch entsteht nach der ersten Iteration ein Problem durch die Nutzung eines bereits konsumierten Objekts, und auf Pfaden ohne Eintritt in daswhilebleibt die fehlende Deinitialisierung bestehen
- Weitere Beispiele finden sich in der compiler test suite
1 Kommentare
Hacker-News-Kommentare
Als C++-Nachfolger könnte Val vielleicht sogar spannender sein als Herb Sutters hervorragendes CppFront. Ich habe bisher nur die beiden Vorträge unten gesehen, aber statische Kompilierung, statische Typisierung, C++-Interoperabilität, Speichersicherheit, Typsicherheit und keine Data Races scheinen die Kernelemente zu sein
Wenn ich es erkläre, sage ich etwa: „Wenn man ein neues C++-Projekt startet und annimmt, dass einem Performance egal ist, wäre es dann nicht schön, alles ohne Pointer oder Referenzen per Wert zu übergeben und per Wert zurückzugeben, sodass man sich keine Sorgen über Seiteneffekte oder Data Races machen muss?“ Interessant an Val ist, dass die Sprache Pointer und Referenzen entfernt, der Compiler aber intern trotzdem
const-Referenzübergabe und Return-Value-Optimierung anwendet, sodass die gewünschte Semantik und Performance gleichzeitig erhalten bleibenVal: 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/
Ich nehme an, dass der PHP-Interpreter schlau genug ist, tatsächlich Copy-on-Write zu verwenden, aber ich habe es nie selbst profiliert. Trotzdem hatte ich nie spürbare Performance-Probleme, obwohl ich bei jedem Seitenaufruf recht komplexe Datenverarbeitung, zeichenweises Parsing einer DSL, dynamische SQL-Erzeugung und das Umarbeiten der Ergebnisse in beliebige Strukturen gemacht habe
Zu PHP-4-Zeiten verhielten sich sogar Objekte wie in Variablen gespeicherte Werte. Als Objektvariablen später auf Referenzsemantik umgestellt wurden, war es meiner Meinung nach eine verpasste Chance, „Wert, Variablenreferenz und Pointer auf einen Wert“ nicht als Variableneigenschaften orthogonal zum Speichertyp zu gestalten
$a = $b; // kopiert den Wert von $b nach $a$a = &$b; // $a und $b sind jetzt dieselbe Variable$a = *$b; // $a zeigt auf dasselbe Objekt wie $b, aber anders als bei $a = &$b sind die Variablen selbst nicht verknüpftEinerseits ist es gut, dass so viele Sprachen für Zero-Cost Abstractions auftauchen, aber andererseits hätte ich gern, dass sich Systemprogrammierer langsam auf einen Sieger einigen. Hoffentlich zersplittert die ohnehin kleine Community der Systemprogrammierer nicht noch weiter in Rust, Zig, Val usw., und die Systemsprachenkriege enden bald
So verlief heute mein emotionaler Erstkontakt mit Val: „Oh, eine neue Systemprogrammiersprache. Vielleicht nichts Besonderes, aber schauen wir mal. Die Dokumentation ist ordentlich. Die Ideen rund um Ownership sind ziemlich durchdacht, und die Syntax ergibt Sinn. Aber ist es genug anders, um eine eigene Daseinsberechtigung zu haben? Wer macht das eigentlich?“
Dann sah ich, dass Dave Abrahams daran arbeitet, und mein Interesse stieg. Ich bin ihm bei Apple einmal begegnet und erinnere mich auch an seinen Crusty-Vortrag über Swift[1]. Seine starken Meinungen mochte ich, aber Apple nahm das Video später herunter, mit der Begründung, es enthalte veraltete Ratschläge. Jetzt ist er also bei Adobe; da fragt man sich, ob das so etwas wie eine Adobe-Sprache ist
Mein Fazit ist: Es lohnt sich, das im Auge zu behalten, und nach dem verlinkten Vortrag erst einmal abzuwarten
[1] Ich habe den Crusty-Vortrag gefunden: "I don't do Object Oriented!" https://www.youtube.com/watch?v=p3zo4ptMBiQ
Als Compiler-Entwickler war ich schockiert, als ich die folgenden Issues gesehen habe
https://github.com/val-lang/val/issues/758
https://github.com/val-lang/val/issues/711
Das riecht nach einem schlechten Implementierungsstand. Sie sollten so schnell wie möglich self-hosting werden, dann würden sie mehr solcher grundlegenden Bugs finden. Trotzdem haben sie schon über 500 Sterne
Self-hosting ist auch nicht alles. Es ist vor allem ein symbolischer Meilenstein; wenn man ihn erreicht, ist das ein Grund zum Feiern, aber ich finde nicht, dass es bis weit später im Entwicklungszyklus als Schwäche der Sprache gelten sollte
Ich hatte „mit Val herumspielen“ schon lange aufgeschoben und es heute endlich versucht, aber auch nach über 4.000 Commits ist es noch weit davon entfernt, benutzbar zu sein. Die meisten Beispiele im Sprachüberblick kompilieren nicht, und selbst scheinbar einfache Beispiele schlagen fehl
Carbon hat noch nichts wirklich Vorzeigbares veröffentlicht, und Sean Baxter macht mit dem Circle-Compiler große Fortschritte und hat schon viele der guten Teile von Carbon umgesetzt. Wenn man noch kaum als Sprache gelten kann, ist es auch schwer, ein Nachfolger zu werden
Inzwischen gibt es V, Val, Vala, Vale. Gibt es noch andere Sprachen, die ich vergessen habe?
Das kommt zwar jedes Mal zur Sprache, aber das Einzige, was mir an Val nicht gefällt, ist, dass Vale und V ebenfalls neue Systemsprachen sind. Wegen der Namen lassen sich die drei viel zu leicht verwechseln
Dazu gibt es einen verwandten Beitrag. Gibt es noch mehr?
Val, a new programing language inspired by Swift and Rust - https://news.ycombinator.com/item?id=31788527 - Juni 2022, 19 Kommentare
Ich habe das Paper über „mutable value semantics“ überflogen und frage mich, ob ich es richtig verstehe, dass die Autoren vorschlagen, Referenzen und Pointer durch a) verschachtelte Structs und etwas Indirektion sowie Laufzeitprüfungen über
Anyund b) Array-Indizes zu ersetzenMir fiel die Passage auf: „Es ist berechtigt zu fragen, wie man selbstreferenzielle Datenstrukturen wie doppelt verkettete Listen oder gerichtete Graphen mit veränderlichen Werttypen ausdrücken kann. Tatsächlich lassen sich beliebige Graphen als Adjazenzlisten darstellen …“ Ich sehe nicht so recht, wie man doppelt verkettete Listen vernünftig implementieren soll, ohne innerhalb der Implementierung wieder einen Speicher-Heap und eine Art Garbage Collection nachzubauen
Außerdem habe ich die Diskussion unter https://github.com/orgs/val-lang/discussions/736 gefunden, und es scheint, als werde es einen Fluchtweg ähnlich wie
unsafein Rust geben. Damit wären zwar alle Probleme lösbar, aber die Frage „Reicht die sichere Teilmenge von Val aus, um praktische Anwendungen zu bauen?“ dürfte noch lange Stoff für Debatten liefernWeniger dumm als gedacht ist das deshalb, weil diese Indizes an eine bestimmte Datenstruktur gebunden sind, etwa eine doppelt verkettete Liste oder einen Graphen, und sich daher nicht so leicht manipulieren lassen, um auf andere Teile des Programms zuzugreifen. Das gilt auch dann, wenn der Compiler das prüft, selbst bei dem Versuch, das Programm kaputtzumachen
Ich weiß nicht, wie ich die Erklärung des Beispiels auf der Homepage lesen soll. Dort steht: „Es gibt keine unnötigen Allokationen. Das Ergebnis von
longer_ofist eine Projektion des längeren Arguments, sodass Änderungen an z durchemphasizedirekt den Wert von y verändern. Der Wert wird weder kopiert noch verschoben, wird aber auch nicht als Referenz anemphasizeübergeben.“Es ist eine Situation, in der ein String-Argument an eine Funktion übergeben und ein Zeichen angehängt wird. Der bestehende String hätte doch eine ursprüngliche Länge sowie eine bestimmte Position und Größe auf dem Stack — ich verstehe nicht, wie das ohne eine neue Kopie von y möglich sein soll. Lässt man vielleicht am Ende des Strings zusätzlichen Puffer für den Fall, dass jemand etwas anhängt? Wenn ja, wie viel Puffer, und warum ist das insgesamt nicht ineffizienter?
>, und das funktioniert auch gut, ohne dass der Parser es speziell behandeln mussIch habe allerdings eine ähnliche Frage. Was passiert, wenn man einen 1-GB-String verändert? Ist das Copy-on-Write?
In 99 % der Fälle kann das vermutlich durch Optimierung verschwinden, aber in dem verbleibenden 1 % scheint mir das eine sehr schwer aufspürbare Performance-Verschlechterung zu sein
longer_ofist keine Funktion, sondern ein subscript, und ein subscript gibt keinen Wert zurück, sondern projiziert einen Wert und gibt dem Aufrufer temporäre Lese-/SchreibzugriffsrechteIch verstehe nicht ganz, warum das nicht als Move gilt. Bei Strings könnte man sie wie in Rust auf dem Heap ablegen, um variable Größe zu erlauben