- Hylo apunta a la programación segura de sistemas y genérica con base en semántica de valores; aunque el compilador y la biblioteca estándar aún están en una etapa inicial, se pueden ejecutar ejemplos en Compiler Explorer
- La investigación del lenguaje se centra en temas como la extensión de inout projection para
subscriptde Swift, method bundles, concurrencia estructurada y listas doblemente enlazadas basadas en semántica de valores - El compilador usa LLVM y también aborda compilación genérica con coherence, caché y serialización del estado del programa, e investigación sobre interoperabilidad con C
- El entorno de desarrollo ofrece extensión para VSCode, compilador de documentación y un prototipo de Language Server, con soporte para SPM/CMake, Ninja/Xcode, Windows/Linux/macOS e imágenes Docker del toolchain de desarrollo
- Los ejemplos muestran reglas de propiedad y liberación a nivel de código mediante projection segura y sink method, ilustrando cómo un lenguaje de sistemas puede imponer seguridad
Alcance y estado actual de Hylo
- El compilador y la biblioteca estándar de Hylo aún están en una etapa inicial
- Se pueden ejecutar ejemplos de código avanzado de Hylo en Compiler Explorer
- También se ofrece un enlace para probar Hylo en Compiler Explorer desde la pantalla principal
Semántica de valores e investigación del lenguaje
- MVS & Theory se desarrolla en torno a semántica de valores, projection segura, concurrencia y representación de estructuras de datos
- Extensión del
subscriptde Swift con inout projection - Method bundles
- Structured concurrency made easy: concurrencia estructurada sin thread hopping ni function coloring
- La forma de representar listas doblemente enlazadas con semántica de valores es más segura y rápida que una implementación con reference semantics
- Extensión del
Compilador y biblioteca estándar
- El trabajo del compilador abarca compilación basada en LLVM, genéricos, persistencia de estado e interoperabilidad con C
- Compilación con LLVM
- Nueva técnica para compilación genérica con coherence
- Caché y serialización del estado del programa en el compilador
- Investigación sobre C interop
- En la biblioteca estándar, actualmente se publican documentación de la implementación y trabajos relacionados con algoritmos de colecciones
- La documentación de la implementación actual incluye traits básicos y estructuras de datos
- Positionless Collection Algorithms
- rs-stl: port a Rust de algoritmos STL de C++ para mejorar la programación genérica
Experiencia de desarrollador y entorno de compilación
- También se ofrecen herramientas para editor, documentación y servidor de lenguaje
- VSCode extension: soporte para resaltado de sintaxis y ejecución de código
- Documentation compiler
- Prototipo de Language Server
- El entorno de compilación y desarrollo soporta varios sistemas operativos y flujos basados en contenedores
- Soporte para Development Containers para reducir los pasos de inicio
- Soporte para SPM/CMake, Ninja/Xcode, Windows/Linux/macOS
- Plugin de compilador para generación de pruebas
- Imagen Docker precompilada del Hylo development toolchain
- El compilador está escrito en Swift 6.2
Investigación y materiales de presentación sobre Hylo
- Los materiales alrededor de Hylo están organizados en artículos, presentaciones y podcasts
- Entre los artículos y documentos recientes se incluyen los siguientes
- 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
- Los materiales de presentación tratan concurrencia estructurada, lenguaje seguro de sistemas y programación genérica, HyloDoc, borrow checking, interoperabilidad con C++ y semántica de valores
- 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
Ejemplos de código: projection segura y liberación explícita
- El ejemplo Subscripts - A Safe Projection Mechanism muestra una estructura donde el tipo
Anglealmacena el valorradiansy expone la propiedaddegreesmediante bloquesleteinout- El bloque
letdedegreesconvierte radians a degrees y lo devuelve inoutexpone un valor temporal en degreesdconyield &dy luego vuelve a convertir el valor modificado a radians para reflejarlo enself.radiansmainobtiene una projection coninout d = &a.degrees, cambiada0.0y luego verifica quea.radians == 0.0
- El bloque
- El ejemplo Sink Methods - Capability for Deinitializing muestra una estructura donde el tipo
Computerproveeshutdown()como sink methodshutdown()imprime el contenido de la memoria y luego aplica sink aself.ram- En
test1, se crea unComputery no se hace shutdown, por lo que ocurreCannot deinit computer - En
test2, como shutdown solo se ejecuta dentro deif random_bool(), en la ruta donde no se entra alifocurreCannot deinit computer - En
test3, si se llama a shutdown dentro dewhile, después de la primera iteración aparece un problema por usar un objeto ya consumido, y en la ruta donde no se entra alwhilesigue quedando la imposibilidad de deinit
- Se pueden revisar ejemplos adicionales en la compiler test suite
1 comentarios
Opiniones de Hacker News
Como sucesor de C++, quizá Val me entusiasme más que el excelente CppFront de Herb Sutter. Solo vi las dos charlas de abajo, pero sus puntos clave parecen ser compilación estática, tipado estático, interoperabilidad con C++, seguridad de memoria, seguridad de tipos y ausencia de carreras de datos.
Cuando lo explico, digo algo como: “Supongamos que empiezas un nuevo proyecto en C++ y, dejando de lado el rendimiento, pasas todo por valor y devuelves todo por valor, sin punteros ni referencias; sería bueno no tener que preocuparse por efectos secundarios ni carreras de datos”. Lo interesante de Val es que, aunque el lenguaje elimine los punteros y las referencias, el compilador internamente aplica paso por referencia const y optimización de valores de retorno, de modo que conserva al mismo tiempo la semántica deseada y el rendimiento.
Val: 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/
Creo que el intérprete de PHP es lo bastante inteligente como para usar copia en escritura (copy-on-write) en la práctica, aunque nunca lo perfilé directamente. Aun así, no noté problemas de rendimiento perceptibles, incluso haciendo en cada carga de página procesamiento de datos bastante complejo, parsing de DSL carácter por carácter, generación dinámica de SQL y masajeo de resultados en estructuras arbitrarias.
En la época de PHP 4, los objetos también se comportaban como valores almacenados en variables; cuando luego cambiaron las variables de objeto a semántica de referencia, creo que fue una oportunidad perdida no convertir “valor, referencia a variable, puntero a valor” en atributos de variable ortogonales al tipo almacenado.
$a = $b; // copia el valor de $b en $a$a = &$b; // $a y $b ahora son la misma variable$a = *$b; // $a apunta al mismo objeto que $b, pero a diferencia de $a = &$b, las variables en sí no quedan vinculadasPor un lado, es bueno que estén apareciendo tantos lenguajes de abstracción sin costo, pero también me gustaría que los programadores de sistemas ya eligieran un ganador. Ojalá la ya pequeña comunidad de programadores de sistemas no se fragmente aún más entre Rust, Zig, Val, etc., y que la guerra de lenguajes de sistemas termine pronto.
Hoy conocí Val por primera vez, y mi secuencia de emociones fue esta: “Oh, un nuevo lenguaje de sistemas. Puede que no sea gran cosa, pero veamos. La documentación está bien. Las ideas sobre ownership son bastante consideradas y la sintaxis tiene sentido. Pero ¿es lo bastante distinto como para justificar su propia existencia? ¿Quién lo está haciendo?”
Entonces vi que Dave Abrahams está trabajando en él y me interesó más. Me lo crucé en Apple y recuerdo su charla Crusty sobre Swift[1]. Me gustaban sus opiniones fuertes, pero Apple luego bajó ese video porque contenía consejos antiguos. Ahora está en Adobe, así que me pregunto si este será un lenguaje de Adobe.
Mi conclusión es que vale la pena seguirlo, ver la charla enlazada y esperar.
[1] Encontré la charla Crusty: "I don't do Object Oriented!" https://www.youtube.com/watch?v=p3zo4ptMBiQ
Como desarrollador de compiladores, me impactó ver estos issues
https://github.com/val-lang/val/issues/758
https://github.com/val-lang/val/issues/711
Huele a que el estado de la implementación no es bueno. Deberían llegar al self-hosting lo antes posible, y entonces encontrarán más de estos bugs básicos. Aun así tiene más de 500 estrellas
El self-hosting tampoco lo es todo. Más que nada es un hito simbólico, y cuando se logra es algo para celebrar, pero no creo que deba considerarse una debilidad del lenguaje hasta mucho más adelante en el ciclo de desarrollo
Desde hace tiempo venía posponiendo “jugar con Val” y hoy por fin lo intenté, pero aunque tiene más de 4,000 commits, todavía está lejos de ser usable. La mayoría de los ejemplos del tour del lenguaje no compilan, e incluso ejemplos que a simple vista parecen simples fallan
Carbon todavía no ha presentado nada sólido, y Sean Baxter está avanzando mucho con el compilador Circle e implementando también varias de las partes buenas de Carbon. Si todavía es difícil considerarlo un lenguaje, también es difícil que sea un sucesor
Ahora existen V, Val, Vala y Vale. ¿Hay algún otro lenguaje que esté olvidando?
Es un comentario que aparece siempre, pero lo único que no me gusta de Val es que Vale y V también sean nuevos lenguajes de sistemas. Por los nombres, es demasiado fácil confundir los tres
Hay una publicación relacionada. ¿Hay más?
Val, a new programing language inspired by Swift and Rust - https://news.ycombinator.com/item?id=31788527 - junio de 2022, 19 comentarios
Le eché un vistazo al paper sobre “mutable value semantics”, y me pregunto si entiendo bien que los autores proponen reemplazar referencias y punteros por a) cierta indirección y chequeos en runtime mediante structs anidados y
Any, y b) índices de arreglosMe llamó la atención el pasaje: “Es válido preguntar cómo se pueden expresar estructuras de datos autorreferenciales como listas doblemente enlazadas o grafos dirigidos con tipos de valor mutables. De hecho, cualquier grafo arbitrario se puede representar como una lista de adyacencia…”. No veo bien cómo implementar razonablemente una lista doblemente enlazada sin volver a crear dentro de la implementación un heap de memoria y una especie de garbage collection
Además encontré una discusión en https://github.com/orgs/val-lang/discussions/736, y parece que habrá una vía de escape similar a
unsafede Rust. Eso resuelve todos los problemas, pero la pregunta de si “el subconjunto seguro de Val por sí solo basta para crear aplicaciones prácticas” probablemente seguirá siendo motivo de debate por mucho tiempoLa razón por la que esto es menos tonto de lo que parece es que esos índices están ligados a una estructura de datos específica, por ejemplo una lista doblemente enlazada o un grafo, así que no es fácil manipularlos para acceder a otra parte del programa. Eso aplica tanto cuando el compilador lo verifica como ante intentos de romper el programa
No sé cómo debería leerse la explicación del ejemplo de la página principal. Dice: “No se producen asignaciones innecesarias. Como el resultado de
longer_ofes una proyección del argumento más largo, siemphasizemodifica z, el cambio se aplica directamente al valor de y. El valor no se copia ni se mueve, pero tampoco se pasa por referencia aemphasize”.Se trata de una situación en la que se pasa un argumento de cadena a una función y se le agrega un carácter, pero la cadena existente debía tener una longitud inicial y una ubicación y tamaño concretos en la pila; no entiendo cómo puede ser posible sin una nueva copia de y. ¿Acaso dejan padding extra al final de la cadena por si alguien le agrega algo? Si es así, ¿cuánto padding dejan y por qué no resulta más ineficiente en general?
>para citar, y funciona bien aunque el parser no le dé un tratamiento especial.Pero tengo una duda parecida. ¿Qué pasa si se modifica una cadena de 1 GB? ¿Es copy-on-write?
En el 99% de los casos quizá pueda desaparecer con optimizaciones, pero me da la sensación de que en el 1% restante podría aparecer una degradación de rendimiento muy difícil de encontrar.
longer_ofno es una función, sino un subscript, y dicen que un subscript no devuelve un valor, sino que proyecta un valor y concede al llamador acceso temporal de lectura/escritura.No entiendo bien por qué eso no cuenta como un movimiento. En el caso de las cadenas, también podrían ponerlas en el heap, como Rust, para permitir tamaño variable.