- A medida que WebAssembly gana importancia en la computación en la nube y en el edge, Moonbit apunta a ser un lenguaje Wasm-first que facilite aprovechar la eficiencia, seguridad y tamaño reducido de Wasm.
- Moonbit busca resolver las limitaciones de Rust y C/C++, como la dificultad de aprendizaje y los largos tiempos de compilación, así como las de Go, cuyo código generado es más grande e ineficiente.
- Su diseño se enfoca en compilaciones y ejecución rápidas, salida Wasm pequeña y facilidad de uso, e incluye optimización con múltiples representaciones intermedias, análisis semántico paralelo por función y reanálisis incremental.
- En el ejemplo de Fibonacci, destaca la inferencia de tipos en funciones locales, la salida Wasm más pequeña, mejor rendimiento que Go y un desempeño similar a Rust, además de soporte para cierres recursivos y exhaustive pattern match.
- Actualmente ofrece IDE en línea, herramientas CLI, documentación y extensión para VSCode, y apunta a alcanzar el beta status a finales del segundo trimestre de 2024 y publicar el código fuente después de llegar a calidad beta.
Un lenguaje con WebAssembly como prioridad
- WebAssembly es una arquitectura de conjunto de instrucciones multiplataforma cuya relevancia crece en la computación en la nube y en el edge por su eficiencia, seguridad, tamaño reducido y estándar abierto.
- Consideran que las opciones existentes no aprovechan del todo el potencial de Wasm.
- Los lenguajes Wasm de bajo nivel como Rust y C/C++ son difíciles de aprender, y sus largos tiempos de compilación pueden ralentizar el desarrollo.
- Los lenguajes de alto nivel como Go generan código ineficiente y más grande, por lo que cuesta aprovechar las ventajas de velocidad y tamaño reducido de Wasm.
- Moonbit busca ser un lenguaje Wasm-first que compile y ejecute rápido, genere una salida Wasm pequeña y sea fácil de aprender, como Go.
Diseño del lenguaje y equipo
- Moonbit está liderado por Hongbo Zhang y un equipo con más de 10 años de experiencia en diseño y desarrollo de lenguajes.
- Zhang ha contribuido a OCaml, ReScript y Flow, y fue chief architect del compilador rápido, la biblioteca estándar y el sistema de build del toolchain de ReScript.
- El diseño del lenguaje recibe influencias tanto de Go como de Rust.
- Adopta la simplicidad de Go, en especial su sistema de paquetes.
- Incorpora la expresividad de Rust, incluyendo pattern matching, inferencia de tipos, genéricos y ad-hoc polymorphism similar a traits.
- Su sistema de tipos fault tolerant fue diseñado teniendo en cuenta velocidad, paralelización y verificación incremental, y pone el soporte para IDE como objetivo central.
Compilación y ejecución rápidas
- Moonbit apunta a ser un lenguaje rápido en toda la pila, abarcando tanto el rendimiento de desarrollo como el rendimiento en tiempo de ejecución.
- Usa representaciones intermedias (IR) de múltiples niveles para la optimización de programa completo.
- Busca mejorar el layout de memoria para reducir cache misses.
- Ofrece mejor contexto para el análisis de flujo de datos y de control.
- Considera que permite optimizaciones eficaces al comprender la estructura del programa de forma más integral que la mayoría de las arquitecturas existentes de link-time optimization.
- Puede detectar y eliminar redundancias de alto nivel que no son visibles en niveles bajos.
- Para lograr un rendimiento de compilación rápido, crucial para las funciones del IDE, permite análisis semántico paralelo por función.
- A diferencia de ReScript y Rust, hace posible el análisis semántico paralelo por función.
- También realiza reanálisis incremental con la misma granularidad, lo que, según afirman, permite manejar monorepos grandes y ofrecer tiempos de respuesta en milisegundos.
Salida Wasm pequeña
- Moonbit fue diseñado pensando en una dead code elimination efectiva.
- Excluye características del lenguaje que dificultan este análisis, y su biblioteca estándar también está estructurada para facilitar la eliminación de código muerto.
- Busca reducir considerablemente el tamaño final del código mediante optimización de programa completo.
- Consideran que reducir el tamaño del código mejora la seguridad y disminuye la superficie de ataque.
- También afirman que garantiza inicios rápidos en entornos de computación serverless.
Funciones y herramientas orientadas a la usabilidad
- Moonbit ofrece gestión automática de memoria, diferenciándose de Rust.
- A diferencia de Go, afirma evitar elementos riesgosos como punteros o left values.
- Proporciona funciones seguras para la programación orientada a datos.
- algebraic data types
- ad-hoc polymorphisms
- pattern match
- También busca funcionar como plataforma más allá del lenguaje, y ofrece un conjunto de herramientas incluso en esta etapa inicial.
- herramienta de build de alta velocidad
- gestor de paquetes
- compilador
- IDE
- Cloud IDE sin contenedores, accesible desde cualquier lugar con solo un navegador
- Afirman que este Cloud IDE también ofrece funciones offline, lo que lo diferencia de otros Cloud IDE existentes.
Diferencias vistas con el ejemplo de Fibonacci
- El ejemplo de Fibonacci compara implementaciones de la función
fiben MoonBit, Go y Rust. - Según el benchmark, MoonBit muestra diferencias en inferencia de tipos, tamaño de código, rendimiento y usabilidad.
- Inferencia de tipos local: MoonBit infiere el tipo de la función local
aux. - Tamaño Wasm pequeño: MoonBit genera la salida Wasm más pequeña.
- Rendimiento: es más rápido que Go y similar a Rust.
- Usabilidad: soporta cierres recursivos como Go, mientras que en Rust dicen que implementarlos es muy difícil.
- Al igual que Rust, soporta exhaustive pattern match, y lo consideran mucho más potente que el switch case de Go.
- Inferencia de tipos local: MoonBit infiere el tipo de la función local
Estado actual y hoja de ruta
- Moonbit es un objetivo que cambia rápidamente, pero actualmente ofrece puntos de entrada utilizables.
- Señalan que el desarrollo de toolchains de lenguaje solía tomar desde varios años hasta una década, pero que han simplificado el proceso gracias a la experiencia acumulada y a un equipo dedicado conformado desde el inicio.
- Esperan alcanzar el beta status para finales del segundo trimestre de 2024.
- beta status significa estabilidad relativa, pocos bugs y un FFI robusto para interactuar con el host de Wasm.
- Planean publicar el código fuente después de alcanzar calidad beta.
- Sus planes estratégicos incluyen la integración de Wasm GC para Wasm 2.0 y un GC propio para Wasm 1.0, alineados con las propuestas de Wasm.
Canales de la comunidad
- Las preguntas se pueden publicar en el forum.
- También se puede participar en Discord o seguir su cuenta de Twitter.
1 comentarios
Opiniones de Hacker News
Soy el líder de este proyecto. Ya se puede probar directamente en el IDE en línea https://try.moonbitlang.com, y se ejecuta con F5
La documentación está en https://github.com/moonbitlang/moonbit-docs, y el compilador se hará público cuando llegue al estado beta. La fecha estimada es fines del segundo trimestre de 2024
Por ejemplo, también quiero revisar si tiene anotación explícita de varianza en parámetros de tipo, restricciones de límite inferior/superior, tipos de orden superior (higher-kinded types), si se centra más en subtipado estructural o nominal, y si tiene tipos de datos algebraicos y tipos de datos algebraicos generalizados
Referencias: https://v2.ocaml.org/manual/effects.html, https://docs.hhvm.com/hack/contexts-and-capabilities/introdu..., https://austral-lang.org/linear-types
fn. No entiendo cuál es la diferencia fundamental entrefuncyfnfuncyfn, y si la flecha->para indicar el valor de retorno en la firma de una función es realmente necesariaLa sintaxis para nuevos tipos es
struct User, pero en ese caso creo que sería mejor algo como Go,type User struct. Así también se podrían crear tipos de función para variablesfn, comotype AssignUser func(name: String, id: Int) -> IntTambién me pregunto si
:ayuda al lexer o al parser. Quisiera preguntar si en la firma de una función no se podría escribirfunc(name String)en vez defunc(name: String), y si las declaraciones de tipos no podrían sermut elems List[int]en vez demut elems: List[Int]. Es una objeción menor, pero en general me gustaEl sitio lo compara con Rust y Go, pero a mí me parece más adecuada la comparación con AssemblyScript. AssemblyScript también es nativo de WASM, y se parece en que su ecosistema todavía es pequeño
Pero, a diferencia de Moonbit, es un lenguaje familiar para quienes han usado TypeScript, así que me pregunto por qué habría que usar Moonbit en lugar de AssemblyScript
AssemblyScript no tiene pattern matching y está compuesto principalmente por sentencias (statements). Moonbit tiene tipos de datos algebraicos; no estoy seguro de si AssemblyScript tiene algo así. También puede haber más diferencias de runtime, pero solo viendo el sitio web es difícil juzgarlo
No me parece bien usar la palabra clave
funcpara definiciones de funciones de nivel superior yfnpara definiciones de funciones anidadas. Deberían unificarlo en una de las dos, independientemente del contexto específicoSi eso es realmente necesario o un buen diseño es otra cuestión, pero hay muchos precedentes
fnpermite omitir el nombre y el tipo, y la palabra clave corta muestra que la definición de función también puede ser más breveMe entusiasma que aparezca un lenguaje moderno con garbage collection orientado a WASM. El punto de comparación más cercano probablemente sea Grain: https://grain-lang.org/
“El desarrollo de toda la toolchain de un lenguaje antes tomaba de varios años hasta una década, pero se simplificó gracias a la experiencia acumulada y a un excelente equipo dedicado formado desde los inicios de Moonbit. Se espera que Moonbit llegue al estado beta para fines del segundo trimestre de 2024, lo que significa una etapa relativamente estable, con menos bugs y una FFI sólida para interactuar con hosts Wasm. Al alcanzar calidad beta, se publicará el código fuente. Estratégicamente, de acuerdo con las propuestas de Wasm, se planea integrar Wasm GC para Wasm 2.0 y un GC propio para Wasm 1.0”.
Por eso ahora https://github.com/moonbitlang/ está vacío
También se puede probar el IDE en línea: https://try.moonbitlang.com
Viendo los comentarios aquí, parece que Moonbit tiene garbage collection. Pero si el binario resultante de Fibonacci pesa 253 bytes, probablemente no incluya el GC
Me pregunto si usa el GC nativo de WASM que está en propuesta, o si el sistema de build es lo bastante inteligente como para darse cuenta de que aquí no hace falta y quitar el GC
En la salida del ejemplo de Fibonacci solo se ve el import
print_i32, las definiciones de memoria y funciones, y la exportación de_start; no parece que venga pegado un runtime de GCMe recuerda a Grain. Como es otro lenguaje de programación con Wasm como prioridad, estaría bien agregar Grain como punto de comparación
https://grain-lang.org/
El enlace About Team lleva a una página edu.cn en chino. Parece un proyecto universitario, aunque no estoy seguro. La página Join Us también está en chino, y el ejemplo de la página principal parece requerir JavaScript de baidu.com
En Go no se implementa Fibonacci así
Parece que fue más fácil meter unos cuantos números que comparar implementaciones idiomáticas y discutir los trade-offs con detalle. Aunque sea solo un teaser sencillo del lenguaje, sería bueno incluir una nota sobre TCO para no confundir a la gente
switch, que en Go puede ser lentaAun así, como teaser para presentar Moonbit está bien
Me pregunto si este proyecto tiene relación con Meta. Su creador, Hongbo Zhang, trabajó en Meta en proyectos open source de lenguajes de programación como ReasonML y Flow, y según LinkedIn todavía trabaja en Meta