Ballerina

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

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

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

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

Історія

[ред. | ред. код]

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

Дизайн

[ред. | ред. код]

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

Дизайнери, які понад 10 років розробляли продукти для інтеграції підприємств, використали свої знання індустрії при створенні мови,[17][18] зазначає директор 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!

[19]

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);
}

[20]

Примітки

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

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

[ред. | ред. код]

Посилання

[ред. | ред. код]