Estou interessado em design de linguagem e, em geral, posso raciocinar facilmente sobre recursos amplamente conhecidos (por exemplo, herança, polimorfismo, delegados, lambdas, capturas, coleta de lixo, exceções, genéricos, variação, reflexão etc.), suas interações em um linguagem específica, as formas como elas podem ser implementadas, suas limitações etc.
Nos últimos meses, comecei a ler sobre o Rust, que possui um sistema de propriedade que garante a segurança da memória e o gerenciamento determinístico de recursos, forçando a vida útil do objeto a ser estaticamente verificável. Da perspectiva de um usuário comum da linguagem, eu pude entender o sistema quase imediatamente.
Da perspectiva de um designer de linguagem, no entanto, levei um tempo para perceber por que as coisas no Rust são exatamente do jeito que são. Eu não conseguia entender imediatamente o raciocínio por trás de algumas restrições do sistema de propriedade, até me forçar a apresentar casos que violariam a integridade de um sistema se ele não tivesse esses aspectos.
Minha principal pergunta não tem nada a ver com o Rust e sua propriedade especificamente - mas fique à vontade para usá-lo como exemplo em seus comentários / respostas, se necessário.
Quando os designers de linguagem projetam um novo recurso, que metodologia ou processo eles usam para decidir se o recurso funciona corretamente?
Por "novo", quero dizer que não é algo que já foi testado em idiomas existentes (e, portanto, a maior parte do trabalho foi realizada por outros designers). Por "funciona corretamente", quero dizer que o recurso resolve o problema pretendido corretamente e é razoavelmente à prova de balas. Por "razoavelmente à prova de balas", quero dizer que nenhum código pode ser escrito no idioma ou em um subconjunto específico do idioma (por exemplo, um subconjunto sem código "não seguro") que viole a integridade do recurso.
É um processo de tentativa e erro, no sentido de que você cria uma forma simples do recurso, tenta encontrar maneiras de violá-lo, corrige-o se violá-lo com sucesso e repita? E então, quando você não consegue pensar em outras possíveis violações, espera que não haja mais nada e encerra o dia?
Ou existe uma maneira formal de realmente provar (no sentido matemático da palavra) que seu recurso funciona e depois usá-lo para obter o recurso certo (ou quase sempre) com confiança desde o início?
(Devo mencionar que tenho formação em engenharia, não ciência da computação. Portanto, se estiver faltando algo que seria óbvio para o pessoal da CS, fique à vontade para apontar.)