Вступ
Привіт усім! Сподіваюся, у всіх усе добре.
Рік минає швидко, і ось уже Травень переосмислення, мабуть, місяць, на який я чекаю найбільше, головно тому, що в ньому є Prolog!
Сподіваюся, Аналітичний квітень усім сподобався. Участь узяла сила-силенна людей, і, гадаю, це був один із найуспішніших місяців за весь час. У квітні я також поговорив із Simon Peyton Jones у межах пізнього інтервʼю до Функціонального лютого. Це було справді чудово, і я однозначно раджу переглянути запис, хоча б заради прекрасної фрази: «Коли вапняк імперативного програмування вивітриться, під ним оголиться граніт функціонального програмування».
Але досить, переходимо до Травня переосмислення! Як завжди, ми з Erik коротко розповімо, у чому суть цих місяців і які різні мови будемо досліджувати.
Отже, цього місяця в нас аж шість мов: Ballerina, Pharo, Prolog, Red, Tcl (Tickle) і Unison. Кожна з цих мов досить сильно відрізняється від «мейнстримніших» мов, тож радимо спробувати більше ніж одну, щоб відчути цю різницю. Я однозначно раджу Prolog, бо це одна з мов, якою мені найбільше подобалось програмувати в житті. Erik також дуже захоплений Unison, тож це ще одна мова, яку варто спробувати.
Бейджі
Щоб отримати бейдж «Травень переосмислення», треба виконати будь-які пʼять вправ однією з цих мов протягом травня.
Є також річний бейдж 12in23. Щоб його отримати, треба розвʼязати пʼять наших представлених вправ цією мовою. Якщо читати це після травня, цю частину можна виконати будь-коли протягом року, тож нічого не втрачено. Обрати ці вправи було складно, бо всі мови такі різні, тож ми взяли загальніші вправи, які цікаво розвʼязувати й до яких цікаво шукати різні підходи.
- Акронім: перетворити фразу на її акронім
- Ізограма: перевірити, чи містить фраза повторювані літери
- Римські цифри: перекласти десяткове число в римські цифри
- Краплі дощу: перетворити число на звуки крапель дощу
- Космічна ера: обчислити, скільки років було б людині на планетах нашої Сонячної системи
Ці вправи та вправи за попередні місяці можна знайти на сторінці #12in23.
Огляди
Поріньмо й дослідімо ці мови, розглянувши кожну окремо.
Prolog:
- Інший спосіб мислення. Програма визначається як набір відношень. Далі ми «запитуємо» базу відношень, щоб знайти відповіді за допомогою уніфікації (зіставлення зі зразком). Ідеально для систем, заснованих на правилах
- Мало синтаксису: лише один тип даних (терми) і один структурний елемент мови (речення). Речення повністю будуються з термів і можуть визначати факти або правила
- Дуже декларативна. Менше турбот про те, як обчислюються речі, і більше про те, що має бути обчислено. У багатьох випадках це означає менше коду
- Створена, щоб добре працювати із запитами до великих просторів пошуку. Різні стратегії пошуку (у глибину, у ширину), підтримка автоматичного відсікання
Unison
- У коді Unison не буває конфліктів версій! Функція Unison знає хеші своїх залежностей, тож може знайти потрібну версію коду
- Unison підтримує живе переглядання коду в локальному інтерфейсі розробки та в розміщених репозиторіях, тож завжди можна перейти за посиланням і побачити вихідний код бібліотек, від яких ми залежимо
- Abilities - це спосіб керувати «ефектами» (наприклад, IO) цілком функціонально
Pharo
- Дуже мало синтаксису, увесь синтаксис уміщується на листівці (лише 6 зарезервованих слів!). Синтаксис повідомлень нагадує природні мови: підмет, дієслово й додатки (between: 1 and: 2 +). Семантика теж проста (наприклад, надзвичайно прості правила пріоритету). Це робить мову легшою для вивчення й читання
- Продуктивність висока, щойно подолано початкову криву навчання. Причин кілька: проста семантика й малий синтаксис, а також деякі визначні можливості Pharo, про які йтиметься далі
- Працює на більшості платформ (Windows, macOS, Linux + підтримка ARM) на швидкій віртуальній машині (OpenSmalltalk)
- Це не просто реалізація Smalltalk, вона досі активно розвивається (найновіша версія SmallTalk - SmallTalk 80 з 1980 року)
- Дружня спільнота
Tcl (вимовляється «tickle»)
- Дуже мало синтаксису: лише 12 правил, і все вміщується на аркуші паперу. Семантика теж відносно проста. Це робить програми легкими для читання й вивчення
- Проста конкурентність через корутини, що дає змогу писати асинхронний код як синхронний
- Вбудований цикл подій для мережевого програмування й асинхронного файлового введення-виведення
- Зріла, але досі розвивається
Ballerina
- Повноцінна підтримка типобезпечної декларативної обробки JSON, XML і табличних даних із запитами, інтегрованими в мову
- Гнучкі типи з переважанням структурної типізації (duck typing). Закриті типи - це спосіб робити підтипізацію, а відкриті типи витончено обробляють надлишок надісланих даних. Вбудоване звʼязування даних і валідація під час використання в HTTP-ресурсах
- Вбудована підтримка поширених шаблонів інтеграції та конекторів, зокрема розподілених транзакцій, компенсації та розривачів ланцюгів
- Кожна програма Ballerina автоматично стає спостережуваною для будь-якого інструменту Open Telemetry, що дає повний контроль і прозорість щодо поведінки та продуктивності коду
- Чудова конкурентність через strands, які є легкими потоками. Неблокуючі виклики IO прості. Компілятор допомагає перевіряти надсилання й отримання викликів між воркерами, уникаючи взаємних блокувань. Незмінність також добре підходить для мережевої роботи
- Явна обробка помилок через обʼєднані типи та синтаксичний цукор
check, який у цьому допомагає
Red
- Легковаговий. Увесь інструментарій - це близько 1,5 МБ для завантаження, один виконуваний файл.
- Портативний. Проста кроскомпіляція. Створює невеликі бінарні файли без залежностей. Малий обсяг використовуваної памʼяті.
- Red - це власна метамова й власний формат даних (як у LISP). Програми можуть перетворювати й читати код.
- Реактивний: обʼєкти можна звʼязувати, щоб зменшити розмір і складність програми (згадаймо таблиці Excel)
Де використовують ці мови?
Prolog:
- Штучний інтелект (Watson від IBM)
- Обробка (природної) мови
- Розподілена база даних для баз знань (TerminusDB)
- Навіть використовується для опису правил типів віртуальної машини Java
Unison
- Використовується для написання розподілених систем
- Загальні вебсервіси
- Пакетні обчислювальні завдання
Pharo
- Використовується для інтерактивних інструментів
- Використовується в дуже різних галузях: онлайн-платформа торгівлі та хмарний інструмент управління інвестиціями
- Прототипування користувацьких інтерфейсів і взаємодії в оборонній промисловості
- Вебзастосунок для планування подій
- Гнучке середовище розробки для дослідження API, даних і систем
Tcl
- Використовується як сполучний код або вбудовується
- Використовується в графічних інтерфейсах маршрутизаторів CISCO
- Різні виробничі системи
- NASA використовувала його не раз
- Серед інших великих компаній - Pixar, Boeing, Intel, NBC та багато інших.
- Tk, набір інструментів для вікон, перейняли інші «скриптові» мови, як-от perl/python/ruby.
- Expect - інструмент для автоматизації інтерактивних CLI-застосунків
Ballerina
- Використовується для хмарних застосунків
- Використовується в MOSIP - базовій платформі ідентифікації, яка допомагає урядам та іншим організаціям упроваджувати цифрові й базові системи ідентифікації економічно вигідно.
Чим ці мови цікаві з погляду програмування?
Prolog:
- Мова логічного програмування (одна з перших) - це окрема парадигма (як ООП і функціональне програмування)
- Динамічно типізована
Unison
- Чисто функціональна мова
- Статично типізована
Pharo
- Обʼєктно-орієнтована мова, але в сенсі Smalltalk. Відрізняється від «звичайних» обʼєктно-орієнтованих мов: немає конструкторів, немає оголошення типів, немає інтерфейсів, немає примітивних типів.
- Динамічно типізована
Tcl
- Мультипарадигмова: підтримуються обʼєктно-орієнтований, імперативний і функціональний стилі
- Динамічно типізована
Ballerina
- Мультипарадигмова: обʼєктно-орієнтована, функціональна й декларативна
- Статично типізована
Red
- Мультипарадигмова: імперативна, функціональна, обʼєктно-орієнтована, символьна, реактивна
- Статично типізована
Які в них визначні можливості?
Prolog:
- Гнучка. Багато вбудованих предикатів працюють у кількох напрямках. Дає змогу запитувати й створювати дані з однаковим синтаксисом. Деякі задачі, складні в інших мовах, тут тривіальні
- DCG - це як вбудований комбінатор парсерів, чудовий для розбору, генерації, доповнення й перевірки послідовностей
- CLP - ефективний спосіб описати програму через обмеження
Unison
- Код - це не текст, а (незмінні) дані. Код зберігається в базі даних, а доступ і оновлення відбуваються через Unison Codebase Manager. Текстові файли - лише один зі способів додати код у базу даних. Незмінні дані також означають, що результати тестів можна кешувати, а перевірку типів достатньо виконати лише раз
- Означення посилаються за хешем, а не за назвою. Це називається кодом, «адресованим за вмістом». Синтаксичне дерево означення визначає його хеш. Жодних конфліктів версій, перейменування тривіальні.
- Документація Unison - повноцінна сутність мови й завжди синхронізована з функціями, які описує. У неї можна вбудовувати живі приклади й гарантувати, що код прикладів компілюється.
- Ідеальна для хмарних обчислень: немає збірок, функції можна розповсюджувати на льоту, і менше часу витрачається на написання кодувальників і декодувальників для взаємодії між сервісами Unison.
Pharo
- Проста модель виконання: усе є обʼєктом, і виконання відбувається виключно через повідомлення (які теж є обʼєктами). Навіть потік керування реалізовано через повідомлення. Хоча модель проста, вона дуже потужна. Досить відрізняється від інших обʼєктно-орієнтованих мов.
- Код живе в образі Pharo, а не в текстових файлах. Образ Pharo містить увесь стан застосунку й може виконуватися у віртуальній машині Pharo. Коли ми зберігаємо роботу, Pharo зберігає весь стан середовища як файл образу. Цей файл містить усі обʼєкти, їхні звʼязки та контекст виконання. Файли образів можна передавати іншим і завантажувати на різних машинах чи платформах. Це дає розробникам змогу легко співпрацювати над проєктом або розповсюджувати застосунки, створені в Pharo
- Живе й захопливе середовище, миттєвий зворотний звʼязок під час виконання через власне середовище розробки (IDE) Pharo. Запускаймо й змінюймо програму на льоту, навіть під час її роботи! Потужний налагоджувач, який підтримує перезапуск методів і виправлення помилок на льоту
Tcl
- Проста система типів: усе є рядком тексту (англ. string). «Усе є рядком» - так Tcl була реалізована раніше. Тепер під капотом потужна система типів, де сутність Tcl (рядок тексту, число з плаваючою комою, список чи словник) має як типізоване представлення, так і рядкове. Це значно покращує продуктивність коду Tcl, бо йому більше не треба раз у раз перетворювати туди й назад із рядків тексту.
- «Усе виконується як команди». Вбудованих команд немає. Tcl постачається зі «стандартною бібліотекою» команд, зокрема if і while тощо. Дуже просто додавати нові команди потоку керування, наприклад цикл until. Так само легко перевизначити команду Tcl.
- Завдяки компактності, простій семантиці та реалізації у вигляді бібліотеки C, її легко вбудовувати
Ballerina
- Хмарна орієнтованість. Вбудовані перетворення з JSON у користувацькі типи. Надзвичайно легкий синтаксис для створення (мікро)сервісів. Вбудоване конкурентне виконання сервісів. Підтримка HTTP (1 і 2), graphql і gRPC «з коробки»
- Автоматично генерує артефакти для розгортання коду в різних хмарах. Цими артефактами можуть бути Dockerfile, образи Docker, YAML-файли Kubernetes або безсерверні функції.
- Вбудована візуалізація коду у вигляді діаграм послідовності. Чудово для візуалізації потоку коду. Може навіть візуалізувати виклики HTTP
Red
- Чудово підходить для створення й розбору предметно-орієнтованих мов, або «діалектів» (термінологія Rebol). Кілька вбудованих діалектів:
- Red/System: системна мова програмування рівня C, що компілюється в машинний код
- Parse: потужний PEG-парсер
- VID: простий діалект для створення компонування графічного інтерфейсу (GUI)
- Draw: діалект двовимірного векторного малювання
- Rich-text: діалект опису розширеного тексту
- Прості графічні інтерфейси. Цілком кросплатформні й нативні. Підтримує двостороннє звʼязування, оновлення в реальному часі, події та дає доступ до можливостей ОС
Яку (які) варто спробувати в травні?
Усі вони цікаві самі по собі, тож можна навести аргументи за будь-яку з них.
- Якщо цікавлять хмарні обчислення, Ballerina і Unison - чудові варіанти. Tcl теж має чудові можливості конкурентності
- Якщо обʼєктно-орієнтоване програмування вже знайоме, але хочеться побачити інший підхід, спробуйте Pharo
- Якщо хочеться відчути, як це - програмувати мовою, яка не спирається на текстові файли, спробуйте або Pharo з його унікальним і потужним середовищем розробки, або Unison із Unison Codebase Manager
- Якщо подобається мінімалізм, у Tcl, Prolog, Pharo і Red досить мало синтаксису й відносно проста семантика
- Якщо хочеться побачити цікаве поєднання парадигм, Ballerina, Tcl і Red підтримують різні парадигми
- Якщо хочеться спробувати незвичніші парадигми, спробуйте Prolog для логічного програмування, Red для реактивного програмування та Ballerina для декларативного програмування
- Якщо подобається функціональне програмування, зверніть увагу на Unison, зокрема на його Abilities
- Якщо цікавить метапрограмування, Tcl, Prolog, Pharo і Red мають чудову підтримку
Звісно, якщо є час, я радив би спробувати кілька! Усі вони досить унікальні. Розвʼяжіть ту саму вправу кількома з представлених мов і подивіться, наскільки різними будуть реалізації.