Ballerina es un lenguaje de programación de propósito general de código abierto diseñado por WSO2 para programadores de aplicaciones de la era de la nube . [2]
El proyecto fue iniciado en 2015 por arquitectos de WSO2 como una alternativa basada en código a las herramientas de integración basadas en configuración como EAI , ESB y productos de flujo de trabajo. [5] [6]
Tiene varias construcciones orientadas al desarrollo nativo de la nube, incluido soporte para varios formatos y protocolos de datos, confiabilidad, transacciones distribuidas, API y flujos de eventos. [7] [8] [9]
Ballerina se anunció públicamente por primera vez en 2017 y la versión 1.0 se lanzó el 10 de septiembre de 2019. [10]
Ballerina es un lenguaje de propósito general con una sintaxis familiar junto con una representación gráfica directa del código en forma de diagramas de secuencia. Tiene abstracciones fundamentales diseñadas para facilitar la programación de problemas de integración. [11] Ballerina fue diseñado por WSO2 para mejorar la productividad de los desarrolladores de aplicaciones que tienen que trabajar con computación distribuida . Es fácil de escribir y modificar y es adecuado para programadores de aplicaciones. [12] [13] [14]
Los diseñadores, que proporcionaron productos de integración empresarial durante más de 10 años, utilizaron su conocimiento de la industria al diseñar el lenguaje, [15] [16] dice el director de WSO2 y fundador de Ballerina, James Clark.
El programa habitual de Hola Mundo:
importar bailarina / io ; función pública principal () { io : println ( "¡Hola mundo!" ); }
Para ejecutar el programa anterior, coloque el código fuente en un .bal
archivo y proporcione la ruta del archivo al bal run
comando.
$ ballerina run hello_world.bal ¡Hola mundo!
La versión de servicio del programa Hola Mundo:
importar bailarina/http;servicio /saludo en nuevo http:Listener(9090) { La función de recurso get () devuelve una cadena { devuelve "¡Hola mundo!"; }}
Los servicios se ejecutan de la misma manera, excepto que no finalizan como lo hacen los programas normales. Una vez que el servicio está en funcionamiento, se puede utilizar un cliente HTTP para invocarlo. Por ejemplo, el servicio anterior se puede invocar utilizando el siguiente comando cURL:
$ curl http://localhost:9090/greet ¡ Hola mundo!
[17]
importar bailarina / http ; servicio en nuevo http : Listener ( 9090 ) { recurso función post factorial ( @http : Payload string payload ) devuelve http : Ok | http : BadRequest { int | error num = int : fromString ( payload ); si num es un error { return < http : BadRequest >{ body : "Entero inválido: " + payload }; } si num < 0 { return < http : BadRequest >{ body : "El entero debe ser >= 0" }; } int resultado = 1 ; foreach int i en 2 ... num { resultado *= i ; } devolver < http : Ok >{ cuerpo : resultado }; } }
$ curl http://localhost:9090/factorial -d 5 120
importar bailarina / graphql ; servicio / acciones en el nuevo graphql : Listener ( 4000 ) { recurso función obtener cotización () devuelve StockQuote { return { ticker : "EXPO" , precio : 287.5 , apertura : 285 , cierre anterior : 285.5 , mínimo : 276.25 , máximo : 297 }; } } tipo registro de cotización de acciones { | cadena ticker ; precio flotante ; precio flotante de apertura ; precio flotante de cierre anterior ; precio flotante mínimo ; precio flotante máximo ; | };
$ curl -H "Tipo de contenido: aplicación/json" -d '{"consulta": "{ cotización { ticker, precio } }" }' 'http://localhost:4000/stocks' {"datos":{"cotización":{"ticker": "EXPO", "precio": 287,5}}}
El diagrama de secuencia generado es una representación canónica del código fuente. Las dos representaciones se pueden utilizar indistintamente. El soporte para diagramas se proporciona a través del complemento Ballerina VS Code. A continuación, se muestran un par de diagramas de secuencia generados, comparados con su código asociado.
Un programa de muestra para recuperar y procesar datos de COVID-19:
Un programa de muestra para crear un informe a partir de datos de solicitudes de extracción recuperados de GitHub:
El lenguaje ofrece compatibilidad para trabajar con valores JSON. El tipo integrado `json` se define como la siguiente unión:()|boolean|int|float|decimal|string|json[]|map<json>
importar bailarina / io ; función pública main () devuelve error { // La sintaxis para los valores del objeto `json` es muy similar a la sintaxis de JSON json person = { name : "John Doe" , age : 25 }; // Los valores 'json' serializados se ajustan a la especificación JSON io : println ( person ); // Se puede acceder a los campos del valor `json` de la siguiente manera string name = check person . name ; int age = check person . age ; }
Los artefactos de Docker y Kubernetes necesarios para implementar el código en la nube se pueden generar al compilar el código. Los valores necesarios para estos artefactos se derivan del código. Además, también se pueden anular estos valores mediante el Cloud.toml
archivo. Para habilitar la generación de los artefactos en la nube, los usuarios pueden usar la cloud
opción de compilación en el Ballerina.toml
archivo. Úselo docker
para generar solo la imagen de Docker y el Dockerfile y k8s
también para generar artefactos de Kubernetes. Los archivos TOML de configuración de muestra mínimos se verían así:
Ballerina.toml
archivo:
[paquete] distribución = "2201.0.0" [opciones de compilación] nube = "k8s"
Cloud.toml
archivo:
[container.image] repositorio = "bal_user" nombre = "greet" etiqueta = "v0.1.0"
importar bailarina / http ; importar bailarina / lang . ' int ; importar bailarina / io ; // Los trabajadores interactúan entre sí enviando y recibiendo mensajes. // Ballerina valida cada interacción del trabajador (envío y recepción) // para evitar bloqueos. public function main () { @strand { thread : "any" } worker w1 { int w1val = checkpanic calculate ( "2*3" ); // Envía un mensaje asincrónicamente al trabajador `w2`. w1val -> w2 ; // Recibe un mensaje del trabajador `w2`. int w2val = <- w2 ; io : println ( "[w1] Mensaje de w2: " , w2val ); // Envía mensajes sincrónicamente al trabajador `w3`. El trabajador `w1` esperará // hasta que el trabajador `w3` reciba el mensaje. w1val ->> w3 ; w2val -> w3 ; // Limpia todos los mensajes enviados asincrónicamente al trabajador `w3`. El trabajador // se detendrá en este punto hasta que se envíen todos los mensajes o hasta que el trabajador `w3` // falle. checkpanic flush w3 ; } // Un trabajador puede tener un tipo de retorno explícito, o bien, si no se menciona un tipo de retorno, // es equivalente a devolver (). @strand { thread : "any" } worker w2 { int w2val = checkpanic calculate ( "17*5" ); // Recibe un mensaje del trabajador `w1`. int w1val = <- w1 ; io : println ( "[w2] Mensaje de w1: " , w1val ); // Envía un mensaje de forma asincrónica al trabajador `w1`. w1val + w2val -> w1 ; } trabajador w3 { int | error w1val = <- w1 ; int | error w2val = <- w1 ; io : println ( "[w3] Mensajes de w1: " , w1val , ", " , w2val ); } // Espera a que el trabajador `w1` termine. esperar w1 ; } función calcular ( cadena expr ) devuelve int | error { http : Cliente httpClient = check new ( "https://api.mathjs.org" ); cadena respuesta = check httpClient -> get ( cadena `/v4/?expr=${expr}` ); devolver check ' int : fromString ( respuesta ); }
[18]
{{cite journal}}
: Requiere citar revista |journal=
( ayuda )