Uploaded avatar of iHiD

Настав Mindshifting May!

@iHiD
Більше 3 років тому
Відео

Вступ

Привіт усім! Сподіваюся, у всіх усе добре.

Рік минає швидко, і ось уже Травень переосмислення, мабуть, місяць, на який я чекаю найбільше, головно тому, що в ньому є 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 мають чудову підтримку

Звісно, якщо є час, я радив би спробувати кілька! Усі вони досить унікальні. Розвʼяжіть ту саму вправу кількома з представлених мов і подивіться, наскільки різними будуть реалізації.

Translation missing: uk.number.nth.ordinalized May 2023 · Виявилося корисним?