¿Por qué en casi todos los lenguajes de programación modernos (Go, Rust, Kotlin, Swift, Scala, Nim, incluso la última versión de Python) los tipos siempre vienen después de la declaración de variable, y no antes?
Su premisa es defectuosa en dos frentes:
- Hay nuevos lenguajes de programación que tienen el tipo antes del identificador. C♯, D o Ceilán, por ejemplo.
- Tener el tipo después del identificador no es un fenómeno nuevo, se remonta al menos a Pascal (diseñado entre 1968 y 1969, lanzado en 1970), pero en realidad se usó en la teoría matemática de tipos, que comienza en 1902. También se usó en ML (1973), CLU (1974), Hope (1970), Modula-2 (1977-1985), Ada (1980), Miranda (1985), Caml (1985), Eiffel (1985), Oberon (1986), Modula-3 (1986–1988) y Haskell (1989).
Pascal, ML, CLU, Modula-2 y Miranda fueron idiomas muy influyentes, por lo que no es sorprendente que este estilo de declaraciones tipográficas siguiera siendo popular.
¿Por qué x: int = 42
y no int x = 42
? ¿No es este último más legible que el primero?
La legibilidad es una cuestión de familiaridad. Personalmente, encuentro que los chinos son ilegibles, pero aparentemente, los chinos no lo hacen. Después de haber aprendido a Pascal en la escuela, incursionar en Eiffel, F Has, Haskell y Scala, y haber examinado TypeScript, Fortress, Go, Rust, Kotlin, Idris, Frege, Agda, ML, Ocaml, ... me parece completamente natural. .
¿Es solo una tendencia o hay alguna razón realmente significativa detrás de tal solución?
Si es una tendencia, es bastante persistente: como mencioné, se remonta a cien años en matemáticas.
Una de las principales ventajas de tener el tipo después del identificador, es que es fácil omitir el tipo si desea inferirlo. Si sus declaraciones se ven así:
val i: Int = 10
Entonces es trivial dejar de lado el tipo e inferirlo así:
val i = 10
Mientras que si el tipo viene antes del identificador como este:
Int i = 10
Entonces comienza a ser difícil para el analizador distinguir una expresión de una declaración:
i = 10
La solución que los diseñadores de idiomas suelen presentar es introducir una palabra clave "No quiero escribir un tipo" que debe escribirse en lugar del tipo:
var i = 10; // C♯
auto i = 10; // C++
Pero esto en realidad no tiene mucho sentido: básicamente tienes que escribir explícitamente un tipo que dice que no escribes un tipo. ¿Eh? Sería mucho más fácil y más sensato dejarlo fuera, pero eso hace que la gramática sea mucho más compleja.
(Y ni siquiera hablemos sobre los tipos de puntero de función en C.)
Los diseñadores de varios de los idiomas mencionados anteriormente han intervenido en este tema:
Nota: los diseñadores de Ceilán también documentaron por qué usan la sintaxis de tipo de prefijo :
Anotaciones de tipo prefijo en lugar de postfijo
¿Por qué sigues C y Java al poner primero las anotaciones de tipo, en lugar de Pascal y ML al ponerlas después del nombre de la declaración?
Porque pensamos esto:
shared Float e = ....
shared Float log(Float b, Float x) { ... }
Es simplemente mucho más fácil de leer que esto:
shared value e: Float = ....
shared function log(b: Float, x: Float): Float { ... }
¡Y simplemente no entendemos cómo alguien podría pensar lo contrario!
Personalmente, encuentro su "argumento" mucho menos convincente que los otros.