Estoy interesado en el diseño del lenguaje y, en general, puedo razonar fácilmente sobre características ampliamente conocidas (por ejemplo, herencia, polimorfismo, delegados, lambdas, capturas, recolección de basura, excepciones, genéricos, variación, reflexión, etc.), sus interacciones en un lenguaje particular, las formas en que pueden implementarse, sus limitaciones, etc.
En los últimos meses, comencé a leer sobre Rust, que tiene un sistema de propiedad que garantiza la seguridad de la memoria y la gestión determinista de los recursos al obligar a que la vida útil de los objetos sea estáticamente verificable. Desde la perspectiva de un simple usuario del idioma, podría recoger el sistema casi de inmediato.
Sin embargo, desde la perspectiva de un diseñador de idiomas, me llevó un tiempo darme cuenta de por qué las cosas en Rust son exactamente como son. No pude entender de inmediato el razonamiento detrás de algunas restricciones del sistema de propiedad, hasta que me obligué a presentar casos que violarían la integridad de un sistema si no tuviera esos aspectos.
Mi pregunta principal no tiene nada que ver con Rust y su propiedad específicamente, pero siéntase libre de usarlo como ejemplo en sus comentarios / respuestas.
Cuando los diseñadores de idiomas diseñan una nueva característica, ¿qué metodología o proceso utilizan para decidir que la característica funciona correctamente?
Por "nuevo" quiero decir que no es algo que ya se haya probado en los idiomas existentes (y, por lo tanto, la mayor parte del trabajo ha sido realizado por otros diseñadores). Por "funciona correctamente" me refiero a que la función resuelve el problema deseado correctamente, y es razonablemente a prueba de balas. Por "razonablemente a prueba de balas" quiero decir que no se puede escribir ningún código en el idioma o en un subconjunto particular del idioma (por ejemplo, un subconjunto sin código "inseguro") que viole la integridad de la función.
¿Es un proceso de prueba y error, en el sentido de que se te ocurre una forma simple de la función, luego intentas encontrar formas de violarla, luego parchearla si la violas con éxito y luego repetir? Y luego, cuando no puede pensar en ninguna otra violación posible, ¿espera que no quede nada y lo llama un día?
¿O hay una forma formal de demostrar realmente (en el sentido matemático de la palabra) que su característica funciona y luego usar esa prueba para obtener la característica correcta (o en su mayoría correcta) desde el principio?
(Debo mencionar que tengo experiencia en ingeniería, no ciencias de la computación. Entonces, si me estoy perdiendo algo que sería obvio para la gente de CS, no dude en señalarlo).