AssemblyScript tiene un nuevo competidor: el lenguaje Grain, creado para WebAssembly, se declaró en voz alta



Oscar Spencer es uno de los fundadores del



lenguaje Grain Grain, un lenguaje de programación de alto nivel y fuertemente tipado. Es un lenguaje híbrido que combina algunas características de programación funcional (por ejemplo, inferencia de tipos, coincidencia de patrones, cierres) e imperativa (por ejemplo, variables mutables).



Oscar Spencer, uno de los creadores del lenguaje, presentó Grain en el WebAssembly Summit 2021. Spencer habló sobre sus características más interesantes e importantes, y también enfatizó que Grain fue creado y optimizado específicamente para WebAssembly. Solo se puede compilar en código de bytes Wasm. Al menos este es el caso hoy.



Así es como los desarrolladores formularon la misión del lenguaje Grain:



Grain se esfuerza por tomar lo mejor de los lenguajes de programación funcionales e imperativos y llevarlo a una audiencia más amplia. Muchos idiomas tienen grandes ideas, pero finalmente estos idiomas no se generalizaron. Esto se debe a que son demasiado extraños o demasiado difíciles de aprender. Y, en consecuencia, sus intentos de reunir a una gran comunidad a su alrededor han fracasado. Grain debe dar nueva vida a estas ideas y presentarlas de una manera accesible, sin dejar de ser fácil de usar.


La WebAssembly Summit es una conferencia anual dedicada a todos los aspectos del uso e interacción con Wasm. La cumbre discutida en el artículo tuvo lugar en abril de 2021.



Tipos de datos



Además de los denominados tipos de datos centrales de WebAssembly (por ejemplo, los tipos básicos i32 también conocido como Int32), Grain tiene tipos de datos compuestos. Por ejemplo: 



  • Opción es un tipo especial de enumeración que define la presencia de opciones (opciones) como Algunas o la ausencia como Ninguna; 
  • Resultado - todo es estándar: Err, si algo salió mal, y Ok, si todo es así; 
  • Stack es una pila inmutable. 


Grain también implementa tuplas, registros, matrices, listas, rangos, caracteres, cadenas, conjuntos, mapas, colas y mucho más.



Así es como se ve el programa Grain más simple:



import List from «list»

import Option from «option»

import { data } from «./data»

let allPairs = List.product(data, data);

let (a, b) = Option.expect (

	«Expected to find values»,

	List.find(((a ,b)) => a + b == 2020, allPairs)

);

print((«Values», a, b));

print((«Answer», a * b));

      
      





El ejemplo está tomado del código de tiempo del informe de video de Spencer.



Constructores genéricos



Grain permite, por ejemplo, crear enumeraciones utilizando constructores genéricos.



enum  Veggie {  Squash,  Cabbage,  Broccoli  }  

enum  Fruit {  Apples,  Oranges,  Bananas  }  

enum  Inventory<produce>  {  Crate(produce),  Truckload(produce)  }  

let veggieInventory  =  [Crate(Broccoli),  Truckload(Cabbage)]  

let fruitInventory  =  [Crate(Apples),  Truckload(Oranges)]

      
      





En el ejemplo de código anterior, el parámetro de los constructores Crate y Truckload es una variable de producción.



La coincidencia de patrones



enum  Topping {  Cheese,  Pepperoni,  Peppers,  Pineapple  }  

enum  Menu {  Pizza(Topping),  Calzone(Topping)  }  

let item  =  Calzone(Peppers)  

match  (item)  {  

 Calzone(topping)  =>  {  

 if  (checkSpecials(topping))  {  

 print(«These are half off this week.»)  

 }  else  {  

 print(«No current specials.»)  

 }  

 },  

 _  =>  print(«No current specials.»)  

}

      
      





La sección de documentación Bindings in Match Patterns dice que podemos vincular un patrón coincidente (patrón) a, por ejemplo, un nombre de enumeración. Luego, sustituyendo su nombre en el caso correspondiente en el cuerpo de la expresión de coincidencia, podemos verificar automáticamente los valores de esta enumeración.



En el ejemplo de código anterior, el valor de la variable topping está vinculado con la enumeración Topping, que inicializa el elemento en la enumeración del menú con uno de sus valores.



La coincidencia de patrones también funciona para registros, tuplas y listas. Veamos un ejemplo para una lista:



