Yo sugeriría que un buen lenguaje de programación debería tener reglas estrictas, que se espera que las implementaciones apliquen de manera coherente, pero las reglas deben escribirse de tal manera que sean útiles. También sugeriría que uno debería considerar diseñar un lenguaje para evitar los casos en que la "distancia de Hamming" entre dos programas sustancialmente diferentes sea solo uno. Obviamente, uno no puede lograr tal cosa con literales numéricos o de cadena (si un programador que quiso decir 123 en lugar de 1223 o 13, el compilador no puede saber muy bien qué significó el programa). Por otro lado, si el lenguaje utilizara :=
para la asignación y ==
para la comparación de la igualdad, y no use un solo =
para ningún propósito legal, entonces se reducirían las posibilidades de asignaciones accidentales que se suponía que debían sean comparaciones y comparaciones accidentales de no hacer nada que se suponía que eran asignaciones.
Sugeriría que si bien hay lugares donde es útil para los compiladores inferir cosas, tal inferencia suele ser más valiosa en los casos más simples y menos valiosa en los casos más complicados. Por ejemplo, permitiendo el reemplazo de:
Dictionary<complicatedType1,complicatedType2> item =
new Dictionary<complicatedType1, complicatedType2()>;
con
var item = new Dictionary<complicatedType1, complicatedType2()>;
no requiere ninguna inferencia de tipo complicada, pero hace que el código sea mucho más legible (entre otras cosas, usar la sintaxis más detallada solo en los escenarios donde se necesita, por ejemplo, porque el tipo de ubicación de almacenamiento no coincide exactamente con el tipo de la expresión que lo crea, ayudará a llamar la atención adicional a los lugares que lo requieran).
Una de las principales dificultades de intentar una inferencia de tipo más sofisticada es que pueden surgir situaciones ambiguas; Yo sugeriría que un buen lenguaje debería permitir que un programador incluya información que el compilador podría usar para resolver tales ambigüedades (p. Ej., Considerando que algunos pronósticos son preferibles a otros), determine que no importan (p. Ej., Porque aunque hay dos posibles las sobrecargas pueden ejecutar un código diferente, el programador ha indicado que deben comportarse de manera idéntica en aquellos casos en que se podría usar), o marcar aquellos (y solo aquellos) que no se pueden manejar de ninguna de las formas anteriores.