dynamic - questions - Es Clojure Uni-Typed?
java interview questions (2)
Lo leí. No lo entiendo Pero, como adivina el autor Robert Harper, no fui a Carnegie Mellon. Parece que tenemos un montón de vitriolo dirigido a los hombres de paja seguidos finalmente por lo que equivale a la sorprendente conclusión de que los lenguajes de tipado dinámico se tipan dinámicamente.
La principal confusión aquí es entre los términos "lenguaje de programación dinámico" y "tipeado dinámicamente". Estos no son la misma cosa. Un lenguaje de programación dinámico puede tener un sistema robusto de tipo estático, por ejemplo, aunque la mayoría no lo haga. Harper está perpetuando esta confusión mezclando términos.
Lenguajes dinámicos
La descripción de Clojure que citó es acerca de Clojure como un "lenguaje de programación dinámico".
Todas las funciones compatibles con Clojure son compatibles en tiempo de ejecución.
El punto es que toda la potencia de Clojure está disponible en tiempo de ejecución. Puede agregar un nuevo código, agregar nuevos tipos, extender los protocolos a los tipos existentes, etc., todo dinámicamente en tiempo de ejecución.
Vale la pena presumir sobre esto.
Entonces, cuando Harper pregunta sarcásticamente, "Entonces, oye, los lenguajes dinámicos son geniales, ¿verdad?", Respondo con sinceridad: "Sí, señor, lo son, pero aparentemente no estamos hablando de lo mismo".
Tipos dinámicos
Tipeado dinámicamente vs. tipado estáticamente es otro problema. Clojure no se jacta de no tener un sistema de tipo robusto. La mayoría de los Clojurianos aceptaría la opción , de ahí el interés en core.typed . Hay mucho que decir sobre el sistema de tipos de Haskell, por ejemplo. Nadie realmente desafía eso.
Tu ejemplo
En su ejemplo, se está difuminando en tiempo de ejecución con tiempo de compilación (que ya está borroso con un lenguaje dinámico en el que la potencia máxima del compilador está disponible en tiempo de ejecución ). La verificación de tipo que realizó se produce en el tiempo de ejecución de su instrucción println
. En Clojure, los valores tienen tipos, la ubicación de almacenamiento de los tipos de referencia (como var
creado con def
) no.
Tu pregunta
Para responder a su pregunta sobre el título, Clojure cae bajo el título de tipeado dinámicamente. Puede llamar de forma dinámica "uni-tipado" si realmente lo desea; pero, al menos en el contexto de ese artículo, parece que ese término se usa como peyorativo. Así que, como Lawrence diría , "No. No, hombre. S ***, no, hombre. Creo que te darían una patada diciendo algo así, hombre". Simplemente llámalo de forma dinámica, sabe lo que eso significa. Algún día, sí, tendrá "un caso de los lunes" persiguiendo algún error de tiempo de ejecución que podría haberse capturado en tiempo de compilación.
Sin embargo, el problema más grande es que si te estás enfocando dinámicamente frente a estáticamente tipado , te está faltando el punto, sí, totalmente genial, de que Clojure es un lenguaje de programación dinámico . Los proyectos como core.typed finalmente proporcionarán el tipado. Las partes frías se mantendrán.
Robert Harper ha escrito una pieza fascinante llamada "Los lenguajes dinámicos son idiomas estáticos" . En él, escribe:
Y esto es precisamente lo que está mal con los lenguajes tipados dinámicamente: en lugar de ofrecer la libertad de ignorar tipos, ¡en cambio imponen la esclavitud de restringir la atención a un solo tipo! ¡Cada valor individual tiene que ser un valor de ese tipo, no tiene otra opción!
Esto ha llegado a significar idiomas unificados . (Idiomas de un solo tipo).
Ahora Clojure dice ser un lenguaje dinámico :
Clojure es un lenguaje de programación dinámico que se dirige a Java Virtual Machine (y CLR y JavaScript). Está diseñado para ser un lenguaje de propósito general, que combina la accesibilidad y el desarrollo interactivo de un lenguaje de scripting con una infraestructura eficiente y robusta para la programación multiproceso. Clojure es un lenguaje compilado: se compila directamente en el bytecode de JVM, pero sigue siendo completamente dinámico . Cada característica soportada por Clojure es soportada en tiempo de ejecución.
Por ''dinámico'' quieren decir ''se puede interactuar con en tiempo de ejecución'', en lugar de ''no tiene tipos''.
Ahora la distinción clave entre estático y dinámico parece ser "¿puedo obtener un error de tipo en tiempo de compilación?"
Si escribo el siguiente código de Clojure:
(deftype circle-type [radius] )
(deftype square-type [side-length])
(defn def-check-type [new-symbol-type existing-symbol]
(let [existing-symbol-type (type existing-symbol)]
(cond
(= new-symbol-type existing-symbol-type)
(def new-symbol existing-symbol)
:else (str "types didn''t match: " new-symbol-type " : " existing-symbol-type))))
(println (def-check-type circle-type (square-type. 2)));)
Luego compila en Leiningen:
lein uberjar
Luego recibo lo siguiente:
$ lein uberjar
Compiling clojure-unittyped.core
types didn''t match: class clojure_unittyped.core.circle-type : class clojure_unittyped.core.square-type
Lo que parece ser un error de tipo en tiempo de compilación en un lenguaje dinámico.
Mi pregunta es: ¿Clojure está unificado?
Editar - Conozco core.typed - que es una excelente obra. Estoy haciendo la pregunta por separado a eso.
Sí, Clojure está unificado, sin embargo, Sam Tobin-Hochstadt argumenta que la clasificación uni-tipificada no es muy informativa en la práctica.
La teoría uni-tipada revela poco acerca de la naturaleza de la programación en un lenguaje de tipado dinámico; es principalmente útil para justificar la existencia de tipos "dinámicos" en la teoría de tipos.
Proyectos como Typed Racket se inventaron precisamente para descubrir y modelar la información de tipo implícita utilizada por los programadores en dichos idiomas. A menudo, los tipos son bastante precisos, y muestra que hay mucho más en juego de lo que parece.