2010-01-27 32 views
15

Parece que tengo que estar de acuerdo con esta post cuando afirma quemás dinámico lenguaje de programación dinámico

[...] código en lenguajes de tipado dinámico sigue las convenciones de tipificación estática

código de lenguaje dinámico mucho me encuentro parece que en efecto ser bastante estática (pensando en PHP) mientras que los enfoques dinámicos parecen algo torpe o innecesario en su lugar.

La mayoría de las veces, se trata simplemente de omitir las firmas de tipo, que, en el contexto de la tipo-inferencia/tipado estructural, ni siquiera tiene que implicar el tipado dinámico en absoluto.

Así que mi pregunta (y no está destinado a ser demasiado subjetivo) es, en la que los lenguajes dinámicos o campos de aplicación son todas estas características dinámicas del lenguaje más avanzados (que Couln't ser replicado en estática/compilado idiomas que fácilmente) realidad y idomatically utilizan.

Ejemplos:

  • Reflexión
  • continuaciones de primera clase
  • Runtime objeto alteración/generación
  • Metaprogramación
  • Runtime evaluación código
  • inexistente comportamiento miembro

¿Cuáles son aplicaciones útiles para estas técnicas?

+0

No quiero ser pedante, pero creo que tenemos que definir un "lenguaje dinámico" un poco mejor, al menos más allá de estas características. Por ejemplo, Haskell generalmente se considera el modelo de un lenguaje estático, pero tiene reflejo, continuaciones, metaprogramación (ver Plantilla Haskell) y evaluación del código de tiempo de ejecución. ¿Estamos hablando de tipeo dinámico versus estático? ¿Despacho dinámico? ¿Qué es "dinámico"? – Chuck

+0

@Chuck: Bueno, tienes razón y, para ser sincero, no es tan fácil.Me limitaría a las características que propuse, incluiré todos los lenguajes de scripting/lenguajes tipados dinámicamente y haré el resto ex negativo (nadie considerará que C++ es un lenguaje dinámico);) – Dario

Respuesta

2

Todas las características que enumera también están disponibles en lenguajes tipados estáticos, algunos con restricciones.

  • Reflexión: Presente en Java, C# (no escriba seguro).
  • Continuaciones de primera clase: soporte restringido en Scala (quizás otras)
  • Modificación del objeto en tiempo de ejecución: Se admite cambiar el tipo de un objeto en forma restringida en C# con métodos de extensión (estará en Java 7) y de tipo implícito conversiones en Scala. Aunque la clase abierta no es compatible, la mayoría de los casos de uso están cubiertos por conversiones de tipo.
  • Metaprogramación: Yo diría Metaprogramación es el título de un montón de características relacionadas como la reflexión, cambios de tipo en tiempo de ejecución, etc. AOP

Así que no hay mucho que dejó sólo es compatible con los lenguajes dinámicos a discutir. El soporte por ejemplo para Reflection elude el sistema de tipos pero es útil en ciertas situaciones donde se necesita este tipo de flexibilidad. Lo mismo es cierto en los lenguajes dinámicos.

La característica de clase abierta admitida por Ruby es algo que los lenguajes compilados nunca admitirán. Es la forma más flexible de metaprogramación posible (con todas las implicaciones: seguridad, rendimiento, capacidad de mantenimiento). Puede cambiar las clases de la plataforma. Es utilizado por Ruby on Rails para crear métodos de objetos de dominio a partir de metadatos sobre la marcha. En un lenguaje estáticamente tipado, al menos debe crear (o generar el código de) la interfaz de su objeto de dominio.

Si está buscando los "idiomas más dinámicos" todos homoiconic languages como LISP y Prolog son buenos candidatos. Curiosamente, C# es algo homicónica con los árboles de expresión en LINQ.

+0

