Escucho mucho que los nuevos lenguajes de programación se escriben dinámicamente, pero ¿qué significa en realidad cuando decimos que un lenguaje se escribe dinámicamente frente a estáticamente?
946
Escucho mucho que los nuevos lenguajes de programación se escriben dinámicamente, pero ¿qué significa en realidad cuando decimos que un lenguaje se escribe dinámicamente frente a estáticamente?
Respuestas:
Lenguajes estáticamente escritos
Un idioma se escribe estáticamente si el tipo de una variable se conoce en tiempo de compilación. Para algunos lenguajes, esto significa que usted, como programador, debe especificar de qué tipo es cada variable (por ejemplo: Java, C, C ++); otros idiomas ofrecen alguna forma de inferencia de tipos , la capacidad del sistema de tipos para deducir el tipo de una variable (por ejemplo: OCaml, Haskell, Scala, Kotlin)
La principal ventaja aquí es que el compilador puede realizar todo tipo de comprobaciones y, por lo tanto, se detectan muchos errores triviales en una etapa muy temprana.
Ejemplos: C, C ++, Java, Rust, Go, Scala
Idiomas tipificados dinámicamente
Un idioma se escribe dinámicamente si el tipo está asociado con valores de tiempo de ejecución y no con variables / campos / etc. Esto significa que usted como programador puede escribir un poco más rápido porque no tiene que especificar tipos cada vez (a menos que use un lenguaje de tipo estático con inferencia de tipos ).
Ejemplos: Perl, Ruby, Python, PHP, JavaScript.
La mayoría de los lenguajes de secuencias de comandos tienen esta característica, ya que de todos modos no hay un compilador para hacer una verificación de tipos estática, pero puede encontrarse buscando un error debido a que el intérprete malinterpreta el tipo de una variable. Afortunadamente, los guiones tienden a ser pequeños, por lo que los errores no tienen tantos lugares para esconderse.
La mayoría de los idiomas escritos dinámicamente le permiten proporcionar información de tipo, pero no la requieren. Un lenguaje que se está desarrollando actualmente, Rascal , adopta un enfoque híbrido que permite la escritura dinámica dentro de las funciones pero que impone la escritura estática para la firma de la función.
fuente
Los lenguajes de programación con tipos estáticos realizan la verificación de tipos (es decir, el proceso de verificación y aplicación de las restricciones de los tipos) en tiempo de compilación en lugar de tiempo de ejecución .
Los lenguajes de programación dinámicamente tipados verifican los tipos en tiempo de ejecución en lugar de en tiempo de compilación .
Ejemplos de lenguajes tipados estáticamente son: - Java, C, C ++
Ejemplos de lenguajes escritos dinámicamente son: - Perl, Ruby, Python, PHP, JavaScript
fuente
Aquí hay un ejemplo que contrasta cómo Python (de tipo dinámico) y Go (de tipo estático) manejan un error de tipo:
Python escribe la verificación en tiempo de ejecución y, por lo tanto:
Funciona perfectamente bien y produce el resultado esperado
Hi
. El error solo se genera si se golpea la línea problemática:Produce
porque la línea relevante se ejecutó realmente.
Ir por otro lado hace la verificación de tipo en tiempo de compilación:
Lo anterior no se compilará, con el siguiente error:
fuente
runhaskell
, por ejemplo.En pocas palabras: en un lenguaje de tipo estático , los tipos de variables son estáticos , lo que significa que una vez que establece una variable en un tipo, no puede cambiarla. Esto se debe a que la tipificación está asociada con la variable en lugar del valor al que se refiere.
Por ejemplo en Java:
Donde, por otro lado: en un lenguaje de tipo dinámico , los tipos de variables son dinámicos , lo que significa que después de establecer una variable en un tipo, PUEDE cambiarla. Esto se debe a que la tipificación está asociada con el valor que asume en lugar de la variable en sí.
Por ejemplo en Python:
Por lo tanto, es mejor pensar en las variables en lenguajes escritos dinámicamente como punteros genéricos a los valores escritos.
En resumen, el tipo describe (o debería haber descrito) las variables en el idioma en lugar del lenguaje en sí. Podría haber sido mejor utilizado como un lenguaje con variables escritas estáticamente frente a un lenguaje con variables escritas dinámicamente en mi humilde opinión.
Los lenguajes de tipo estático generalmente son lenguajes compilados, por lo tanto, los compiladores comprueban los tipos (¿tiene sentido, verdad? Ya que no se permite cambiar los tipos más adelante en tiempo de ejecución).
Los lenguajes de tipo dinámico generalmente se interpretan, por lo tanto, la verificación de tipos (si la hay) ocurre en tiempo de ejecución cuando se usan. Por supuesto, esto conlleva algunos costos de rendimiento y es una de las razones por las que los lenguajes dinámicos (p. Ej., Python, ruby, php) no escalan tan bien como los escritos (java, c #, etc.). Desde otra perspectiva, los idiomas tipados estáticamente tienen un costo inicial más elevado: por lo general, usted escribe más código, un código más difícil. Pero eso paga más tarde.
Lo bueno es que ambas partes están prestando características del otro lado. Los lenguajes mecanografiados están incorporando características más dinámicas, por ejemplo, genéricos y bibliotecas dinámicas en C #, y los lenguajes dinámicos incluyen más verificación de tipos, por ejemplo, anotaciones de tipo en python o HACK variante de PHP, que generalmente no son esenciales para el lenguaje y no se pueden usar en demanda.
Cuando se trata de la selección de tecnología, ninguno de los lados tiene una superioridad intrínseca sobre el otro. Es solo una cuestión de preferencia si desea más control para comenzar o flexibilidad. simplemente elija la herramienta adecuada para el trabajo y asegúrese de verificar lo que está disponible en términos opuestos antes de considerar un cambio.
fuente
http://en.wikipedia.org/wiki/Type_system
fuente
myObject[remoteDataName]
. Entonces no hay forma de saber qué propiedad elegirá o incluso si es una propiedad válida.La terminología "escrita dinámicamente" es lamentablemente engañosa. Todos los idiomas tienen tipos estáticos y los tipos son propiedades de expresiones (no de valores como algunos piensan). Sin embargo, algunos idiomas tienen solo un tipo. Estos se llaman lenguajes unipatificados. Un ejemplo de tal lenguaje es el cálculo lambda sin tipo.
En el cálculo lambda sin tipo, todos los términos son términos lambda, y la única operación que se puede realizar en un término es aplicarlo a otro término. Por lo tanto, todas las operaciones siempre dan como resultado una recursión infinita o un término lambda, pero nunca señalan un error.
Sin embargo, si tuviéramos que aumentar el cálculo lambda sin tipo con los números primitivos y operaciones aritméticas, entonces podríamos realizar operaciones sin sentido, como la adición de dos términos lambda juntos:
(λx.x) + (λy.y)
. Se podría argumentar que lo único sensato es señalar un error cuando esto sucede, pero para poder hacerlo, cada valor debe etiquetarse con un indicador que indique si el término es un término lambda o un número. El operador de suma luego verificará que, de hecho, ambos argumentos estén etiquetados como números y, si no lo están, indicará un error. Tenga en cuenta que estas etiquetas no son tipos, porque los tipos son propiedades de los programas, no de los valores producidos por esos programas.Un lenguaje de tipo único que hace esto se llama de tipo dinámico.
Los lenguajes como JavaScript, Python y Ruby son todos de tipo único. Nuevamente, el
typeof
operador en JavaScript y latype
función en Python tienen nombres engañosos; devuelven las etiquetas asociadas con los operandos, no sus tipos. Del mismo modo,dynamic_cast
en C ++ yinstanceof
en Java no realice verificaciones de tipo.fuente
Compilado vs. Interpretado
"Cuando se traduce el código fuente"
Mecanografía
"Cuando los tipos están marcados"
5 + '3'
es un ejemplo de un error de tipo en lenguajes fuertemente tipados como Go y Python, porque no permiten la "coerción de tipo" -> la capacidad de un valor para cambiar el tipo en ciertos contextos, como la fusión de dos tipos. Los idiomas mal escritos , como JavaScript, no arrojarán un error de tipo (resultados'53'
).Las definiciones de "Estático y Compilado" y "Dinámico e Interpretado" son bastante similares ... pero recuerde que es "cuando se marcan los tipos" vs. "cuando se traduce el código fuente".
¡Obtendrá los mismos errores de tipo independientemente de si el idioma está compilado o interpretado ! Necesita separar estos términos conceptualmente.
Ejemplo de Python
Dinámico, Interpretado
Debido a que Python se interpreta y se escribe dinámicamente, solo traduce y verifica el código en el que se está ejecutando. ¡El
else
bloque nunca se ejecuta, por5 + '3'
lo que nunca se mira!¿Qué pasa si se ha escrito estáticamente?
Se generaría un error de tipo incluso antes de que se ejecute el código. Todavía realiza la verificación de tipo antes del tiempo de ejecución aunque se interprete.
¿Qué pasa si fue compilado?
El
else
bloque se traduciría / miraría antes del tiempo de ejecución, pero como se escribe dinámicamente, ¡no arrojaría un error! Los idiomas escritos dinámicamente no verifican los tipos hasta la ejecución, y esa línea nunca se ejecuta.Ir ejemplo
Estático, compilado
¡Los tipos se verifican antes de ejecutarse (estáticos) y el error de tipo se detecta inmediatamente! Los tipos aún se verificarían antes del tiempo de ejecución si se interpretaran, teniendo el mismo resultado. Si fuera dinámico, no arrojaría ningún error a pesar de que el código se vería durante la compilación.
Actuación
Un lenguaje compilado tendrá un mejor rendimiento en tiempo de ejecución si se escribe estáticamente (vs. dinámicamente); El conocimiento de los tipos permite la optimización del código de máquina.
Los lenguajes tipados estáticamente tienen un mejor rendimiento en tiempo de ejecución intrínsecamente debido a que no es necesario verificar los tipos dinámicamente durante la ejecución (se verifica antes de ejecutarse).
Del mismo modo, los lenguajes compilados son más rápidos en tiempo de ejecución ya que el código ya se ha traducido en lugar de tener que "interpretarlo / traducirlo sobre la marcha".
Tenga en cuenta que tanto los idiomas compilados como los estáticamente escritos tendrán un retraso antes de ejecutar la traducción y la verificación de tipos, respectivamente.
Más diferencias
La escritura estática detecta los errores temprano, en lugar de encontrarlos durante la ejecución (especialmente útil para programas largos). Es más "estricto", ya que no permitirá errores de tipo en ningún lugar de su programa y, a menudo, evita que las variables cambien de tipo, lo que defiende aún más contra errores no intencionados.
La escritura dinámica es más flexible, lo que algunos aprecian. Por lo general, permite que las variables cambien los tipos, lo que puede provocar errores inesperados.
fuente
Lenguajes estáticamente tipados : cada variable y expresión ya se conoce en tiempo de compilación.
(
int a;
a puede tomar solo valores de tipo entero en tiempo de ejecución)Ejemplos: C, C ++, Java
Lenguajes de tipo dinámico : las variables pueden recibir diferentes valores en tiempo de ejecución y su tipo se define en tiempo de ejecución.
(
var a;
a puede tomar cualquier tipo de valores en tiempo de ejecución)Ejemplos: Ruby, Python.
fuente
Verificación de tipos de idiomas estáticamente escritos en tiempo de compilación y el tipo NO puede cambiar. (No te pongas lindo con los comentarios de conversión de tipos, se crea una nueva variable / referencia).
Verificación de tipo de idiomas escritos dinámicamente en tiempo de ejecución y el tipo de una variable PUEDE cambiarse en tiempo de ejecución.
fuente
Definiciones dulces y simples, pero que se ajustan a la necesidad: los lenguajes tipados estáticamente vinculan el tipo a una variable para todo su alcance (Seg: SCALA) Los lenguajes tipados dinámicamente vinculan el tipo al valor real al que hace referencia una variable.
fuente
fuente
Los lenguajes tipados estáticamente como C ++, Java y los lenguajes tipados dinámicamente como Python difieren solo en términos de la ejecución del tipo de la variable. Los lenguajes tipados estáticamente tienen un tipo de datos estáticos para la variable, aquí el tipo de datos se verifica durante la compilación, por lo que la depuración es mucho más simple ... mientras que los lenguajes tipados dinámicamente no hacen lo mismo, se verifica el tipo de datos que ejecuta el programa y, por lo tanto, el La depuración es un poco difícil.
Además, tienen una diferencia muy pequeña y pueden relacionarse con lenguajes fuertemente tipados y débilmente tipados . Un lenguaje fuertemente tipado no le permite usar un tipo como otro, por ejemplo. C y C ++ ... mientras que los lenguajes débilmente escritos permiten, por ejemplo, python
fuente
Mecanografiado estáticamente
Los tipos se verifican antes del tiempo de ejecución para que los errores puedan detectarse antes.
Ejemplos = c ++
Mecanografiado dinámicamente
Los tipos se verifican durante la ejecución.
Ejemplos = Python
fuente
Lenguajes de tipo estático (el compilador resuelve llamadas a métodos y compila referencias):
Lenguajes de tipo dinámico (decisiones tomadas en la ejecución del programa):
fuente
El lenguaje de tipo dinámico ayuda a prototipar rápidamente los conceptos de algoritmo sin la sobrecarga de pensar qué tipos de variables deben usarse (lo cual es una necesidad en el lenguaje de tipo estático ).
fuente
Escritura estática: los lenguajes como Java y Scala son de escritura estática.
Las variables deben definirse e inicializarse antes de usarse en un código.
por ej. int x; x = 10;
System.out.println (x);
Escritura dinámica: Perl es un lenguaje de escritura dinámica.
No es necesario inicializar las variables antes de usarlas en el código.
y = 10; use esta variable en la parte posterior del código
fuente
$
), array (@
) y hash (%
). El tipo de una variable en Perl se conoce en tiempo de compilación y permanece igual para el resto de la vida útil de las variables.