Ballerina

Ballerina
Парадигмаконкурентні обчислення Редагувати інформацію у Вікіданих
Дата появи2017[1] Редагувати інформацію у Вікіданих
ТворціСанджіва Віраварані, Джеймс Кларк, Саміра Джаясома, Хасіта Аравінда, Срінат Перера, Франк Лейманн і WSO2[2]
РозробникWSO2
Останній релізSwan Lake Update 10 (2201.10.2)
Система типізаціїСтруктурна, сувора, статична, виведена
Під впливом відJava, JavaScript, Мова програмування Go, Rust, C Sharp, C[3], Haskell[3], C++[3], Kotlin[3], Dart[3], TypeScript[3] і Swift[3] Редагувати інформацію у Вікіданих
Мова реалізаціїJava, Ballerina, TypeScript[4]
Операційна системаМультиплатформна
ЛіцензіяApache License 2.0[5]
Звичайні розширення файлів.bal Редагувати інформацію у Вікіданих
Репозиторій вихідного кодуgithub.com/ballerina-platform/ballerina-lang Редагувати інформацію у Вікіданих
Вебсайтballerina.io

Ballerina — це відкрита мова загального призначення для програмістів, розроблена компанією WSO2 для програмування в хмарну еру.[4]

Проєкт було започатковано у 2015 році архітекторами з WSO2 як кодову альтернативу до інструментів інтеграції на основі конфігурації, таких як EAI, ESB та продукти для керування робочими процесами.[6][7]

Мова має різні конструкції, орієнтовані на хмарну розробку, включаючи підтримку різних форматів даних і протоколів, надійність, розподілені транзакції, API та потоки подій.[8][9][10]

Історія

Ballerina була вперше офіційно анонсована у 2017 році, а версія 1.0 була випущена 10 вересня 2019 року.[11]

Дизайн

Ballerina — це мова загального призначення зі знайомим синтаксисом та прямим графічним представленням коду у вигляді діаграм послідовностей. Вона має фундаментальні абстракції, розроблені для полегшення програмування завдань інтеграції.[12] Ballerina була розроблена компанією WSO2 для підвищення продуктивності розробників додатків, які працюють з розподіленими обчисленнями. Вона проста у написанні та модифікації, і підходить для програмістів прикладних програм.[13][14][15]

Дизайнери, які понад 10 років розробляли продукти для інтеграції підприємств, використали свої знання індустрії при створенні мови,[16][17] зазначає директор WSO2 і засновник Ballerina Джеймс Кларк.

Приклади

Привіт, світ

Звичайна програма «Привіт, світ»:

import ballerina/io;

public function main() {
    io:println("Hello World!");
}

Щоб виконати цю програму, розмістіть вихідний код у файлі з розширенням .bal і надайте шлях до файлу команді bal run.

$ ballerina run hello_world.bal
Hello World!

Версія програми «Привіт, світ» для сервісу:

import ballerina/http;

service /greet on new http:Listener(9090) {
    resource function get . () returns string {
        return "Hello World!";
    }
}

Сервіси виконуються аналогічним чином, за винятком того, що вони не завершуються, як звичайні програми. Після запуску сервісу можна використовувати HTTP-клієнт для його виклику. Наприклад, наведений вище сервіс можна викликати за допомогою наступної команди cURL:

$ curl http://localhost:9090/greet 
Hello World!

[18]

REST API

import ballerina/http;

service on new http:Listener(9090) {
    resource function post factorial(@http:Payload string payload) returns http:Ok|http:BadRequest {
        int|error num = int:fromString(payload);

        if num is error {
            return <http:BadRequest>{body: "Недійсне ціле число: " + payload};
        }

        if num < 0 {
            return <http:BadRequest>{body: "Ціле число повинно бути >= 0"};
        }

        int result = 1;

        foreach int i in 2 ... num {
            result *= i;
        }

        return <http:Ok>{body: result};
    }
}
$ curl http://localhost:9090/factorial -d 5
120

GraphQL API

import ballerina/graphql;

service /stocks on new graphql:Listener(4000) {
    resource function get quote() returns StockQuote {
        return {
            ticker: "EXPO",
            price: 287.5,
            open: 285,
            prevClose: 285.5,
            low: 276.25,
            high: 297
        };
    }
}

type StockQuote record {|
    string ticker;
    float price;
    float open;
    float prevClose;
    float low;
    float high;
|};
$ curl -H "Content-type: application/json" -d '{"query": "{ quote { ticker, price } }" }' 'http://localhost:4000/stocks' 
{"data":{"quote":{"ticker":"EXPO", "price":287.5}}}

Діаграма послідовностей

Згенерована діаграма послідовності є канонічним поданням вихідного коду. Обидва подання можна використовувати взаємозамінно. Підтримка діаграм забезпечується через плагін Ballerina для VS Code. Ось кілька прикладів таких згенерованих діаграм послідовностей, порівняних з відповідним кодом.

Приклад програми для отримання та обробки даних COVID-19:

Приклад програми для створення звіту з даних про запити на злиття, отриманих з GitHub:

Підтримка JSON

Мова надає підтримку для роботи зі значеннями JSON. Вбудований тип `json` визначено як наступне об'єднання: ()|boolean|int|float|decimal|string|json[]|map<json>

import ballerina/io;

public function main() returns error {
    // Синтаксис для значень об'єкта `json` дуже схожий на синтаксис JSON
    json person = {name: "John Doe", age: 25};

    // Серіалізовані значення `json` відповідають специфікації JSON
    io:println(person);

    // Поля значення `json` можна отримати наступним чином
    string name = check person.name;
    int age = check person.age;
}

Код у хмару