Ni los métodos de extensión ni los implicits alteran o incluso extienden un tipo ** en tiempo de ejecución ** - Por lo tanto, es 100% estático. Además, esta pregunta no se trata de qué características son * exclusivamente dinámicas *, sino de dónde se usan. No creo que uno usaría idiomáticamente la generación de objetos en tiempo de ejecución en .NET. – Dario

+0

+1 para el resto, aunque – Dario

+0

@Dario Sí. Ambos están completamente tipados estáticamente. Mi respuesta es más sobre el problema que intentas resolver con diferentes funciones de idioma. Los idiomas con tipado estático encuentran soluciones diferentes a los lenguajes dinámicos a los mismos problemas (como los lenguajes funcionales encuentran una solución diferente a los lenguajes imperativos). –

8

Algunos ejemplos de aplicación generalizada de las técnicas anteriores son:

  • continuaciones hacen su aparición en los marcos web como rieles o junto al mar. Se pueden usar para permitir que una API falsifique un contexto local. En Mar o rieles esto hace que la API se comporta mucho más como un controlador de formulario GUI local que un controlador de solicitudes HTTP, que sirve para simplificar la tarea de codificación de elementos de la interfaz de usuario de la aplicación. Sin embargo, aunque muchos lenguajes dinámicos tienen un fuerte soporte para las continuaciones, ciertamente no son exclusivos de este tipo de lenguaje.

  • reflexión es bastante ampliamente utilizado para creadores de mapas O/R y la serialización, pero muchos tipos estáticos Langages apoyar la reflexión también. En los lenguajes tipados de pato se puede usar para averiguar en tiempo de ejecución si se implementa una instalación mirando los metadatos del objeto. Algunos mapeadores O/R (y herramientas similares) funcionan implementando accesos a variables de instancia y redirigiendo las actualizaciones a un registro en caché en la capa de acceso a datos. Esto ayuda a que la persistencia sea relativamente transparente para el desarrollador, ya que los accesos al campo se parecen mucho a las variables locales.

  • objeto de tiempo de ejecución alteración es poco útil (pensar mono-parches), pero sobre todo un truco. No hay muchos usos realmente útiles para él que se le ocurran inmediatamente, pero la gente ciertamente lo usa. Un posible uso para él es corregir el comportamiento ligeramente roto cuando la subclasificación no es una opción por alguna razón.

  • La metaprogramación es una definición bastante difusa para un término, pero podría decirse que los genéricos y las plantillas de C++ son un ejemplo de metaprogramación, que tiene lugar en los lenguajes estáticos. En lenguajes con compatibilidad de metaclases, las metaclases personalizadas se pueden usar para implementar comportamientos particulares, como registros únicos o registros de objetos.

    Otro ejemplo de metaprogramación es el método #notImplemented: de Smalltalk que se invoca cuando se intenta invocar métodos inexistentes. El nombre del método y los parámetros se suministran al implementador de #notImplemented:, y posteriormente se pueden usar para construir una invocación de método de forma reflexiva. Atrapar esto se puede usar (por ejemplo) para implementar mecanismos de proxy genéricos.

programadores LISP diría que es el lenguaje LISP más dinámico de todos debido a su primera clase de apoyo para diddling directamente con los árboles de análisis sintáctico del código (conocido como 'macros'). Esta facilidad hace que la implementación de DSL sea trivial en LISP y la integre de forma transparente en su base de código.

0

En última instancia, no son los idiomas los que escriben código dinámico, son programadores; y habrá una curva de aprendizaje para ajustar sus patrones a estilos a los que no está acostumbrado. Entonces, ¿qué tipos de trabajo pueden hacer un mejor uso de las capacidades dinámicas? Lo primero que me viene a la mente es el middleware; interfaces entre sistemas heterogéneos; especialmente aquellos con API o APIs imperfectamente documentadas que cambian mucho, y la serialización de datos es dinámica.

Diría que en cualquier lugar donde vea REST y se aplique jason, es más probable que encuentre código dinámico, por ejemplo, donde javascript, php, perl, ruby, ... son populares al menos parcialmente porque son capaz de adaptación dinámica.

