Що нового у Світі програмування
article img {margin: 0 auto; border: 1px dashed # 999;}
[Переклад на російську мову - в кінці матеріалу.]
Напевно НЕ існує області знань, якій НЕ пророкують «теплову смерть» від відсутності розвитку. Програмування НЕ є віключенням: Досить часто можна почути Що все, Що можна Було прідуматі в програмуванні Вже є у Lisp/Fortran/Smalltalk (підкресліті Вибране) i нічого принципова нового з тих часів так І не Створено
Мої Улюблені контрпрікладі: прийому програмування, Що з `явилися порівняно недавно, при цьому Досить Прості та з Досить широким застосуванням, ціну
- відкладені блоки в послідовності виконан
- переміщення компіляції (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 Будуть віконані напрікінці вихід спектр поліграфічних функції.
Як бачите, щоб Додати но одну операцію, Що потребує Відновлення, достатності просто допісаті її знизу. Тоб композиція виконан у даного випадка лінійна
Для подалі Знакомства з темою рекомендую
- подивитись лекцію Александреску:, де є більш детальній опис та порівняння цієї технології з автоматичний менеджментом ресурсів у мовах подібніх до С + +,
- кож Може буті Цікава наступна стаття про обробка помилок в go.
Staging
Українською staging, напевно кращє Всього буде перевести Як 'переміщення компіляції'. Ця Технологія дозволяє придати одному и тому ж виразі різне значення, в залежності від контексту, де ми цею виразі вікорістовуємо - тоб буквально перемістіті компіляцію в Інший контекст.
тоб Наступний виразі:
for (s 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:
- та прочітаті статтю Тьярка Ромпфа та Мартіна Одескі:
'Lightweight Modular Staging: A Pragmatic Approach to Runtime Code Generation and Compiled DSLs' де показано повний приклад побудова staging компіляції для невеликого внутрішнього DSL
Розкажіть мені Щось
А які технікі програмування ви відкрілі для себе за Останні декілька РОКІВ? ЯКЩО хочете доповісті Щось Цікаве - зв'яжіться Зі мною та пріходьте на Kyiv :: fprog, Що відбудеться 21-го липня 14:00 - 18:00 у конференц-залі кубік-центру на Шолуденка 3.(Реєстрація: dou.ua/calendar/2040). Приміщення спонсує strikead (мій поточний Роботодавець, до речі організація з R & D центром у Кієві, де активно вікорістовується функціональний підхід) , а наповнення у форматі міні-баркампу організують Різні цікаві люди - точно буде Секція про Erlang Яку буде вести Лев Валкін (приводом для організації Події ставши йо пріїзд до Кіїва) можлива кож з дере рук можна буде почути кож про Використання Erlang в strikead від Олега Смірнова, обіцяє буті цікавою Секція про LISP-похідні (Всеволод Демкін розповість про ті, Чому вам Може НЕ підійті clojure Та як в Grammarly вікорістовують комбінацію Java та Common Lisp для AI задач), ще два слоти чекають на ваші тими.
Кожній дисципліні час від часу пророкують теплову смерть: програмування не виключення. Нерідко можна почути, що все, що можна було придумати вже придумано і є в Fortrane/Lisp-e/Smalltalk-e (потрібне підкреслити).
Два моїх улюблених контрпримера: техніки програмування, що з'явилися порівняно недавно, при цьому порівняно прості і широко застосовуються в індустрії - це
- структурування послідовності виконання
- переміщення мети компіляції (staging)
ілюстрація до процесу розвитку індустрії програмування взята з блогу Григорія Громова: abcdefgh.livejournal. com/1461405.html
Розповімо про них детальніше:
Структурована послідовність виконання.
Приклад - це конструкція scopes в D або defer в Go.
Ідея полягає в тому, що потік виконання являє собою не просто послідовний потік команд з можливістю аварійного виходу c допомогою винятку, а більш складний об'єкт, в якому передбачена можливість додати блок коду для відкладеного виконання.
Таке структурування більш зручно для обробки помилок, ніж традиційні виключення, через більш простий композиції. Класичний приклад: нехай нам треба зробити дві послідовні операції, що вимагають відновлення:
Якщо ми захочемо додати третю операцію з відновленням, то доведеться вводити ще один рівень вкладеності. Якщо спробувати, що б дві операції були на одному рівні - виникає проблема дублювання коду:
На D це ж пишеться як:
Тобто блок коду, позначений scope (exit) виконується при виході з блоку. (В D визначені ще scope (failure) - виконується при невдалому завершенні і scope (success) - при вдалому).
На go приблизно для цієї-ж мети може використовуватися конструкція deferred:
Блоки коду, помічені як deferred, виконуються при виході з функції
Зауважимо, що додати ще одну операцію, що вимагає відновлення в обох випадку можна просто дописавши її знизу. Тобто в даному випадку композиція виконання лінійна.
Для подальшого ознайомлення з темою рекомендую
- відеозапис виступу Александреску на Channel 9: де він описує цю конструкцію в D і показує як вона співвідноситься з ARM (Automatic Resource Management) підходом, прийнятому в мовах типу С + +
- Статті про відновлення після помилок в Go.
Staging
[На російську правильніше за все, напевно, перевести як «переміщення компіляції»]. Це технологія, що дозволяє надати одним і тим же виразом різний зміст - тобто буквально переорієнтувати компілятор на іншу мову в певному контексті
for (s s.name
може (в залежності від типів даних students) скомпілювати як в цикл, який проходить по колекції students, так і в щось на зразок sql запиту:
«Select s.name from students s where s.course == 4»
або javascript вираження
Як це працює:
- конструкції мови віртуалізуються: тобто наведене вище вираз for компілюється в щось на кшталт: students.filter (s =>s.course == 4). map (s =>s.name ) , а вираз if (x) y else z у щось на кшталт _ifThen (x , y, z)
- Для типів із стандартною семантикою компілятор використовує вбудовану реалізацію віртуалізіруемих функцій (або макросів, як правило разом з inline оптимізаціями, що прибирають цей прошарок), а для типів певних користувачем - підставляє певні користувачем реалізації
Ті хто працює з С # ймовірно дізналися тут LINQ, в scala деякий узагальнення даного підходу буде застосовуватися як і для роботи з БД (slick) так і в цілому ряді бібліотек - від генерації javascript до хостингу обчислень на графічному процесорі
Рекомендую
- подивитися лекцію Наді Амін про встраваніе в scala DSL для генерації javascript:
- і статтю Тьярка Ромпфа та Мартіна Одескі:
'Lightweight Modular Staging: A Pragmatic Approach to Runtime Code Generation and Compiled DSLs' де будується повний приклад невеликого вбудованого мови зі staging компіляцією.
Розкажіть щось
А які техніки ви відкрили для себе останнім часом? Якщо хочете розповісти і послухати що нового - приходьте на зустріч Kiev :: fprog в Києві 21-го липня з 14:00 до 18:00 в конференц-залі Кубик-центру на Шолуденка 3 (dou.ua/calendar/2040 - реєстрація). Приміщення спонсорує (мій поточний роботодавець, до речі, організація з R & D центром в Києві, де активно використовується функціональна підхід ), а наповнення у форматі міні-баркампа організують різні цікаві люди - точно буде секція про Erlang, котороую буде вести Лев Валкін (вобще-то приводом для організації події став його приїзд до Києва) також можливо з перших рук можна буде також почути про використання Erlang в strikead від Олега Смирнова, обіцяє бути цікавою секція про похідні Lisp-а: (Всеволод Дьомкін розповість про те, чому вам може не підійти clojure і як в Grammarly використовують комбінацію Java і Common Lisp для AI задач), ще два слота очікують ваших тем.Опубліковано: 10/07/12 @ 01:00
Розділ Блоги
Рекомендуємо:
17 липня, Київ - Speakers ' Corner : " OSGI in banking environment " by Fulco Houkes
Ігри сьогодні : грати чи ні ?
Рунет кишить трояном
Прикрашаємо бічну панель превью
Новини інтернету одним абзацом