Sobre todo esto es una coincidencia.
Los lenguajes de programación han evolucionado con el tiempo y la tecnología de compiladores e intérpretes ha mejorado. La eficiencia del procesamiento subyacente (es decir, el tiempo de compilación, la sobrecarga de interpretación, el tiempo de ejecución, etc.) también es menos importante a medida que las plataformas informáticas convencionales han crecido en potencia.
La sintaxis del lenguaje hace tener un impacto - por ejemplo, Pascal fue diseñado con mucho cuidado por lo que podría utilizar un único pase compilador - es decir, un pase sobre la fuente y tiene código de máquina excutable. Ada, por otro lado, no prestó atención a esto, y los compiladores de Ada son notoriamente difíciles de escribir, la mayoría requiere más de un pase. (Un muy buen compilador Ada que utilicé hace muchos años fue un compilador de 8 pases. Como se puede imaginar, fue muy lento).
Si observa idiomas antiguos como Fortran (compilado) y BASIC (interpretado o compilado), tienen / tenían una sintaxis muy estricta y reglas semánticas. [En el caso de BASIC, eso no es Bills old BASIC, debe volver antes al original.]
Por otro lado, mirando otras cosas más antiguas como APL (un montón de diversión) esto tenía una tipificación dinámica, más o menos. También se interpretó generalmente, pero también se pudo compilar.
La sintaxis de Lenient es difícil: si eso significa que tiene cosas que son opcionales o que se pueden inferir, significa que el idioma tiene la riqueza suficiente para poder eliminarlo. Por otra parte, BASIC tenía eso hace muchos años cuando la declaración "LET" se convirtió en opcional.
Muchas de las ideas que ve ahora (por ejemplo, mecanografía sin tipo o dinámica) son en realidad muy antiguas: aparecieron por primera vez en los años 70 o principios de los 80. La forma en que se usan y los idiomas en que se usan estas ideas han cambiado y crecido. Pero fundamentalmente, gran parte de lo nuevo es en realidad cosas viejas vestidas con ropa nueva.
Aquí hay algunos ejemplos fuera de mi cabeza:
- APL: tipeo dinámico. Generalmente interpretado. Vino de los años 1960/70.
- BÁSICO: escritura fuerte o dinámica. Interpretado o compilado. 1970 y muchos más allá.
- Fortran: mecanografía fuerte. Compilado 1960 o antes.
- Algol68: mecanografía fuerte. Compilado 1960's.
- PL / 1: mecanografía fuerte. Compilado 1960's.
- Pascal: mecanografía fuerte. Compilado 1970's. (¡Pero en la década de 1980 había compiladores del sistema P muy similares a los compiladores JIT!)
- Algunas implementaciones de Fortran y otras por DEC en los primeros días fueron parcialmente compiladas y parcialmente interpretadas.
- Smalltalk: mecanografía dinámica. Compilado a bytecode que se interpreta. 1980's.
- Prólogo: más extrañeza. Funcional. Compilado (Turbo Prolog, ¿alguien?). 1980's.
- C: tipificación fuerte (ja, ja). Compilado 1960 ... hoy.
- Ada: mecanografía súper fuerte. Compilado 1980's.
- Perl: escritura dinámica. (Sintaxis fuerte). Interpretado. 1990 (?).
Podría seguir.
- Esquina Nitpickers: Muchos lenguajes interpretados se tokenizan o "compilan byte" en el momento en que se carga / lee la fuente. Esto hace que la operación posterior del intérprete sea mucho más simple. A veces puede guardar la versión del código compilada en bytes. A veces no puedes. Aún se interpreta.
Actualización: porque no estaba lo suficientemente claro.
Escribir puede variar ampliamente.
La tipificación estática fija en tiempo de compilación es común (p. Ej., C, Ada, C ++, Fortan, etc., etc.). Aquí es donde declaras una COSA de TIPO y es así para siempre.
También es posible tener una escritura dinámica, donde la cosa recoge el tipo que se le asigna. Por ejemplo, PHP y algunos principios básicos, y APL, donde asignaría un número entero a una variable y de ahí en adelante era un tipo entero. Si luego le asignó una cadena, entonces era un tipo de cadena. Y así.
Y luego hay una escritura suelta, por ejemplo PHP, donde puedes hacer cosas realmente extrañas como asignar un número entero (entre comillas, por lo que es una cadena) a una variable y luego agregarle un número. (por ejemplo, '5' + 5 daría como resultado 10). Esta es la tierra de lo extraño, pero también a veces muy útil.
SIN EMBARGO, estas son características diseñadas en un lenguaje. La implementación solo hace que eso suceda.