Docker і Kubernetes артефакти, необхідні для розгортання коду у хмарі, можуть бути згенеровані під час збірки коду. Значення, необхідні для цих артефактів, отримуються з коду. Крім того, можна перевизначити ці значення, використовуючи файл Cloud.toml. Щоб увімкнути генерацію хмарних артефактів, користувачі можуть використовувати параметр cloud у файлі Ballerina.toml. Використовуйте docker для генерації лише Docker-образу та Dockerfile, і використовуйте k8s для генерації артефактів Kubernetes також. Мінімальний приклад конфігураційних файлів TOML виглядатиме приблизно так: Файл Ballerina.toml:

[package]
distribution = "2201.0.0"

[build-options]
cloud="k8s"

Файл Cloud.toml:

[container.image]
repository="bal_user"
name="greet"
tag="v0.1.0"

Робітники

import ballerina/http;
import ballerina/lang.'int;
import ballerina/io;

// Робітники взаємодіють один з одним, надсилаючи та отримуючи повідомлення.
// Ballerina перевіряє кожну взаємодію між робітниками (надсилання та отримання)
// щоб уникнути взаємних блокувань.
public function main() {
    @strand {thread: "any"}
    worker w1 {
        int w1val = checkpanic calculate("2*3");
        // Асинхронно надсилає повідомлення робітнику `w2`.
        w1val -> w2;
        // Отримує повідомлення від робітника `w2`.
        int w2val = <- w2;
        io:println("[w1] Повідомлення від w2: ", w2val);
        // Синхронно надсилає повідомлення робітнику `w3`. Робітник `w1` буде чекати
        // поки робітник `w3` отримає повідомлення.
        w1val ->> w3;
        w2val -> w3;
        // Скидає всі повідомлення, надіслані асинхронно до робітника `w3`. Робітник
        // зупиниться на цьому етапі, поки всі повідомлення не будуть надіслані або
        // поки робітник `w3` не вийде з ладу.
        checkpanic flush w3;
    }

    // Робітник може мати явний тип повернення, або, якщо тип повернення не зазначений,
    // він еквівалентний поверненню ().
    @strand {thread: "any"}
    worker w2 {
        int w2val = checkpanic calculate("17*5");
        // Отримує повідомлення від робітника `w1`.
        int w1val = <- w1;
        io:println("[w2] Повідомлення від w1: ", w1val);
        // Асинхронно надсилає повідомлення робітнику `w1`.
        w1val + w2val -> w1;
    }

    worker w3 {
        int|error w1val = <- w1;
        int|error w2val = <- w1;
        io:println("[w3] Повідомлення від w1: ", w1val, ", ", w2val);
    }

    // Чекає на завершення роботи робітника `w1`.
    wait w1;
}

function calculate(string expr) returns int|error {
    http:Client httpClient = check new ("https://api.mathjs.org");
    string response = check httpClient->get(string `/v4/?expr=${expr}`);
    return check 'int:fromString(response);
}

[19]

Примітки

  1. ↑ https://blog.ballerina.io/posts/introduction-to-ballerina-0.970/
  2. ↑ Ballerina Language Specification. WSO2. Архів оригіналу за 11 серпня 2020. Процитовано 24 квітня 2020.
  3. ↑ а б в г д е ж https://opensource.ellak.gr/wp-content/uploads/sites/5/2018/06/2018-06-Ballerina-GFOSS.pdf
  4. ↑ а б ((Open Source Contributors)) (18 червня 2019). Ballerina source code. GitHub.
  5. ↑ WSO2 / LICENSE. github.com. WSO2. 8 березня 2017. Процитовано 1 березня 2018.
  6. ↑ Ballerina Microservices Programming Language: Introducing the Latest Release and "Ballerina Central". InfoQ. Процитовано 7 червня 2018.
  7. ↑ Earls, Alan (1 березня 2019). How does Ballerina stack up as a cloud-native programming language?. Процитовано 23 липня 2019.
  8. ↑ Doyle, Kerry. 10 of the best programming languages to learn in 2020 (брит.). Процитовано 16 вересня 2020.
  9. ↑ Posta, Christian. Evolution of Integration and Microservices with Service Mesh and Ballerina. YouTube (брит.). Процитовано 24 липня 2019.
  10. ↑ Techworld staff. Top programming languages you should try. Techworld (брит.). Архів оригіналу за 7 червня 2018. Процитовано 7 червня 2018.
  11. ↑ Ballerina Reinvents Cloud-Native Middleware as a Programming Language. GlobeNewswire (Пресреліз). 10 вересня 2019. Процитовано 16 вересня 2020.
  12. ↑ Ratnayake, Dakshitha. Ballerina Swan Lake: 10 Compelling Language Characteristics for Cloud Native Programming. InfoQ. Процитовано 1 березня 2022.
  13. ↑ Jackson, Joab. Ballerina: An API-First Programming Language. The New Stack (амер.). Процитовано 11 червня 2018.
  14. ↑ Foremski, Tom (1 березня 2019). Technology and the Arts: Celebrating Ballerina, a computer language of integration. Процитовано 14 липня 2019.
  15. ↑ Lawton, George (1 листопада 2018). Ballerina language promises to improve app integration. Процитовано 23 липня 2019.
  16. ↑ Clark, James. Ballerina Programming Language Part 0 - Context (брит.). Процитовано 16 вересня 2020.
  17. ↑ Clark, James. Ballerina Programming Language Part 1 - Concepts (брит.). Процитовано 16 вересня 2020.
  18. ↑ Ballerina Team (16 вересня 2020). Hello world service. ballerina.io. Архів оригіналу за 16 вересня 2020. Процитовано 16 вересня 2020. [Архівовано 2020-09-16 у Wayback Machine.]
  19. ↑ Ballerina Team (16 вересня 2020). Взаємодія робітників. ballerina.io.

Додаткове читання

Посилання