elm - library - reasonml language
ReasonML vs Elm (1)
No estoy muy familiarizado con Elm, pero lo he investigado un poco y estoy bastante familiarizado con el Reason, así que lo intentaré. Sin embargo, estoy seguro de que habrá imprecisiones aquí, así que, por favor, no tomes nada de lo que digo como un hecho, sino que utilízalo como un indicador de lo que debes analizar con más detalle si te importa.
Tanto Elm como Reason son lenguajes similares a ML con modelos de programación muy similares, por lo que me centraré en las diferencias.
Sintaxis : Elm usa una sintaxis similar a Haskell que está diseñada (y / o evolucionó) para el modelo de programación que usan tanto Elm como Reason, así que debería funcionar muy bien para leer y escribir código idiomático una vez que esté familiarizado con él, pero parecerá Muy diferente y poco familiar para la mayoría de los programadores.
Reason intenta ser más accesible emulando la sintaxis de JavaScript tanto como sea posible, lo que será familiar para la mayoría de los programadores. Sin embargo, también tiene como objetivo admitir todo el conjunto de características del lenguaje OCaml subyacente, lo que hace que algunos patrones funcionales sean bastante incómodos.
Un ejemplo de esto es la sintaxis de la aplicación de la función, que en Elm enfatiza la naturaleza currificada de las funciones ( fab
) y funciona muy bien para componer funciones y crear DSL legibles. La sintaxis entre paréntesis del motivo ( f(a, b)
) oculta esta complejidad, lo que facilita el acceso (hasta que accidentalmente te tropiezas con él, ya que, por supuesto, todavía es diferente por debajo), pero el uso intensivo de la composición de funciones es un lío de paréntesis .
Mutabilidad : Elm es un lenguaje puramente funcional, que es genial en teoría pero desafiante en la práctica, ya que el mundo circundante se preocupa poco por la búsqueda de pureza de Elm. Creo que la solución preferida de Elm para esto es aislar la impureza escribiendo el código ofensivo en JavaScript y luego acceder a él en Elm a través de componentes web o puertos. Esto significa que podría tener que mantener cantidades significativas de código en un lenguaje separado y muy inseguro, un poco de repetitivo para conectarlos, así como tener que descubrir cómo encajar las cosas redondas a través de los orificios cuadrados de los puertos y demás. El primer lugar.
La razón, por otro lado, es ... pragmática , como me gusta llamarlo. Usted sacrifica algo de seguridad, ideales y beneficios a largo plazo para aumentar la productividad y los beneficios a corto plazo. Aislar la impureza sigue siendo una buena práctica en Reason, pero inevitablemente vas a tomar atajos solo para hacer las cosas, y eso te morderá más adelante.
Pero incluso si logras ser lo suficientemente disciplinado para aislar toda impureza, aún tienes que pagar un precio para tener la mutación en el idioma. Parte de ese precio es lo que se llama la restricción de valor , que se encontrará tarde o temprano, y te confundirá y te enfurecerá, ya que rechazará el código que debería funcionar de manera intuitiva, solo porque el compilador no puede hacerlo. probar que no puede haber en algún punto una referencia mutable involucrada.
Interoperabilidad de JavaScript : como se mencionó anteriormente, Elm proporciona la capacidad de interoperar con JavaScript a través de puertos y componentes web, que son deliberadamente limitados. Antes podías usar módulos nativos, que ofrecían mucha más flexibilidad (y capacidad para dispararte en el pie), pero esa posibilidad está desapareciendo (al menos para la gente), un movimiento que no ha sido incontrovertido (pero también No debería ser tan sorprendente dada la filosofía). Lea más sobre este cambio aquí
Reason, o más bien BuckleScript, proporciona un rico conjunto de primitivas para poder unirse directamente a JavaScript, y muy a menudo produce una interfaz idiomática de Reason sin necesidad de escribir ningún código de pegamento. Y aunque no es muy intuitivo, es bastante fácil hacerlo una vez que lo asimilas. Sin embargo, también es fácil equivocarse y hacer que te estalle en la cara en algún momento al azar. Cualquiera que sea el código de pegamento que tenga que escribir para proporcionar una buena API idiomática puede escribirse en Reason, con todas sus garantías de seguridad, en lugar de tener que escribir JavaScript inseguro.
Ecosistema : como consecuencia de la limitada interoperabilidad de JavaScript de Elm, el ecosistema es bastante pequeño. No hay muchas bibliotecas de JavaScript de buena calidad que proporcionen componentes web, y hacerlo usted mismo requiere mucho esfuerzo. Así que, en cambio, verás que las bibliotecas se implementan directamente en Elm, lo que requiere incluso más esfuerzo, pero a menudo resultará en una mayor calidad, ya que están diseñadas específicamente para Elm.
Herramientas : Elm es famoso por sus grandes mensajes de error. La razón en gran medida no lo hace, aunque se esfuerza por hacerlo. Esto es al menos en parte porque Reason no es en sí mismo un compilador, sino que está construido sobre el compilador OCaml, por lo que la información disponible es limitada y el área de superficie de posibles errores es muy grande. Pero tampoco están tan bien pensados.
Elm también tiene una gran herramienta de empaquetado que configura todo para ti e incluso comprueba si la interfaz de un paquete que estás publicando ha cambiado y si el bump de la versión corresponde a la versión semántica. Resaon / BuckleScript solo utiliza npm
y requiere que administre todo lo relacionado con Reason / BuckleScript de forma manual, como actualizar bsconfig.json
con nuevas dependencias.
Sin embargo, Reason, BuckleScript, su sistema de compilación y OCaml son increíblemente rápidos. Todavía no he experimentado ningún proyecto que demore más de 3 segundos en compilarse desde cero, incluidas todas las dependencias, y la compilación incremental generalmente toma solo milisegundos (aunque esto no es completamente gratuito para la facilidad de uso). Elm, como yo lo entiendo, no es tan performante.
Elm y Reason tienen herramientas de formato, pero el código con formato de Reason es de una calidad significativamente inferior (aunque está mejorando lentamente). Creo que esto se debe en gran parte a la sintaxis mucho más compleja con la que tiene que lidiar.
Madurez y decadencia : la razón, al construirse en OCaml, tiene raíces que se remontan a más de 20 años. Eso significa que tiene una base sólida que ha sido probada en la batalla y ha demostrado que funciona durante un largo período de tiempo. Además, es un lenguaje desarrollado en gran medida por académicos, lo que significa que una función puede tardar un tiempo en implementarse, pero cuando se incorpora es sólida como una roca porque está fundamentada en la teoría y posiblemente incluso probada formalmente. En el lado negativo, su edad y naturaleza experimental también significa que se ha reunido un poco de crucero del que es difícil deshacerse.
Elm por otro lado, al ser relativamente nuevo y menos manejado burocráticamente, puede moverse más rápido y no tiene miedo de romper con el pasado. Eso lo hace más delgado y más coherente, pero también tiene un sistema de tipo menos potente.
Portabilidad : Elm compila a JavaScript, que en sí mismo es bastante portátil, pero actualmente está restringido al navegador, y más aún a la Arquitectura Elm. Esta es una opción, y no sería demasiado difícil apuntar a nodos o plataformas. Pero el argumento en contra es, como yo lo entiendo, que desviaría el enfoque, haciéndolo menos excelente en su nicho.
La razón, al estar basada en OCaml, en realidad se enfoca primero en el código de máquina y el código de bytes nativos, pero también tiene un compilador de JavaScript (o dos) que le permite apuntar a los navegadores, nodos, electrones, reactores nativos e incluso la capacidad de compilar en un unikernel El soporte de Windows es supuestamente un poco incompleto. Como un ecosistema, el Reason apunta a Reaccionar ante todo, pero también tiene bibliotecas que permiten el uso de la Arquitectura Elm de forma natural.
Gobernanza : Elm está diseñado y desarrollado por una sola persona que es capaz de comunicar claramente sus objetivos y razonamiento y que se le paga para trabajar en ello a tiempo completo. Esto lo convierte en un producto final coherente y bien diseñado, pero el desarrollo es lento y el factor de bus puede dificultar la inversión.
La historia de Reason es un poco más compleja, ya que es más un nombre de paraguas para una colección de proyectos.
OCaml es administrado, diseñado y desarrollado de manera abierta, en gran parte por académicos, pero también por desarrolladores patrocinados por varias fundaciones y patrocinadores comerciales.
BuckleScript , un compilador de JavaScript que se deriva del compilador OCaml, está desarrollado por un solo desarrollador cuyos objetivos y situación laboral no están claros, y que no se molesta en explicar sus razonamientos o decisiones. El desarrollo es técnicamente más abierto en cuanto a que se aceptan los RP, pero la falta de explicación y el código de base obtuso hacen que el desarrollo sea efectivamente cerrado. Desafortunadamente, esto tampoco conduce a un diseño particularmente coherente, y el factor bus también puede dificultar la inversión aquí.
Reason en sí, y ReasonReact , es administrado por Facebook. Las relaciones públicas son bienvenidas, y una parte significativa del desarrollo de la Razón es impulsada por personas externas, pero la mayoría de las decisiones parecen tomarse en un cuarto trasero en algún lugar. Las relaciones públicas con ReasonReact, más allá de las correcciones de errores triviales y similares, a menudo se rechazan, probablemente por una buena razón pero generalmente con poca explicación. Un diseño mejor entonces surgirá típicamente de la habitación trasera algún tiempo después.
Vi esta pregunta de ReasonML vs TypeScript aquí en StackOverflow, ahora me pregunto cómo se comparan ReasonML y Elm entre sí.
¿Cuáles son sus similitudes y diferencias? ¿Cuál debo usar cuando? ¿Cuál es la ventaja de uno sobre el otro?