Pregunta

Estoy tratando de entender mejor lo que realmente significa que un lenguaje sea "dinámico".tengo bastante experiencia con Jerga, que es el lenguaje de programación para la línea de productos Adobe (anteriormente Macromedia) Director, y me pregunto si se consideraría un "lenguaje dinámico".

La forma en que las variables y liza se manejan me parece un "lenguaje muy dinámico".

Con variables, simplemente escribirías foo = 3 o bar = "Hello World".No declaras una variable como int o string--Se da cuenta de eso a medida que avanza.

Con listas, puedes escribir algo como miscCollection = [3, "Hello World", #helloWorld, ["Embedded List", "Goes Here", 3], [#phrase: "Property List goes here", #value: 3]].¿No sería esto similar a un tuple?

¿Son estas características suficientes para calificar para el estado de "lenguaje dinámico"?

Curiosamente, he estado usando C# mucho más y Director/Lingo mucho menos, pero con todo el entusiasmo por los lenguajes dinámicos estos días, me pregunto si en realidad estoy yendo contra la corriente.

EDITAR

Con respecto a la respuesta de Mark Rushakoff, a continuación, hay un intento de analizar si Lingo califica como "dinámico" usando esto Artículo de Wikipedia:

  1. Eval - La jerga tiene do y value palabras clave. do ejecutará un comando completo, por ejemplo, do "foo = 23" o do "foo = sum(20, 3)". value intenta convertir una cadena en un número, pero es más que un simple operador de análisis: en realidad puede convertir una representación de cadena de una variable en su número, por ejemplo, suponiendo foo = 23, la declaración value("foo") evaluará a 23.

  2. Funciones de orden superior: si entiendo esto bien, esto es básicamente lo que me llamarían "delegado" en C#.Hasta donde yo sé, Lingo no admite esto directamente, aunque se puede crear un tipo (llamado "script principal") que tenga una función y pasar una instancia del tipo.

  3. Cierres: hasta donde yo sé, no hay soporte para esto.

  4. Continuación: Hasta donde yo sé, no hay soporte para esto.

  5. Reflexión - Al menos en cierto sentido, sí.En realidad, creas nuevas instancias de tipos usando una cadena, por ejemplo, fooInstance = script("Foo").new(bar).También es posible convertir una instancia de un tipo en una cadena que contenga el nombre del tipo (para que pueda imitar las secuencias de C#). GetType() funcionalidad).También puede consultar las propiedades de un tipo sin conocer los nombres de las propiedades (por ejemplo, buscar una propiedad por índice) y averiguar los nombres de las propiedades por índice.

  6. Macros: la forma en que el artículo de Wikipedia describe una macro, No lo creo.Sin embargo, es posible editar scripts en tiempo de ejecución, así que tal vez eso cuente.

Entonces, parece que Lingo obtiene una puntuación de 2 a 3 sobre 6 en características dinámicas, pero no tengo lo suficientemente claro sobre cierres y continuaciones como para estar seguro de que Lingo no las admite.Supongo que no estoy seguro de qué concluir.Comentarios bienvenidos.

¿Fue útil?

Solución

"dinámico" es una de esas palabras que están de moda, pero que en realidad significa poco más que "¿Qué I hacer es genial"...no tiene una definición precisa.

Dicho esto, puedo responder a tu pregunta sobre los tipos, o al menos intentar explicar mejor la diferencia entre lenguajes escritos y no escritos (lo que algunas personas llaman dinámicos o escritos dinámicamente).

Un lenguaje mecanografiado comprueba que usted Nunca Terminas intentando hacer algo con una variable que no puedes hacer. antes ejecutas el programa.Un lenguaje sin tipo no realiza esta verificación; simplemente espera lo mejor y, si en algún momento tiene un valor que no es adecuado para lo que necesita, genera un error.

Esos son dos extremos.Como todo en la vida, en la práctica los idiomas se encuentran en algún punto entre los dos extremos teóricos.Por lo tanto, a veces es difícil decir si un idioma está escrito o no; a menudo, todo lo que se puede decir es algo como "el idioma X tiene una mejor verificación de tipos en el momento de la compilación que el idioma Y porque estos errores se detectan en X pero no en Y:... ".

Dada esa definición, es posible que le preocupe que (1) un lenguaje escrito requiera mucho más texto en el programa (porque necesita decir de qué tipo es cada valor) y (2) que un lenguaje escrito pueda restringir lo que puede hacer innecesariamente (porque el sistema de tipos no es lo suficientemente inteligente como para permitir que algo que usted puede ver funcionaría).

Ambos pueden ser problemas.PERO ambos son problemas que se están volviendo menos importantes a medida que los lenguajes mecanografiados mejoran.Por ejemplo, ¿por qué tener un código como:

String s = "hello"

cuando es obvio con solo

s = "hello"

¿esa "s" debe ser una cadena?Los lenguajes que son "inteligentes" como este, y en los que no es necesario decir cuáles son todos los tipos, pero aun así están marcados, a menudo se denominan "Hindley Milner" porque esas son las personas que descubrieron por primera vez cómo hacerlo. en detalle.

Entonces, cuando miras un programa escrito para un lenguaje con un sistema de tipos Hindley Milner, puede parecer que no tiene tipos.Pero eso es un error.Aún así, antes de ejecutar el programa, determinará cuáles deben ser todos los tipos de todas las variables y comprobará que no puede obtener ningún error por intentar hacer algo con el tipo incorrecto (creo que esto es sorprendente, está cerca de una especie de inteligencia artificial...)

Eso significa que a veces la única forma de saber si un idioma está escrito o no es saber cómo está implementado.Puede que no sea obvio con sólo mirar la fuente.

Editar: Acabo de releer lo anterior y podría haber sido un poco más claro.La distinción que intentaba hacer era entre lenguas que tienen una tipo sistema e idiomas que no lo hacen.A sistema de tipos incluye dos cosas:tipos en sí y lógica para comprobar que los tipos son correctos.

Los lenguajes que llamaba "sin escribir" (o escritos dinámicamente) tienen tipos.En Python, por ejemplo (que es un lenguaje dinámico sin tipo), todavía existe una diferencia entre una cadena y un entero.Pero no tienen la lógica adicional que verifica el programa. antes corre.Entonces sería más exacto decir que tienen tipos, pero no tienen un tipo. sistema.

En contraste con los idiomas "escritos", como dije, verifique antes el programa se ejecuta, por lo que no solo debe tener tipos, sino también la lógica adicional para realizar ese trabajo.

Otros consejos

Tipo de inferencia (como sus ejemplos de foo = 3 y bar = "Hello World") no implica un lenguaje dinámico. La palabra clave en C # var infiere el tipo de variable en tiempo de compilación, y Haskell también se puede utilizar tipos implícitos para todas las variables, incluso en programas compilados.

"lenguaje de programación dinámico" es un término muy poco definida, pero creo que si tenido que limitar a un solo partido de clasificación, sería tiempo de ejecución de la reflexión. Si se puede hacer la reflexión, es probable que pueda hacer los otros calificadores que figuran en el artículo de Wikipedia (eval, objeto alteración tiempo de ejecución, cierres, macros ...).

No sé nada sobre el lenguaje Lingo, pero yo diría que es generalmente más fácil de disqualify un lenguaje dinámico como lo que es califica una lengua . Lingo puede hacer cualquiera / todos los calificadores en el artículo de Wikipedia? Si no es así, entonces es probable que simplemente no dinámico. Si puede de nada, entonces es probable que al menos "dinámica suficiente".

Cuando la gente habla de un lenguaje de programación es "dinámica", que generalmente se refieren a un sistema de tipo dinámico. La mejor definición de lo que es un sistema de tipo dinámico es (y lo que no lo es) que he leído nunca es excelente artículo de Chris Smith Lo que debe saber antes de debatir Tipo Sistemas .

Una vez que haya leído este artículo, creo que usted debe tener su respuesta en cuanto a si una lengua dada califica como está escrito de forma estática o dinámica.

Me gustaría demostrar que Lingo es un lenguaje dinámico.

He hice LingoF un marco de programación funcional para Lingo. Este marco está escrito enteramente en la jerga, sin Xtra, no hay componentes de bajo nivel utilizado, por lo que no sería posible desarrollar dicho marco si el idioma no era dinámico.

Teniendo en cuenta este marco, aquí es mi evaluación de Lingo como el lenguaje dinámico:

1 - Eval - Lingo tiene do y value palabras clave. Además, puede compilar una secuencia de comandos en tiempo de ejecución. Consulte la Característica de LingoF "Lingo expresiones".

2 - Funciones de orden superior -. LingoF muestra cómo es posible es hacer un amplio uso de funciones de orden superior en la jerga

3 - Cierres -. Una vez más LingoF muestra cómo es posible trabajar con cierres en la jerga

4 - continuación - ayudantes de sintaxis LingoF se definen con técnicas de recuperación. Es posible escribir funciones en la continuación Passing estilo. Comprobar esto (tomado del módulo LingoF):

on public_factorialCPS_2
on fac me, n,k
  x = LingoF().var()
  if ( n = 0 ) then return k [1] 
  else return me.factorialCPS[$(#-,n,1) ] [ LingoF().fun(x) [ k [ $(#*,n,x) ]  ] ]
end

5 - Reflexión - Ya contesté que sí y estoy de acuerdo. Por ejemplo LingoF administrador de módulos se realiza utilizando características de reflexión de Lingo mencionados por DanM.

6 - Macros - Voy a tener que hacer más investigación en este campo. Desde director soporta secuencias de comandos (scripts Vinculados almacenados en archivos de texto externos) es posible aplicar algún tipo de macros. Tal vez el administrador de macros puede interceptar algunos eventos como startMovie (expandirlos) y stopMovie (comprimirlos de nuevo). Otra posibilidad es utilizar campos como scripts y ampliará en los miembros de guión, estoy seguro de que funcionará bien.

Así que mi puntuación es de 5 a 6 de 6 en las características dinámicas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top