Cloud-Native Development

Was Sie über Ballerina wissen sollten

13.03.2023
Von 
Martin Heller schreibt als freier Autor für die Schwesterpublikation InfoWorld.
Die Programmiersprache Ballerina wurde entwickelt, um mit Hilfe von API-Integration einfacher verteilte Microservices entwickeln zu können.
C-, C++-, C#- und Java-Entwickler werden sich schnell in Ballerina einfinden.
C-, C++-, C#- und Java-Entwickler werden sich schnell in Ballerina einfinden.
Foto: Ascannio - shutterstock.com

Ballerina wurde vom Open-Source-Technologieanbieter WSO2 entwickelt und wird auch weiterhin von dem Unternehmen gepflegt. Die Macher selbst bezeichnen Ballerina als "eine statisch typisierte, quelloffene, Cloud-Native-Programmiersprache". Wenn Sie sich nun fragen, was das genau sein soll: Im Fall von Ballerina handelt es sich um eine Sprache, die Netzwerke und gängige Internet-Datenstrukturen unterstützt und Schnittstellen zu einer großen Anzahl von Datenbanken und Internet-Services bietet.

Ballerina erleichtert die Integration von APIs und wurde darauf konzipiert, die Entwicklung verteilter Microservices zu simplifizieren - und zwar auf eine für C-, C++-, C#- und Java-Programmierer vertraute Art und Weise.

Die Programmiersprache Ballerina

Ballerina ist im Wesentlichen eine C-ähnliche, kompilierte Sprache, die folgende Features umfasst:

  • Funktionen für JSON-, XML- und Tabellendaten mit SQL-ähnlichen sprachintegrierten Abfragen,

  • Concurrency mit Sequenzdiagrammen und language-managed Threads,

  • mit dem Quellcode synchronisierte Live-Sequenzdiagramme,

  • flexible Types, sowohl innerhalb von Programmen als auch Service-Interfaces,

  • explizite Fehlerbehandlung und Concurrency Safety, sowie

  • integrierte Network Primitives.

Es gibt zwei Implementierungen von Ballerina:

  • Die derzeit verfügbare Version jBallerina bietet eine in Java implementierte Toolchain, kompiliert zu Java-Bytecode, läuft auf einer virtuellen Java-Maschine und interagiert mit Java-Programmen.

  • Eine neuere, unveröffentlichte (und unvollständige) Version ist nBallerina. Sie kompiliert zu nativen Binärdateien unter Verwendung von LLVM und bietet ein Foreign Function Interface für C.

Ballerina hat Schnittstellenmodule an Bord für:

  • PostgreSQL,

  • MySQL,

  • Microsoft SQL Server,

  • Redis,

  • DynamoDB,

  • Azure Cosmos DB,

  • MongoDB,

  • Snowflake,

  • Oracle Database und

  • JDBC-Datenbanken.

Für die Entwicklung bietet Ballerina:

  • ein Visual Studio Code-Plug-in für die Quellcode- und grafische Bearbeitung und das Debugging,

  • ein IntelliJ IDEA-Plug-in,

  • ein Befehlszeilen-Dienstprogramm mit mehreren nützlichen Funktionen,

  • eine webbasierte Sandbox und

  • eine REPL-Shell.

Ballerina kann mit OpenAPI, GraphQL-Schemas und gRPC-Schemas arbeiten. Es verfügt über eine Plattform namens Ballerina Central, um Module gemeinsam zu nutzen und eine große Beispiel-Bibliothek. Das Kommandozeilenprogramm bietet ein Build-System und einen Paketmanager sowie Code-Generatoren.

Schließlich bietet Ballerina gegen eine geringe Gebühr auch die Integration mit Choreo von WSO2 für Observability, CI/CD und DevOps. Ballerina selbst ist kostenlos und quelloffen.

Ballerina-Basics

Die Ballerina-Sprache kombiniert bekannte Elemente aus C-ähnlichen Sprachen mit einzigartigen Merkmalen. Beispielhaft hier ein "Hello World"-Programm mit Variablen:

import ballerina/io;

string greeting = "Hello";

public function main() {

string name = "Ballerina";

io:println(greeting, " ", name);

}

Sowohl int als auch float sind in Ballerina 64-Bit-Typen. Strings und Identifier sind Unicode, so dass sie in vielen Sprachen verwendet werden können. Erstgenannte sind zudem unveränderlich. Die Programmiersprache unterstützt sowohl Methoden als auch Funktionen, zum Beispiel:

// You can have Unicode identifiers.

function ?????????(string ????) {

// Use \u{H} to specify character using Unicode code point in hex.

io:println(???\u{E2D});

}

string s = "abc".substring(1, 2);

int n = s.length();

In Ballerina ist nil der Name für das, was normalerweise null genannt wird. Ein Fragezeichen nach dem Type macht es nullable, wie in C# - ein leeres Klammerpaar bedeutet nil.

int? v = ();

Arrays in Ballerina verwenden eckige Klammern:

int[] v = [1, 2, 3];

Ballerina-Maps sind assoziative Key-Value-Strukturen, ähnlich wie Python Dictionaries:

map<int> m = {

"x": 1,

"y": 2

};

Ballerina-Datensätze ähneln Structs in C:

record { int x; int y; } r = {

x: 1,

y: 2

};

Sie können benannte Types und Records in Ballerina definieren, ähnlich wie in C mit typedefs:

type MapArray map<string>[];

MapArray arr = [

{"x": "foo"},

{"y": "bar"}

];

type Coord record {

int x;

int y;

};

Mit Hilfe des Symbols | können Sie mehrere Types vereinigen:

type flexType string|int;

flexType a = 1;

flexType b = "Hello";