Además, hay una gran cantidad de código de navegador JavaScript que trata sobre la versión del navegador y las incompabilidades de la marca mediante el uso de técnicas dinámicas.

+0

JSON se puede analizar de manera estática y no realmente requieren una evaluación dinámica aunque es utilizable de manera concisa en este contexto. – Dario

+0

Tienes razón, por supuesto. Cualquiera de esto se puede hacer estáticamente, de alguna manera. La pregunta era sobre el estilo del código y el punto de vista. Para mí, jason es información de tipo pato, y se combina bien con los lenguajes de pato. Recuerde, lo que json es, son declaraciones de objetos javascript serializados: datos autodefinidos dinámicamente y sin tipo (incluidos los objetos). – dkretz

2

Usted debe visitar Douglas Crockford's Wrrrld Wide Web y ver su magia sobre Javascript. Javascript generalmente se escribe de una manera simple y sencilla, como una C. ligeramente simplificada. Pero es solo la superficie. Las palabras clave que no se pueden unir son un pequeño porcentaje de la potencia del lenguaje. La mayor parte se encuentra en objetos y métodos exportados por el sistema, y ​​estos son completamente mutables. Puede reemplazar/extender métodos sobre la marcha, puede reemplazar métodos de sistema bastante arraigados, anidar eval(), cargar generado <SCRIPT> sobre la marcha, y así sucesivamente. Esto se puede utilizar para escribir todo tipo de extensiones de lenguaje, marcos, cajas de herramientas y demás. En lugar de 200 líneas de código de su programa en Javascript directo, usted escribe 50 líneas que modifican cómo funciona Javascript, y otras 50 que usan la nueva sintaxis para realizar el trabajo. Puede generar páginas enteras sobre la marcha, incluido JS incrustado en ellas. Usted convierte la estructura de la página web en almacenamiento de datos. Reemplace los métodos de objetos populares usados ​​frecuentemente, y los suyos propios, para cambiar su comportamiento sobre la marcha, cambiando no solo el aspecto sino también la función de una página web con un solo clic.

Parece que Javascript se convierte en un metalenguaje para modificar el motor Javascript y hacer que Javascript funcione como un idioma diferente, luego lo modifica con la aplicación ya modificada, y su aplicación final real toma una docena de líneas extremadamente intuitivas hacer que el idioma haga exactamente lo que necesita. Ah, y repara los innumerables errores y deficiencias de la implementación de Javascript en MSIE en el proceso.

1

No voy a reclamar Lisp es el "más dinámico" (no estoy seguro de lo que eso significa), pero los programadores de Lisp con frecuencia hago cosas que son de difícil imposible en otros idiomas:

  • crear nuevas estructuras de control
  • crear una nueva sintaxis de las construcciones existentes (creo que cada metaclase que he visto tiene su propia forma defwhatever)
  • extienden el tiempo de ejecución (cada .emacs es una extensión de tiempo de ejecución, por ejemplo, ¿cuál sería tomar para escribir el modo de calendario para otro editor?)

Yegge talks about it some here w.r.t. Emacs, por ejemplo, analiza XML convirtiéndolo en s-expressions, escribiendo funciones para las etiquetas que desea procesar, y realmente ejecutándolo.

0

Sí, siento que JavaScript es tan bueno.
JavaScript es tan flexible que las personas que trabajan en diferentes idiomas tienen diferentes variantes para ellos. Al igual que Microsoft, tiene una biblioteca Ajax que tiene una sintaxis típica del tipo .NET/C#. También hay algunas bibliotecas de JavaScript que usan $ que se parecen a las sintaxis de PHP. Está todo allí porque JavaScript está bien ¿Cuántos otros idiomas uno puede decir que pueden facilitar algo como esto?
Y uno debe saber acerca de la característica de cierre de JavaScript que es el estado del arte y ayudar a crear algoritmos increíbles con excelentes resultados.

Cuestiones relacionadas