Вступ
Привіт усім! Сподіваюся, що в усіх усе гаразд.
У нас був насичений серпень в Exercism. Ми обʼєднали Premium та Insiders, додали автоматичний зворотний звʼязок безпосередньо в редактор, запустили Track Trophies і зробили безліч дрібних покращень на сайті! Якщо хтось ще не перевірив свої треки, щоб побачити, які трофеї отримає, то неодмінно варто це зробити. Ми надіслали лист усім, хто отримав один або більше трофеїв, тож варто стежити за поштою. Упродовж серпня ми також добре повеселилися в #12in23, досліджуючи мови, які зазвичай використовують для створення застосунків.
Цього місяця в нас Лаконічний вересень, у якому ми досліджуємо мови, синтаксис яких зазвичай дуже стислий і лаконічний. Зокрема, розглянемо 8th (нащадок Forth), AWK, Bash, jq, Perl і Raku (який раніше називався Perl 6).
Значки
Щоб отримати значок Лаконічного вересня, потрібно виконати будь-які пʼять вправ однією з цих мов упродовж вересня.
Є також річний значок 12in23. Щоб отримати його, потрібно розвʼязати пʼять наших представлених вправ цією мовою.
- Гігасекунда: робота з датами
- Шифр Атбаш: робота з рядками тексту (англ. string)
- Дартс: робота з числами та умовними конструкціями
- Luhn: робота з рядками тексту, умовними конструкціями та числами
- Ряди: робота з рядками тексту та послідовностями
Ці вправи, як і вправи за попередні місяці, можна знайти на сторінці #12in23.
Огляди
Тож розгляньмо кожну з цих мов в огляді.
8th
- Розробив Рон Аарон.
- Назва обігрує мову Forth, яка стала для неї головним джерелом натхнення. Утім, є чимало відмінностей від Forth:
- Суворо типізована
- Кросплатформна
- Покращена безпека (немає прямого доступу до памʼяті чи вбудованого асемблера)
- Пропонує і безкоштовну, і комерційну версію, причому в комерційній більше можливостей.
- Із закритим кодом, але після придбання корпоративної ліцензії код можна переглянути
AWK
- AWK створили в Bell Labs у 1970-х Альфред Аго, Пітер Вайнбергер і Браян Керніган. Назва походить від перших літер прізвищ її авторів.
- Це спеціалізована мова, призначена для обробки тексту, але її можна використовувати й для інших цілей
- AWK працює як Unix-фільтр, подібно до sed і grep, і призначений для використання в конвеєрі
- Специфікація Single UNIX Specification і Linux Standard Base вимагають його включення в будь-яку реалізацію, тому він доступний на більшості *nix-машин
- Різні реалізації мови AWK:
- awk (або oawk для оригінального AWK): оригінальна реалізація
- GNU AWK (gawk), випущений 1988 року, суттєво переглянув і розширив мову
- BWK AWK (він же nawk), випущений наприкінці 90-х
- mawk: швидка реалізація з інтерпретацією байткоду
- У багатьох *nix-системах команда
awkвказує наgawkабоnawk
Bash
- Bash — це Unix-оболонка, яку розробив Браян Фокс і яка вийшла 1989 року.
- Створена як вільна заміна оболонки Bourne і стала типовою оболонкою входу для більшості дистрибутивів Linux. Вона є надмножиною синтаксису команд оболонки Bourne, що полегшує перехід
- Розширює оболонку Bourne у багатьох аспектах: розгортання фігурних дужок, автодоповнення командного рядка, обробка сигналів та інше
jq
- Розробив Стівен Долан, випущено 2012 року
- Створена, щоб легко робити запити, перетворювати й обробляти документи JSON («sed для JSON»)
- Інструмент
jq(що реалізує цю мову) спочатку було реалізовано на Haskell, але згодом перенесено на C. Є також порти на Go та Rust
Perl
- Perl розробив Ларрі Волл наприкінці 1980-х, а вперше випущено 1987 року.
- Створена як мова сценаріїв загального призначення, щоб полегшити обробку звітів
- Дуже впливова, особливо завдяки підтримці регулярних виразів (до цього ще повернемося)
Raku
- Розробив Ларрі Волл (творець Perl), випущено 2015 року
- Спочатку відома як Perl 6, вона мала впорядкувати мову й прибрати деякі можливості, які вважалися малокорисними чи заплутаними (цікава цитата: «У Perl 6 ми вирішили, що краще виправити мову, ніж виправляти користувача», Ларрі Волл). Зрештою Perl 6 виявилася не сумісною на рівні коду з Perl 5, тож її перейменували на Raku
- Філософія дизайну зосереджена на тому, щоб програмування було приємним і продуктивним, водночас надаючи широкий набір інструментів для різноманітних програмних завдань (загального призначення)
- Оскільки Raku є специфікацією, може існувати (і існує) кілька реалізацій. З-поміж них лише Rakudo активно розробляють, але є й старші реалізації, як-от Pugs (написана на Haskell), v6-KindaPerl6 і Niecza (орієнтована на CLR)
Де використовуються ці мови?
8th
- На жаль, нам не вдалося знайти, де її використовують
AWK
- Використовують для вилучення й подання даних та загалом для написання сценаріїв
Bash
- Насамперед використовують для системного адміністрування, а також для створення утиліт CLI чи обгорток навколо інших інструментів. Ми масово використовували її для роботи з репозиторіями Exercism
jq
- Використовують для запитів, перетворення й обробки документів JSON, часто у вигляді сценаріїв оболонки
Perl
- Використовують для роботи з даними, розбору файлів, вебпрограмування та завдань системного адміністрування. Вона набула популярності на зорі вебу завдяки своїм можливостям роботи з рядками тексту та великій екосистемі модулів.
Raku
- Використовують для обробки тексту, системного адміністрування та багато чого іншого
Що робить ці мови цікавими з погляду програмування?
Більшість цих мов динамічно типізовані й інтерпретовані, що добре пасує до їхньої сценарійної природи. Утім, є й винятки, особливо в підтримуваних парадигмах.
8th
- Суворо типізована
- Багатопарадигмова: процедурна, але що цікавіше, стекова (зі стековою моделлю виконання), рефлексивна (здатна досліджувати й змінювати власну структуру та поведінку) і конкатенативна (усі вирази є функціями, а розміщення функцій поряд означає композицію функцій)
- Компілюється в нативний код, але також може інтерпретуватися в REPL
AWK
- Динамічно типізована й часто інтерпретована (залежить від використовуваної реалізації)
- Основна парадигма — керована даними: програму описують як інструкції, що визначають дані для зіставлення та потрібну обробку, замість явного визначення послідовності кроків. AWK також підтримує процедурне програмування
Bash
- Динамічна й інтерпретована мова
- Підтримує імперативне та процедурне програмування
jq
- Динамічна й інтерпретована мова
- Чисто функціональна мова (усі значення незмінні) з наголосом на «конвеєрах». Дуже в дусі Unix
Perl
- Динамічно типізована й інтерпретована
- Багатопарадигмова: підтримує функціональне, обʼєктно-орієнтоване та імперативне програмування
Raku
- Динамічно типізована, але підтримує поступову типізацію, коли статичну типізацію можна додати за потреби (Perl динамічна)
- Багатопарадигмова мова: імперативна, процедурна, обʼєктно-орієнтована та функціональна
Чим ці мови чудові?
8th
- Мінімум синтаксису робить мову легшою для вивчення й розуміння. Дані (як-от обʼєкти й масиви) описують через JSON. Також підтримуються інші контейнери: стеки, черги й купи
- Немає зарезервованих ключових слів. Підпрограми називають «словами», і нові слова легко визначити. Будь-яке слово можна перевизначити під час виконання, вбудоване чи створене користувачем
- Кросплатформність. Легко згенерувати виконуваний файл для будь-якої підтримуваної платформи
- Безпека. Вбудовані засоби безпеки запобігають багатьом помилкам (немає прямого доступу до памʼяті, середовище виконання не компонується з динамічними бібліотеками)
AWK
- Простий синтаксис із дуже послідовною структурою коду AWK, що робить код AWK легким для вивчення й читання. Його структури даних теж прості й гнучкі
- Дуже виразна: багато чого можна зробити дуже малим обсягом коду. Ідеальна для однорядкових програм
- Встановлена на більшості *nix-машин, тож навички AWK стануть у пригоді в багатьох місцях (разом із /bin/sh це єдина мова сценаріїв у стандартному Unix)
- Дуже добре працює в конвеєрах і сценаріях оболонки, де AWK обробляє вихідні дані інших інструментів або навпаки
Bash
- Можна використовувати на більшості платформ. Вона встановлена майже на всіх *nix-машинах, зокрема macOS. Завдяки підсистемі Windows Subsystem for Linux (WSL) bash тепер доступна й у Windows.
- Використовують як RE(P)L, де запускають окремі команди або читають і виконують код із файлів (відомих як сценарії оболонки). Якщо ми колись користувалися терміналом Linux, то, найімовірніше, писали код bash, адже термінал зазвичай працює як RE(P)L для bash
- Bash і сценарії оболонки широко використовують для системного адміністрування, DevOps і керування компʼютерами.
- Надзвичайно універсальна й гнучка
- Потужні можливості роботи з рядками тексту, зокрема дуже проста інтерполяція рядків тексту
jq
- Простий і короткий синтаксис для роботи з JSON, що робить її легкою для вивчення
- Дозволяє визначати власні функції для складніших операцій.
- Підтримує оптимізацію хвостової рекурсії, що чудово підходить для рекурсивної обробки даних
- Інструмент jq поширюють як один двійковий файл розміром лише близько 30 КБ
- Інструмент
yqобгортаєjq, дозволяючи використовувати той самий синтаксис для роботи з файлами XML, TOML і YAML (під капотом він перетворює ці типи даних на JSON) - І реалізація на C, і реалізація на Go підтримують вбудовування в інші застосунки
Perl
- Працює на більшості платформ. Чудово підходить для написання кросплатформних сценаріїв
- Гнучкість - наріжний камінь філософії дизайну Perl. Її відоме гасло: «Є більш ніж один спосіб це зробити» (TMTOWTDI). Залежно від завдання можна застосовувати різні підходи
- Сильна спільнота й спадок впливових проєктів. Багато сценаріїв, інструментів і застосунків створено на Perl. Колись її називали «клейкою стрічкою, що тримає інтернет купи»
- Багата екосистема модулів і бібліотек, доступна через Comprehensive Perl Archive Network (CPAN)
Raku
- Велика, складна й потужна, але водночас задумана як мова, яку не обовʼязково вивчати всю одразу. З неї легко почати, а до потужніших можливостей можна звернутися пізніше
- Потужна й розширювана система типів, що включає поступову типізацію. Це означає, що можна вказати бажаний рівень перевірки типів, досягаючи балансу між динамічною та статичною типізацією
- Підтримує множинну диспетчеризацію, яка дозволяє використовувати поліморфізм без успадкування
- Unicode у Raku є повноправним громадянином. Вона надає нативну підтримку різних кодувань символів
- Надає розвинені засоби конкурентності й паралелізму. Вона має вбудовану підтримку асинхронного програмування, реактивного програмування та паралельного виконання
Які в них особливі риси?
8th
- Вимагає іншого способу мислення. Її унікальне поєднання парадигм дуже відрізняється від інших мов і спонукає шукати нові підходи до розвʼязання задач
- Стекова й зворотна польська нотація (RPN) дають дуже просту ментальну модель виконання програми. Значення кладуть на стек, і більшість слів визначено через їхній вплив на стек
AWK
- Парадигма, керована даними, дуже потужна. Вона вимагає іншого способу мислення: програми визначають як набір пар «умова/дія», текст розбивають на записи (зазвичай один рядок на запис), а кожен запис — на поля (наприклад, поля CSV або одне слово на поле). Коли ми до цього звикнемо, то оцінимо елегантність і виразність такого підходу й почнемо бачити його застосування всюди
- Ідеальна для роботи з текстом. Чи то розбір тексту, його перетворення чи звітування, AWK дасть раду. Для таких завдань, як вивести оболонку кожного користувача в системі чи підсумувати стовпець CSV, ми здивуємося, як мало коду потрібно
Bash
- Ідеальна для автоматизації. Сценарії оболонки чудово підходять для автоматизації повторюваних завдань.
- Сценарії bash використовують конвеєри й дозволяють легко поєднувати інші програми. Створити сценарій, який передає вихідні дані однієї команди в іншу, або сценарій, що переривається, щойно якась із виконаних команд зазнає невдачі, дуже просто.
- Потужність. Легкість, з якою можна використовувати інші інструменти, робить bash неймовірно потужним інструментом
jq
- Чудово підходить для легкого й чистого вилучення та обробки даних JSON (яких сьогодні в нас безліч). Стала фактичним стандартом для перетворення даних JSON. З jq навіть можна створювати дані JSON
- Підтримує потокову обробку даних, тож можна працювати з «нескінченними» даними без проблем із памʼяттю
- Наголос на конвеєрах легко зрозуміє кожен, хто знайомий із потоками, наприклад з інструментами Unix. Це також робить код jq доволі легким для осмислення
Perl
- Відома своєю стислістю й виразністю. Щоб зробити багато, потрібно дуже мало коду
- Особливо добре підходить для роботи з текстом, значною мірою завдяки потужній підтримці регулярних виразів. Саме Perl 5 запровадила багато нових можливостей (як-от зворотні посилання, іменовані групи захоплення та ліниві квантифікатори). Філіп Гейзел створив PCRE (Perl Compatible Regular Expressions), бібліотеку на C, що реалізує сумісний із Perl 5 рушій регулярних виразів. Навіть мови, які не базуються на PCRE, часто проєктують підтримку регулярних виразів як сумісну з PCRE (а отже, з синтаксисом Perl 5)
Raku
- Підтримує автоматичне розпаралелювання junction, що робить роботу з паралелізмом значно простішою
- Підтримує ліниве обчислення, що дозволяє працювати з нескінченними масивами й послідовностями без проблем із памʼяттю. Це особливо корисно для великих наборів даних або алгоритмів, які працюють із нескінченними потоками даних
- Чудово підходить для обробки тексту, пропонуючи простіший, зрозуміліший і потужніший синтаксис регулярних виразів
- Вбудована підтримка визначення власних спеціалізованих мов (DSL) за допомогою граматик. Це дозволяє створювати парсери для конкретних форматів даних чи мов, полегшуючи роботу зі складними текстовими даними
Яку спробувати?
- Якщо ми переважно працюємо в системі Unix або займаємося DevOps, Bash - безцінна мова для вивчення. Вивчення AWK, Perl чи Raku теж може бути дуже корисним, а перші дві ще й попередньо встановлені на багатьох системах
- Якщо ми працюємо з JSON (або XML/YAML/TOML), jq - очевидний вибір
- Якщо потрібно обробляти текст, очевидний вибір - AWK, Perl і Raku.
- Якщо хочеться спробувати щось трохи інше, 8th - чудовий варіант