lenguaje hack javascript ocaml flowtype hacklang

javascript - ¿Cuáles son los beneficios de OCaml como lenguaje de programación detrás de Hacklang y Flow?



lenguaje hack (1)

Recientemente, Facebook anunció Flow, un comprobador de tipo estático para JavaScript, que se implementa principalmente en OCaml ( https://code.facebook.com/posts/1505962329687926/flow-a-new-static-type-checker-for-javascript/ ).

Hacklang (PHP con verificador de tipo estático) también está escrito principalmente en OCaml. Entonces, me pregunto cuáles son los beneficios distintivos de OCaml para hacer un verificador de tipo estático.


"¿Cuáles son los beneficios de OCaml como lenguaje de programación?" Es, de hecho, una pregunta basada en opiniones, y una que no voy a abordar aquí. Sin embargo, trabajo en el equipo de Hack en Facebook y he trabajado en estrecha colaboración con el equipo de Flow, por lo que puedo responder la pregunta que creo que pretendías preguntar: "¿Por qué Facebook eligió OCaml para crear Hack y Flow?"

  • La razón más importante es que OCaml tiene un soporte brillante para definir sus propios tipos de datos , y luego la coincidencia de patrones en ellos . La mayoría de lo que Hack y Flow hacen son operaciones sobre varias formas de un AST, y tener una manera realmente agradable de expresar "si ves este tipo de nodo con ese tipo de nodo dentro, haz esto" es invaluable. Eche un vistazo a la definición de subtipo en Hack : es ciertamente complicado, pero en el fondo es solo una gran coincidencia de patrones en un par de tipos, y sería demasiado complejo en cualquier idioma sin la coincidencia de patrones.
  • OCaml es en gran parte un lenguaje funcional, con un gran soporte para funciones de primera clase y estructuras de datos inmutables. De forma similar a lo anterior, cuando realiza una comprobación de tipos, termina haciendo muchos tipos diferentes de mapas y pliegues sobre los nodos AST, y los lenguajes funcionales lo expresan de manera concisa. Por ejemplo, escribir un bloque de código es literalmente solo un fold_left sobre las declaraciones que contiene .
  • Pero no es puramente funcional. Es "impuro": a veces, el estado mutable , el uso de excepciones o similares es la mejor manera de expresar algo. Pero lo más importante, significa que no necesita ningún tipo de cambio de modelo mental o acrobacia complicada ni nada para llamar a las funciones de C a través de una FFI . Tanto Hack como Flow utilizan el mismo modelo para multiproceso: una región especialmente mmap ''d compartida entre diferentes procesos de fork , que contiene una tabla hash sin bloqueo compartida. Ese es el tipo de cosas que no me gustaría expresar en ningún idioma, excepto C, y eso es exactamente lo que hacemos . El código OCaml puede llamar a un par de funciones mágicas sin ser consciente de que en realidad es C debajo del capó. (Aparte de eso, haré una charla técnica en enero sobre cómo funciona exactamente nuestro multihilo, junto con algunos otros detalles de la implementación de Hack: es realmente genial, pero difícil de entender sin una introducción, incluso si el código es de código abierto!)