- Hylo busca programação de sistemas e genérica segura com base em semântica de valor; o compilador e a biblioteca padrão ainda estão em estágio inicial, mas já é possível executar exemplos no Compiler Explorer
- A pesquisa da linguagem se concentra em temas como a extensão de inout projection para o subscript do Swift, method bundles, concorrência estruturada e listas duplamente encadeadas baseadas em semântica de valor
- O compilador usa LLVM e também aborda compilação genérica com coherence, cache e serialização do estado do programa, além de pesquisa sobre interoperabilidade com C
- O ambiente de desenvolvimento oferece extensão para VSCode, compilador de documentação e protótipo de Language Server, com suporte a SPM/CMake, Ninja/Xcode, Windows/Linux/macOS e imagens Docker de toolchain de desenvolvimento
- Os exemplos mostram, por meio de projection segura e sink method, como as regras de posse e liberação aparecem no nível do código e como uma linguagem de sistemas pode impor segurança
Escopo e estado atual do Hylo
- O compilador e a biblioteca padrão do Hylo ainda estão em estágio inicial
- Exemplos avançados de código Hylo podem ser executados no Compiler Explorer
- A página inicial também oferece um link para experimentar Hylo no Compiler Explorer
Semântica de valor e pesquisa da linguagem
- MVS & Theory se desenvolve em torno de semântica de valor, projection segura, concorrência e representação de estruturas de dados
- Extensão do subscript do Swift com inout projection
- Method bundles
- Structured concurrency made easy: concorrência estruturada sem thread hopping e sem function coloring
- A forma de representar listas duplamente encadeadas com semântica de valor é mais segura e rápida do que implementações baseadas em semântica de referência
Compilador e biblioteca padrão
- O trabalho no compilador abrange compilação baseada em LLVM, genéricos, persistência de estado e interoperabilidade com C
- Compilação usando LLVM
- Nova técnica para compilação genérica com coherence
- Cache e serialização do estado do programa no compilador
- Pesquisa sobre C interop
- Do lado da biblioteca padrão, já foram publicados documentos da implementação atual e trabalhos relacionados a algoritmos de coleção
- A documentação da implementação atual inclui traits e estruturas de dados básicas
- Positionless Collection Algorithms
- rs-stl: port de algoritmos da STL do C++ para Rust para melhorar a programação genérica
Experiência do desenvolvedor e ambiente de build
- Ferramentas para editor, documentação e servidor de linguagem são fornecidas em conjunto
- VSCode extension: suporte a destaque de sintaxe e execução de código
- Documentation compiler
- Protótipo de Language Server
- O ambiente de build e desenvolvimento oferece suporte a vários sistemas operacionais e fluxos baseados em contêineres
- Suporte a Development Containers para reduzir o processo inicial
- Suporte a SPM/CMake, Ninja/Xcode, Windows/Linux/macOS
- Plugin de compilador para geração de testes
- Imagens Docker pré-compiladas da Hylo development toolchain
- O compilador é escrito em Swift 6.2
Pesquisas e materiais de apresentação sobre Hylo
- Os materiais relacionados ao Hylo estão organizados em artigos, apresentações e podcasts
- Entre os artigos e documentos recentes estão os itens abaixo
- 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
- Os materiais de apresentação tratam de concorrência estruturada, linguagem segura para sistemas e programação genérica, HyloDoc, borrow checking, interoperabilidade com C++ e semântica de valor
- 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
Exemplo de código: projection segura e liberação explícita
- O exemplo Subscripts - A Safe Projection Mechanism mostra uma estrutura em que o tipo
Anglearmazena o valorradianse oferece a propriedadedegreescom blocosleteinout- O bloco
letdedegreesconverte radians em degrees e retorna o resultado - O bloco
inoutexpõe um valor temporário em degrees,d, comyield &de depois converte o valor alterado de volta para radians, refletindo-o emself.radians mainobtém a projection cominout d = &a.degrees, alteradpara0.0e então verificaa.radians == 0.0
- O bloco
- O exemplo Sink Methods - Capability for Deinitializing apresenta uma estrutura em que o tipo
Computerforneceshutdown()como sink methodshutdown()imprime o conteúdo da memória e depois aplica sink aself.ram- Em
test1, umComputeré criado e não é desligado, então ocorreCannot deinit computer - Em
test2,shutdown()é chamado apenas dentro deif random_bool(), então no caminho em que oifnão é executado ocorreCannot deinit computer - Em
test3, chamarshutdown()dentro dewhilecausa, após a primeira iteração, um problema de uso de objeto já consumido, e no caminho em que owhilenão é executado permanece a impossibilidade de deinit
- Exemplos adicionais podem ser vistos na compiler test suite
1 comentários
Opiniões do Hacker News
Talvez eu esteja mais animado com Val como sucessor de C++ do que com o excelente CppFront de Herb Sutter. Só vi as duas apresentações abaixo, mas os pontos centrais parecem ser compilação estática, tipagem estática, interoperabilidade com C++, segurança de memória, segurança de tipos e ausência de data races
Quando explico, digo algo como: “suponha que você esteja começando um novo projeto em C++ e não se importe com desempenho; se passar tudo por valor e retornar tudo por valor, sem ponteiros nem referências, não seria bom por não precisar se preocupar com efeitos colaterais ou data races?” O interessante no Val é que, mesmo removendo ponteiros e referências da linguagem, o compilador internamente aplica passagem por referência const e otimização de valor de retorno, preservando ao mesmo tempo a semântica e o desempenho desejados
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/
Imagino que o interpretador PHP seja esperto o bastante para usar cópia na escrita (copy-on-write) na prática, mas nunca fiz profiling por conta própria. Mesmo assim, ao fazer processamento de dados bem complexo, parsing de DSL caractere por caractere, geração dinâmica de SQL e transformação dos resultados em estruturas arbitrárias a cada carregamento de página, nunca senti problemas de desempenho
Na época do PHP 4, objetos também se comportavam como valores armazenados em variáveis; depois, quando mudaram variáveis de objeto para semântica de referência, acho que foi uma oportunidade perdida não transformar “valor, referência de variável, ponteiro para valor” em atributos de variável ortogonais ao tipo armazenado
$a = $b; // copia o valor de $b para $a$a = &$b; // $a e $b agora são a mesma variável$a = *$b; // $a aponta para o mesmo objeto que $b, mas, ao contrário de $a = &$b, as variáveis em si não ficam vinculadasPor um lado, é bom ver surgirem tantas linguagens de abstração de custo zero, mas eu também queria que os programadores de sistemas escolhessem logo uma vencedora. Espero que a comunidade já pequena de programadores de sistemas não se fragmente ainda mais entre Rust, Zig, Val etc., e que a guerra das linguagens de sistemas acabe logo
O fluxo de sentimentos ao conhecer Val hoje pela primeira vez foi mais ou menos assim: “Ah, uma nova linguagem de sistemas. Talvez não seja nada demais, mas vamos ver. A documentação é boa. As ideias sobre ownership são bem ponderadas e a sintaxe faz sentido. Mas ela é diferente o bastante para justificar existir por conta própria? Quem está por trás?”
Então vi que Dave Abrahams está trabalhando nela e fiquei mais interessado. Já o encontrei na Apple e lembro da palestra Crusty[1] dele sobre Swift. Gostei das opiniões fortes, mas a Apple depois retirou o vídeo alegando que havia conselhos desatualizados. Agora ele está na Adobe, então fico pensando se esta é uma linguagem da Adobe
A conclusão é que vale acompanhar, assistir à apresentação linkada e esperar para ver
[1] Encontrei a palestra Crusty: "I don't do Object Oriented!" https://www.youtube.com/watch?v=p3zo4ptMBiQ
Como desenvolvedor de compiladores, fiquei chocado ao ver os issues abaixo
https://github.com/val-lang/val/issues/758
https://github.com/val-lang/val/issues/711
Isso cheira a um estado de implementação ruim. Eles precisam chegar ao auto-hospedagem o quanto antes; assim vão encontrar mais bugs básicos desse tipo. Mesmo assim, já tem mais de 500 estrelas
Auto-hospedagem também não é tudo. Acima de tudo, é mais um marco simbólico; quando alcançado, é algo a celebrar, mas não acho que deva ser usado como fraqueza da linguagem até bem mais adiante no ciclo de desenvolvimento
Há tempos eu vinha adiando “brincar com Val” e hoje finalmente tentei; mesmo com mais de 4.000 commits, ainda está longe de ser utilizável. A maioria dos exemplos do tour da linguagem não compila, e até exemplos aparentemente simples falham
Carbon ainda não apresentou nada de fato, e Sean Baxter vem fazendo muito progresso no compilador Circle, implementando também várias das boas partes de Carbon. Se ainda é difícil chamar de linguagem, também é difícil ser sucessora
Agora temos V, Val, Vala e Vale. Tem alguma outra linguagem que estou esquecendo?
É um assunto recorrente, mas a única coisa de que não gosto em Val é que Vale e V também são novas linguagens de sistemas. Por causa dos nomes, é fácil demais confundir as três
Há um post relacionado. Tem outros?
Val, a new programing language inspired by Swift and Rust - https://news.ycombinator.com/item?id=31788527 - junho de 2022, 19 comentários
Dei uma passada pelo artigo sobre “mutable value semantics” e fiquei me perguntando se entendi certo que os autores propõem substituir referências e ponteiros por a) alguma indireção e verificação em runtime via structs aninhadas e
Any, e b) índices de arraysUm trecho que me chamou a atenção foi: “É justo perguntar como estruturas de dados autorreferenciais, como listas duplamente encadeadas ou grafos direcionados, podem ser expressas com tipos de valor mutáveis. Na verdade, grafos arbitrários podem ser representados como listas de adjacência…”. Não vejo muito bem como implementar uma lista duplamente encadeada de forma razoável sem recriar, dentro da implementação, um heap de memória e alguma forma de garbage collection
Além disso, encontrei uma discussão em https://github.com/orgs/val-lang/discussions/736, e parece que vai surgir uma válvula de escape como o
unsafedo Rust. Isso resolve todos os problemas, mas a pergunta “o subconjunto seguro de Val é suficiente para criar aplicações práticas?” deve continuar sendo debatida por muito tempoO motivo pelo qual isso é menos tolo do que parece é que esses índices ficam vinculados a uma estrutura de dados específica, por exemplo uma lista duplamente encadeada ou um grafo, então não é fácil manipulá-los para acessar outras partes do programa. Isso vale tanto quando o compilador verifica isso quanto em tentativas de quebrar o programa
Não sei como ler a explicação do exemplo na página inicial. Ela diz: “Não ocorrem alocações desnecessárias. Como o resultado de
longer_ofé uma projection do argumento mais longo, quandoemphasizealtera z, a mudança acontece diretamente no valor de y. O valor não é copiado nem movido, mas também não é passado por referência paraemphasize”É uma situação em que um argumento string é passado para uma função e um caractere é acrescentado, mas a string existente deveria ter um comprimento inicial e uma posição/tamanho específicos na stack; então não entendo como isso seria possível sem uma nova cópia de y. Será que deixam um padding extra no fim da string para o caso de alguém acrescentar algo? Se for isso, quanto padding deixam, e por que isso não seria, no geral, mais ineficiente?
>para citar, e funciona bem mesmo sem o parser tratar isso de forma especialAinda assim, tenho uma dúvida parecida. O que acontece ao modificar uma string de 1 GB? É copy-on-write?
Em 99% dos casos isso pode desaparecer por otimização, mas tenho a impressão de que no 1% restante poderia surgir uma queda de desempenho muito difícil de encontrar
longer_ofnão é uma função, mas um subscript, e dizem que um subscript não retorna um valor; ele faz uma projection do valor e concede ao chamador acesso temporário de leitura/escritaNão entendo muito bem como isso não conta como movimento. No caso de strings, talvez elas possam ficar no heap, como em Rust, para permitir tamanho variável