Що нового у світі програмування
[Перевод на русский язык — в конце материала.]
Напевно не існує області знань, якій не пророкують «теплову смерть» від відсутності розвитку. Програмування не є виключенням: досить часто можна почути що все, що можна було придумати в програмуванні вже є у Lisp/Fortran/Smalltalk (підкреслити вибране) і нічого принципово нового з тих часів так і не створено
Мої улюблені контрприклади: прийоми програмування, що з`явились порівняно недавно, при цьому досить прості та з досить широким застосуванням, це
- відкладені блоки в послідовності виконання
- переміщення компіляції (staging)
ілюстрація до процесу розвитку індустрії програмування взята з блогу Григорія Громова: abcdefgh.livejournal.com/1461405.html
Давайте подивимось на них детальніше:
Відкладені блоки в послідовності виконання команд
Приклад — конструкція scope в D або defer в Go. Основна ідея полягає в тому, що така одиниця комп’ютерної мови як блок виконання, розглядається не просто як послідовність команд з можливістю аварійного виходу за допомогою генерування виключень, але як більш складна конструкція, з кошиком куди в процесі виконання можна додавати команди, які будуть виконуватися згодом, після завершення основного блоку.
Таке структурування часто є більш зручним ніж традиційна обробка виключних ситуацій, внаслідок простішої композиції. Класичний приклад — нехай в нас є дві послідовні операції що потребують відновлення стану після збою:
Якщо ми захочемо додати сюди третю операцію, треба буде її вставляти у як ще один рівень вкладеності try/catch блоків. Якщо ми захочемо, щоб in та out були на одному рівні вкладеності, то виникне необхідність дублювання коду:
На D в такій ситуації можна написати наступне:
Тобто блок коду, маркований як scope(exit) буде виконуватися при виході з блоку (також в D існує scope(failure) та scope(success), що маркують виконання тільки у випадку відповідно неуспішного або успішного завершення блоку.
В Go приблизно з цією-ж метою додана конструкція defer:
Команди, що задані в defer будуть виконані наприкінці виходу із функції.
Як бачите, щоб додати ще одну операцію, що потребує відновлення, достатньо просто дописати її знизу. Тобто композиція виконання у даному випадку лінійна
Для подальшого знайомства з темою рекомендую
- подивитись лекцію Александреску: channel9.msdn.com/...-Successful-Features-of-D , де є більш детальній опис та порівняння цієї технології з автоматичним менеджментом ресурсів у мовах подібних до С++,
- також може бути цікава наступна стаття blog.golang.org/...er-panic-and-recover.html про обробку помилок в go.
Staging
Українською staging, напевно краще всього буде перекласти як ‘переміщення компіляції’. Ця технологія дозволяє надати одному і тому ж виразу різне значення, в залежності від контексту, де ми цей вираз використовуємо — тобто буквально перемістити компіляцію в інший контекст.
Тобто наступний вираз:
for( s <- students if (s.course == 4) ) yield s.name
може, в залежності від типу students компілюватися як в цикл, що проходить по колекції students, так і в щось подібне до sql запиту:
select s.name from students s where s.course == 4
або виклику javascript функції:
Як це працює:
- При компіляції мовні конструкції «віртуалізуються», тобто наведений вище приклад компілюється в щось подібне до students.filter(s => s.course == 4).map(s => s.name), а if (x) y else z в щось подібне до _ifThen(x,y,z) , де filter, map, _ifThen — стандартні функції або макроси.
Для стандартних типів компілятор використовує вбудовану реалізацію цих функцій (або макросів, як правило разом з inline оптимізацією, що повністю видаляє сліди цього прошарку), а для своїх типів користувач може підставити свої реалізації віртуальних конструкцій.
Ті з читачів, кто працює з C#, напевно впізнали LINQ; в scala деяке узагальнення цього підходу буде використовуватись як для роботи з базами даних, так і в ряді бібліотек (від компіляції javascript до хостингу обчислень на графічному процесорі)
Для подальшого знайомства з темою рекомендую
- подивитись виступ Наді Амін (про побдуову в scala внутрішнього DSL для генерації Javascript: skillsmatter.com/...script-embedded-dsl-scala
- та прочитати статтю Тьярка Ромпфа та Мартина Одескі:
‘Lightweight Modular Staging: A Pragmatic Approach to Runtime Code Generation and Compiled DSLs’ infoscience.epfl.ch/...47/files/gpce63-rompf.pdf де показано повний приклад побудови staging компіляції для невеликого внутрішнього DSL
Розкажіть мені щось
А які техніки програмування ви відкрили для себе за останні декілька років ? Якщо хочете доповісти щось цікаве — зв’яжіться зі мною та приходьте на Kyiv::fprog, що відбудеться
(реєстрація: dou.ua/calendar/2040 ). Приміщення спонсує strikead (мій поточний роботодавець, до речі організація з R&D центром у Києві, де активно використовується функціональний підхід), а наповнення у форматі міні-баркампу організують різні цікаві люди — точно буде секція про Erlang яку буде вести Лев Валкін (приводом для організації події став його приїзд до Києва) можливо також з перших рук можна буде почути також про використання Erlang в strikead від Олега Смірнова, обіцяє бути цікавою секція про LISP-похідні (Всеволод Демкін розповість про те, чому вам може не підійти clojure та як в Grammarly використовують комбінацію Java та Common Lisp для AI задач), ще два слота чекають на ваші теми.
Все про українське ІТ в телеграмі — підписуйтеся на канал DOU
Найкращі коментарі пропустити