let list  =  [123

match  (list)  {  

 []  =>  print(«List contains no elements»),  

 [_]  =>  print(«List contains one element»),  

 [_,  _]  =>  print(«List contains two elements»),  

 [_,  _,  _]  =>  print(«List contains three elements»),  

 _  =>  print(«List containes more than 3 elements»)  

}

      
      





Puede leer más sobre esta función de idioma aquí.



Brevemente sobre otras posibilidades de Grain



En el proceso de trabajar en Grain, los desarrolladores prestaron gran atención a la implementación completa y moderna de las funciones. Por ejemplo, una función se puede utilizar como valor. Al igual que JavaScript, Grain implementa cierres.



Grain también sabe cómo imprimir valores sin convertirlos en una cadena. Además, Grain puede acceder a la interfaz del sistema WebAssembly (WASI). La interfaz del sistema WebAssembly debería permitir que el código Wasm se ejecute en todos los dispositivos y sistemas operativos. WASI incluye API para E / S asincrónicas, generación de números aleatorios, obtención de la hora actual y más.



Los programas de cereales se pueden dividir en módulos. Los módulos se pueden exportar o importar desde otros módulos de Grain. Los módulos de grano también pueden conectar funciones externas. Pero solo con la condición de que el propio desarrollador se asegure de que se creen las funciones externas correspondientes.



Ahora hay una finalización activa de la interfaz de función externa (FFI - Interfaz de función externa), así como enlaces estáticos, que funcionan en modo de 64 bits, la biblioteca DOM estándar y macros.



Para aquellos que quieran sumergirse más profundo



Enlace estático



Hasta el lanzamiento de abril de 2021, todos los programas de Grain se ensamblaban mediante un motor js especial que desempeñaba el papel de enlazador dinámico. Sin embargo, con este enfoque, los programas solo se pueden ejecutar en Node.js y navegadores. Grain ahora puede usar tiempos de ejecución independientes para WebAssembly: Wasmer, Wasmtime y Wasm3.



En 2018, los desarrolladores de Grain se dieron cuenta claramente de que la vinculación estática era vital para el desarrollo futuro del proyecto. Pero esperaban poder usar las herramientas del ecosistema para hacer esto. Desafortunadamente, no se encontró ninguna herramienta adecuada y Oscar decidió incrustar la fase de enlace estático directamente en el compilador de Grain. Para implementar enlaces estáticos usando el kit de herramientas de Binaryen, se necesitaron alrededor de 600 líneas de código para escribir. 



Sin embargo, después de eso tuve que abordar una tarea más compleja y voluminosa: reescribir el código JavaScript del tiempo de ejecución y el código AssemblyScript de la biblioteca estándar en Grain puro.



Grano vs AssemblyScript



AssemblyScript , que compila un subconjunto de TypeScript en Wasm, también se describe como un lenguaje especialmente diseñado para WebAssembly. También tiene una biblioteca estándar con tipos compuestos (por ejemplo, para matrices o fechas). Al igual que Grain, AssemblyScript se compila en WebAssembly utilizando Binaryen. AssemblyScript, al ser un lenguaje de alto nivel, tiene como objetivo brindar a los desarrolladores más capacidades de "bajo nivel" al resolver tareas que exigen rendimiento (en comparación con TS y JS). 



Sin embargo, AssemblyScript requiere anotaciones adicionalestipos. En comparación con TypeScript, la inferencia de tipos en AssemblyScript es limitada porque el tipo de cada expresión debe conocerse de antemano. Esto significa que las declaraciones de variables y parámetros deben ser de tipo anotado o inicializador.



Grain es un lenguaje fuertemente tipado (proporcionado por OCaml typechecker) que requiere poca o ninguna anotación. Esto se logró gracias al hecho de que los desarrolladores implementaron un mecanismo de inferencia de tipos. 



¿Dónde buscar?



Grain (junto con la CLI, el compilador, el tiempo de ejecución y la biblioteca estándar) viene en un solo binario. Esta versión está disponible para MacOS x64 , Linux x64 y Windows x64 . En otras plataformas, puede utilizar la versión JS del compilador de Grain.



Documentación de granos.



Video con el informe:










Los servidores en la nube de Macleod son rápidos y seguros.



Regístrese usando el enlace de arriba o haciendo clic en el banner y obtenga un 10% de descuento durante el primer mes de alquiler de un servidor de cualquier configuración.






All Articles