c# - estatico - ¿Qué es un lenguaje dinámico y por qué no califica C?
diferencia entre lenguaje estatico y dinamico (12)
Al escuchar un podcast, escuché que C # no es un lenguaje dinámico mientras Ruby lo es.
¿Qué es un "lenguaje dinámico"? ¿La existencia de lenguajes dinámicos implica que hay lenguajes estáticos?
¿Por qué C # es un lenguaje dinámico y qué otros idiomas son dinámicos? Si C # no es dinámico, ¿por qué Microsoft lo empuja fuertemente al mercado?
¿Por qué la mayoría de los programadores de .NET se vuelven locos y dejan otros idiomas para pasar a C #?
¿Por qué es Ruby "el lenguaje del futuro"?
¿Qué es un lenguaje dinámico?
Si un lenguaje es dinámico o no, por lo general se refiere al tipo de enlace que hace el compilador: enlace estático o tardío.
La vinculación estática simplemente significa que el método (o la jerarquía de métodos para métodos virtuales) está vinculado en tiempo de compilación. Puede haber un despacho virtual involucrado en tiempo de ejecución, pero el token de método está vinculado en tiempo de compilación. Si no existe un método adecuado en el momento de la compilación, recibirá un error.
Los lenguajes dinámicos son lo contrario. Ellos hacen su trabajo en tiempo de ejecución. Hacen poca o ninguna comprobación de la existencia de métodos en el momento de la compilación, pero lo hacen todo en el tiempo de ejecución.
¿Por qué C # no es un lenguaje dinámico?
C #, antes de 4.0, es un lenguaje enlazado estáticamente y por lo tanto no es un lenguaje dinámico.
¿Por qué es Ruby el lenguaje del futuro?
Esta pregunta se basa en una premisa falsa, a saber, que existe un lenguaje que es el futuro de la programación. No existe tal lenguaje hoy en día porque ningún idioma es el mejor para hacer todos los diferentes tipos de programación que deben hacerse.
Por ejemplo, Ruby es un excelente lenguaje para muchas aplicaciones diferentes: el desarrollo web es muy popular. Sin embargo, no escribiría un sistema operativo en él.
¿Sabías que VB6 es a la vez estático y dinámico?
Si declaras variables con un tipo dado, obtienes un comportamiento estático:
Dim name as Label
Ahora solo puede acceder a los miembros de nombre que son Label
s e intellisense lo sabe.
Si tiene una clase y agrega la palabra clave implements
, su clase puede implementar métodos de otra clase. Esta es la herencia de la interfaz que permite VB6. Puedes obtener un poco de polimorfismo de tiempo de ejecución.
También puedes declarar variables como esta:
Dim proxy As Object
Ahora intellisense no te brinda ninguna ayuda y VB6 te permitirá hacer lo que quieras con un proxy
:
proxy.foo()
Esta línea puede estar dentro de un programa compilado y en ejecución y no causar ofensa, especialmente si no se ejecuta solo. Solo cuando se ejecuta la línea se realiza la búsqueda.
También puedes realizar:
set proxy = <any instance>
y esto se ejecutará. No importa si <any instance>
tiene un método foo
o no.
Y luego cualquier instancia de cualquier clase que implemente foo
puede ser asignada y el método llamado y VB6 serán felices.
Tenga en cuenta que hay penalizaciones de rendimiento en tiempo de ejecución a medida que se vuelve más dinámico.
Al mirar la entrada de Wikipedia , vemos que un lenguaje dinámico es aquel que hace las cosas en tiempo de ejecución que la mayoría hace en tiempo de compilación. Normalmente, en un lenguaje dinámico, una variable puede cambiar los tipos de manera rápida y sencilla, y normalmente no hay un paso de compilación por separado (sino más bien una ejecución interpretada o una compilación realmente rápida). C # es un lenguaje más convencional, que usa declaraciones de variables y se compila.
La entrada de Wikipedia enumera numerosos lenguajes dinámicos.
"X es la Y del futuro", por otro lado, significa que alguien está tratando de venderte algo. (No necesariamente literalmente, pero tratando de influir en sus creencias de una manera conveniente para el orador).
C # es un lenguaje escrito de forma estática, porque el tipo de cada objeto con el que está trabajando debe ser conocido en el momento de la compilación. En un lenguaje dinámico no es necesario saber qué tipo de objeto es un objeto en tiempo de compilación. Tal vez importas algunas clases que no conoces de antemano, como importar todas las clases en una carpeta, como complementos o algo así. O tal vez incluso el tipo de un objeto depende de la interacción del usuario.
Puede lograr un efecto similar mediante el uso de interfaces o clases base, pero no es lo mismo porque está limitado a usar clases que explícitamente heredan o implementan esa interfaz.
En los lenguajes tipados dinámicamente, no importa qué tipo es cuando lo compila, intentará llamar al método que especificó por su nombre, si ese método no existe en el objeto arrojará una excepción de tiempo de ejecución , así que depende del programador asegurarse de que eso no suceda o manejarlo adecuadamente. Usted gana flexibilidad, pero pierde un poco en la comprobación de errores en tiempo de compilación.
En C # 3.0, los tipos de todo deben conocerse en tiempo de compilación. Es un lenguaje estático. Un lenguaje dinámico utiliza el despacho dinámico en tiempo de ejecución para decidir el tipo de cosas y los métodos a los que recurrir. Ambos tipos de idiomas tienen sus ventajas y desventajas. C # 4.0 agregará capacidad dinámica. Anders Hejlsberg dio una gran charla sobre lenguajes estáticos vs dinámicos y C # 4.0 en PDC.
En un lenguaje dinámico, puedes hacer esto:
var something = 1;
something = "Foo";
something = {"Something", 5.5};
En otras palabras, el tipo no es estático. En un lenguaje escrito de forma estática, esto daría como resultado un error del compilador.
Los lenguajes como C, C ++, C # y Java están tipados estáticamente.
Los idiomas como Ruby, Python y Javascript se escriben dinámicamente.
Además, esto no es lo mismo que escribir "fuerte o débilmente". Eso es algo diferente todos juntos.
Las palabras estática y dinámica no están claramente definidas.
Sin embargo, lo que se entiende más a menudo es dos cuestiones:
1) En los lenguajes estáticos, el tipo de una variable (es decir, el tipo de valor que la variable puede contener o señalar) no puede cambiar durante el curso de un programa. Por ejemplo, en C #, declaras el tipo de una variable cuando la defines, como:
int a;
Ahora, solo puede contener un valor int
: si intenta asignarle una cadena o llamar a un método, obtendrá un error de compilación.
2) En lenguaje estático, el tipo de un objeto no puede cambiar. En los idiomas dinámicos, un objeto puede cambiar, ya que puede adjuntar o eliminar métodos y propiedades, convirtiéndolo así en un objeto completamente diferente.
No hay un verdadero "lenguaje del futuro". Diferentes idiomas tienen diferentes propósitos. A lo sumo, se podría decir que Ruby es un lenguaje del futuro.
De acuerdo con Wikipedia:
El lenguaje de programación dinámico es un término ampliamente utilizado en ciencias de la computación para describir una clase de lenguajes de programación de alto nivel que ejecutan en tiempo de ejecución muchos comportamientos comunes que otros lenguajes podrían realizar durante la compilación, si es que lo hacen. Estos comportamientos podrían incluir la extensión del programa, agregando un nuevo código, extendiendo objetos y definiciones, o modificando el sistema de tipo, todo durante la ejecución del programa. Estos comportamientos se pueden emular en casi cualquier lenguaje de complejidad suficiente, pero los lenguajes dinámicos proporcionan herramientas directas para hacer uso de ellos. La mayoría de los lenguajes dinámicos son tipeados dinámicamente, pero no todos.
Ruby es un lenguaje dinámico y C # no lo es, ya que se interpreta Ruby y se compila C #. Sin embargo, C # incluye algunas características que lo hacen parecer dinámico.
Por lo general, se considera que un lenguaje dinámico es capaz de interpretar y generar código dinámicamente en tiempo de ejecución. C # no puede hacer eso.
También hay lenguajes dinámicamente escritos y estáticos. Tipeado dinámicamente significa que el tipo de variable no está configurado y puede cambiar a lo largo de la ejecución del programa.
Soy impresionante en la forma en que c # está abarcando un conjunto fundamental de paradigmas de programación.
Podemos decir que c # permite una rica programación orientada a objetos, una rica programación orientada a componentes, una programación funcional bien integrada, un conjunto completo de operaciones de consulta sobre diferentes tipos de fuentes de datos (linq), un enfoque elegante de la programación paralela a través de pLinq y paralelo extensiones, en la próxima versión (c # 4.0) tendrá potentes capacidades dinámicas, y es casi seguro que en c # 5.0 tendrá un conjunto sólido de características de meta-programación.
Con solo puedo decir que c # está haciendo un gran trabajo al integrar todo este material poderoso en una sola caja de herramientas. En mi opinión, así es como debe ser, porque saltar de un lenguaje de programación a otro es casi siempre muy doloroso.
Un lenguaje está tipeado dinámicamente, eso significa que una variable se puede usar para cualquier cosa. Las variables no se escriben, los valores sí. Una variable puede tener el valor de cualquier tipo primitivo, o puede hacer referencia a cualquier objeto.
c # se escribe de forma estática, es decir, int i = 0; Intenta configurar i para que sea una cadena. el compilador se quejará,
donde, como python, una variable que solía contener un número entero se puede configurar para que contenga una cadena,
Estático: los tipos son finales, dinámicos: los tipos se pueden cambiar,
c # está intentando agregar más características dinámicas, como var, por ejemplo