Ballerina unterstützt keine Exceptions, aber Errors. Das check-Keyword ist eine Kurzform für die Rückgabe, wenn der Type error ist:

function intFromBytes(byte[] bytes) returns int|error {

string|error ret = string:fromBytes(bytes);

if ret is error {

return ret;

} else {

return int:fromString(ret);

}

}

Im Folgenden dieselbe Funktion mit check anstelle von if ret is error { return ret:

function intFromBytes(byte[] bytes) returns int|error {

string str = check string:fromBytes(bytes);

return int:fromString(str);

}

Mit dem Schlüsselwort panic können Sie von der Norm abweichende Fehler als schwerwiegend einstufen. Sie können Rückgabewerte und Fehler mit dem Python-ähnlichen Unterstrich _ ignorieren.

Ballerina hat einen any-Type, Klassen und Objekte. Ein Objekt wird wie in Java mit dem Keyword new erstellt. enum-Types sind in Ballerina - anders als bei C - Abkürzungen für Unions von String-Konstanten. Das match-Statement verhält sich wie das switch case-Statement in C, nur flexibler.

Ballerina erlaubt Typinferenz bei einem var-Keyword. Funktionen in Ballerina sind Typen erster Klasse, so dass sie als funktionale Programmiersprache verwendet werden kann. Sie unterstützt zudem asynchrone Programmierung mit den Schlüsselwörtern start, future, wait und cancel - diese laufen in Strands (logische Threads).

Folgendes Beispiel von der Ballerina-Webseite zeigt das Code- und Sequence-Digramm eines Programms, das GitHub Issues von einem Repository zieht und jedes einzelne als neue Zeile zu einem Google Sheet hinzufügt:

Ballerina in Aktion.
Ballerina in Aktion.

Ballerina-Bibliotheken und -Extensions

Das Ballerina Central Repository hält mehr als tausend Pakete bereit. Dazu gehören:

  • die Ballerina-Standardbibliothek (ballerina/*),

  • von Ballerina geschriebene Erweiterungen (ballerinax/*) und

  • einige Demos und Erweiterungen von Drittanbietern.

Die Standardbibliothek ist hier dokumentiert. Bei den für Ballerina geschriebenen Erweiterungen handelt es sich in der Regel um Konnektoren zu Drittanbieter-Produkten wie Datenbanken, Observability-Systemen, Event-Streams und gängigen Web-APIs (etwa GitHub, Slack und Salesforce).

Jeder kann eine Organisation erstellen und ein Paket in Ballerina Central veröffentlichen - alle Pakete in diesem Repository sind öffentlich. Natürlich können Sie Ihren Code auf GitHub oder einem anderen Quellcode-Repository veröffentlichen und den Zugriff darauf kontrollieren.

Ballerina installieren

Sie können Ballerina installieren, indem Sie das entsprechende Paket für Ihr Windows-, Linux- oder macOS-System herunterladen und dann das Installationsprogramm ausführen. Es gibt zusätzliche Installationsoptionen, einschließlich der Erstellung aus dem Quellcode. Führen Sie dann bal version über die Befehlszeile aus, um die erfolgreiche Installation zu überprüfen.

Darüber hinaus sollten Sie das Ballerina-Plug-in für Ihren bevorzugten Editor installieren. In der Dokumentation wird Visual Studio Code empfohlen, aber Sie können auch IntelliJ IDEA verwenden.

Die korrekte Installation der Ballerina-Extension in Visual Studio Code können Sie überprüfen, indem Sie View -> Command Palette -> Ballerina aufrufen.

Die bal-Befehlszeile

Die bal-Kommandozeile ist ein Tool, um Ballerina-Quellcode zu managen. Außerdem können Sie damit problemlos Ballerina-Distributionen installieren, aktualisieren und zwischen ihnen hin- und her wechseln. Nachfolgender Screenshot zeigt einen Teil des Outputs von bal help. Weitere Informationen finden Sie in der Dokumentation.

Ein Blick auf die diversen Subkommandos, die über die Command Line von Ballerina zur Verfügung stehen.
Ein Blick auf die diversen Subkommandos, die über die Command Line von Ballerina zur Verfügung stehen.

Ballerina-Beispiele

Es gibt eine Menge von Ballerina-Beispielen, die Sie auf der Seite "Ballerina by Example" (und auch in VS Code) einsehen können. Das funktioniert über den Befehl Ballerina: Show Examples. Die Beispiele sind eine gute Ergänzung zu Tutorials und Dokumentation und unterstützen sowohl unstrukturierte als auch gezielte Suchen.

In den Examples finden Sie auch das Test-Framework Testarina, das in dem Modul ballerina/test definiert ist. Das test-Modul definiert die notwendigen Annotationen, um eine Testsuite zu erstellen, wie , und die Assertions, die man erwartet, wenn man mit JUnit, Rails-Unit-Tests oder ähnlichen Test-Frameworks vertraut ist - zum Beispiel test:assertEquals(). Das test-Modul definiert auch Wege, um Setup- und Teardown-Funktionen sowie Mock-Funktionen zu spezifizieren und Test-Abhängigkeiten zu etablieren.

Insgesamt ist Ballerina eine nützliche und funktionsreiche Programmiersprache für die Cloud-orientierte Programmierung. Sie erzeugt nicht die schnellsten Runtime-Module, aber dieses Problem wird sowohl durch experimentelle, native GraalVM-Images als auch durch das geplante nBallerina-Projekt, das zu nativem Code kompilieren wird, in Angriff genommen.

Aktuell könnte sich Ballerina in erster Linie für interne Projekte lohnen, die Internetdienste integrieren und weder schnell noch schön sein müssen. (fm)

Dieser Beitrag basiert auf einem Artikel unserer US-Schwesterpublikation Infoworld.