Wolfram Function Repository: відкритий доступ до платформи для розширення мови Wolfram

Привіт, Хабре! Представляю вашій увазі переклад посту Стівена Вольфрама «Волфрам Function Repository: Створення Open Platform для розширення Wolfram Language».

Wolfram Function Repository: відкритий доступ до платформи для розширення мови Wolfram

Передумови спроможності мови Wolfram

Сьогодні ми стоїмо на порозі великих звершень разом із мовою програмування Вольфрамська мова. Усього три тижні тому ми запустили безкоштовний двигун Wolfram для розробників, щоб допомогти нашим користувачам інтегрувати мову Wolfram Language у їх масштабні програмні проекти. Саме сьогодні ми запускаємо репозиторій функцій Wolfram, щоб надати скоординовану платформу для функцій, створених для розширення мови Wolfram, а також ми відкриваємо репозиторій функцій для кожного, хто може зробити свій внесок у розвиток нашого програмного продукту.

Репозиторій функцій (Function Repository) Wolfram це те, що стало можливим завдяки унікальній специфіці Wolfram Language не тільки як мови програмування, але і як повномасштабної обчислювальної мови. У традиційних мовах програмування додавання значних нових функцій зазвичай включає створення цілих додаткових бібліотек, які можуть працювати або не працювати при спільному використанні. Однак у мові Wolfram Language так багато вже вбудовано в саму мову, що є можливість значно розширювати його функціональність, просто додаючи нові функції, які негайно інтегруються в цілісну структуру всієї мови.

Наприклад, вже зараз у репозиторії функцій Wolfram міститься 532 нових функції структурованих за 26 тематичними категоріями:

Wolfram Function Repository: відкритий доступ до платформи для розширення мови Wolfram

Аналогічно більш ніж 6000 стандартних функцій, вбудованим у мову Wolfram, кожна функція з репозиторію має сторінку документації з докладним їх описом та прикладами роботи:

Wolfram Function Repository: відкритий доступ до платформи для розширення мови Wolfram

Для переходу на сторінку скопіюйте наведений вище об'єкт (функціональний BLOB), вставте його в рядок введення та потім запустіть функцію – вона вже вбудована у мову Wolfram і підтримується за замовчуванням, починаючи з версії 12.0:

Wolfram Function Repository: відкритий доступ до платформи для розширення мови Wolfram

Тут слід зазначити, що при обробці LogoQRCode Вам не потрібно, наприклад, налаштовувати «бібліотеку для обробки зображень» — оскільки у мові Wolfram Language нами вже реалізовано послідовний та ретельно алгоритмізований спосіб обробки зображень, які негайно можуть бути оброблені різними графічними функціями мови:

Wolfram Function Repository: відкритий доступ до платформи для розширення мови Wolfram

Сподіваюся, що за підтримки чудової та талановитої спільноти, що зростає та розширюється (на базі мови Wolfram Language) протягом останніх кількох десятиліть. Репозиторій функцій Wolfram дозволить у найближчому майбутньому значно розширити діапазон (можливо потенційно значних, спеціалізованих у різних галузях знань науки і техніки) функцій, доступних у мові. Таким чином, з'являється можливість використовувати як зміст мови (його вбудовані функції), так і принципи розвитку, що реалізуються з урахуванням мови. (Тут слід зазначити, що Wolfram Language має вже більш ніж 30-річну історію розвитку та стабільного зростання).
Всередині функцій з репозиторію можуть бути невеликі або об'ємні фрагменти коду, написаного мовою Wolfram Language. Наприклад, це можуть бути виклики зовнішніх API та сервісів або зовнішніх бібліотек іншими мовами. Унікальною особливістю даного підходу є те, що коли Ви переходите до функціональності на рівні користувача, будуть відсутні можливі нестиковки через те, що даний підхід побудований на базі узгодженої структури мови Wolfram Language — і кожна функція автоматично працюватиме правильно — саме так, як їй і належить.
Оболонка та програмна структура репозиторію функцій Wolfram налаштовані таким чином, щоб кожен міг зробити свій внесок у загальну справу максимально простим і зручним для нього шляхом — по суті, просто заповнивши текстовий файл блокнота (з розширенням nb) WL. Вбудовані автоматичні функції дозволяють виконувати перевірку нових функцій, що додаються в репозиторій, з метою їх гарантованої інтеграції в мову. Наша компанія робить ставку на широке коло користувачів, які можуть інтегрувати свої функції в мову, а не на великі складності нових функцій — і хоча тут реалізовано процес перевірки, ми не наполягаємо на чомусь на кшталт копіткого аналізу конструкції або строгих стандартів повноти та надійності нових функцій користувачів, на відміну від ретельніших перевірок функцій, вбудованих у ядро ​​мови, які ми використовуємо.

У цьому підході існує безліч компромісів і деталей, але наша мета полягає в тому, щоб оптимізувати репозиторій функцій Wolfram як для зручності користувачів, так і для того, щоб нові функції користувачів давали відчутний внесок у розвиток мови. У міру зростання, я не сумніваюся, що нам доведеться винаходити нові методи обробки та перевірки функцій, що вбудовуються в репозиторій, і це не в останню чергу для організації великої кількості функцій і пошуку тих, які потрібні користувачам. Однак, не може не обнадіювати те, що вибраний нами шлях — це добрий початок. Я власноруч додав кілька функцій у початкову базу. Багато хто з них заснований на коді, який я особисто розробляв досить довго. І я витратив лише кілька хвилин, щоб переслати їх до репозиторію. Тепер, коли вони знаходяться в репозиторії, я можу нарешті - негайно і в будь-який час використовувати ці функції в міру необхідності, не турбуючись при цьому про пошук файлів, завантаження пакетів і т.п.

Підвищення ефективності при зниженні витрат

Ще до появи Інтернету існували способи обмінюватися кодом Wolfram Language (нашим першим великим централізованим проектом був MathSource, Створений для Mathematica в 1991 році на базі CD-ROM і т. п.). Безумовно, пропонований до реалізації підхід з урахуванням репозиторію функцій Wolfram є потужним і надійним засобом реалізації вищезазначених завдань.

Більше 30 років наша компанія старанно працювала над підтримкою цілісності структури мови Wolfram, і це дуже важливо для того, щоб мова Wolfram стала не просто мовою програмування, а й повноцінною обчислювальною мовою. І таким чином, суть підходу до реалізації репозиторію функцій Wolfram — це використання єдиного підходу до програмування та розробки нових функцій, які послідовно додаються та вписуються у рамки мови для можливості її розвитку та спільної еволюції.

У структурі кожної функції відбуваються різні обчислювальні процеси. Тут слід зазначити, що при цьому необхідно, щоб для користувача функція мала чіткий та одноманітний вигляд та наочну читаність. У цьому контексті вбудовані функції мови Wolfram Language представлені більш ніж 6000 послідовних прикладів того, як слід правильно програмувати функції (це наші відеоогляди з програмування у прямому ефірі, які включають сотні годин процесу створення типових програм). Цей підхід в кінцевому підсумку дозволяє робити репозиторій функцій Wolfram здатним до гарної роботи, саме структурний характер мови Wolfram Language з великою кількістю додаткових і різноманітних бібліотек, які вже вбудовані в мову. Наприклад, якщо у Вас є функція, що обробляє зображення, або розріджені масиви, або молекулярні структури, а також географічні дані або якісь інші — у мові вже існує їхнє узгоджене символьне уявлення, і завдяки цьому Ваша функція відразу стає сумісною з іншими функціями в мові.

Створення репозиторію, який би справді добре працював, є цікавим завданням мета-програмування. Наприклад, надлишок обмежень у програмі не зможе дозволити отримати необхідну уніфікацію та універсальність роботи алгоритму. Так само, як і за недостатньої кількості функціональних обмежень Ви не зможете реалізувати досить правильну послідовність виконання алгоритму. Декілька попередніх прикладів реалізації компромісу даних підходів, реалізованих нашою компанією, спрацювали досить стабільно — це: Проект Вольфрам Демонстрації, запущений у 2007 році і тепер працює в інтерактивному режимі в мережі Інтернет і містить понад 12000 користувальницьких інтерактивних демонстрацій. У базі даних Wolfram є більше 600 готових баз даних, які можна використовувати у мові Wolfram Language, а сховище нейронних мереж Wolfram поповнюється новими нейронними мережами практично щотижня (зараз їх уже 118) і вони відразу ж підключаються через функцію NetModel у мові Wolfram Language.

Всі перелічені вище приклади мають принципову особливість — об'єкти, що збираються в проект, і функції мають дуже високий ступінь структурування і розподілу процесів. Безумовно, деталізація структури того, що є демонстрацією чи нейронною мережею чи чимось іншим, можуть дуже відрізнятися, але фундаментальна структура для будь-якого поточного репозиторію завжди залишається незмінною. Так яка ж ваша думка, шановний користувач, щодо створення такого репозиторію, який додає розширення до мови Wolfram? Мова Wolfram Language спроектована таким чином, щоб бути надзвичайно гнучкою, тому її можна розширювати та видозмінювати будь-яким способом. Ця обставина є надзвичайно важливою для можливості швидко створювати різноманітні великомасштабні програмні проекти мовою Wolfram Language. Тут слід зазначити, що зі зростанням гнучкості мови неминуче зросте і вартість проектів, що реалізуються такою мовою. Це відбувається через те, що чим більше користувач застосовує таку мову, тим більше він отримує виділеної функціональності, але не слід забувати, що даний підхід може мати і негативні сторони щодо неможливості забезпечення послідовної узгодженості програмних модулів.

У традиційних мовах програмування існує поширена проблема з бібліотеками — якщо Ви, наприклад, використовуєте одну бібліотеку, код працює коректно, але, якщо Ви спробуєте використовувати декілька бібліотек, немає гарантії, що вони коректно взаємодіятимуть один з одним. Також у традиційних мовах програмування - на відміну від повноцінної мови обчислень - відсутні можливості гарантовано контролювати наявність узгоджених вбудованих уявлень для будь-яких функцій або типів даних, крім їх базових структур. Але, по суті, проблема ще більша, ніж на перший погляд: якщо хтось будує великомасштабну вертикаль функціональності, то без величезних витрат по централізованому програмуванню проекту, які ми вклали в мову Wolfram, неможливо досягти узгодженості. Тому важливим є те, щоб усі програмні модулі завжди коректно працювали спільно.

Таким чином, ідея репозиторію функцій Wolfram полягає в тому, щоб уникнути проблеми, озвученої вище - просто додаючи розширення до мови у вигляді порівняно невеликих елементів програмного коду за допомогою окремих функцій, розробка яких у вигляді узгоджених модулів є більш простим завданням. При цьому існують особливості програмування, які неможливо зробити зручними за допомогою окремих функцій (і наша компанія найближчим часом збирається випустити оптимізований програмний алгоритм для допомоги у реалізації великомасштабних програмних пакетів). Однак, на базі вже вбудованих у мову Wolfram Language функцій існує безліч можливостей для програмування, які реалізовані на базі окремих функцій. Тут думка полягає в тому, щоб при порівняно невеликих програмних зусиллях можна було створити низку нових і дуже корисних функцій, які забезпечать достатню узгодженість проекту, при цьому вони будуть добре узгоджені один з одним, а також, крім того, вони матимуть можливість легко і широко використовуватися у мові надалі.

Цей підхід, безумовно, є компромісом. За умови реалізації масштабнішого пакету можна уявити собі зовсім новий світ функціональності, який стане надзвичайно потужним і корисним. Якщо існує необхідність отримувати нові функціональні можливості, які будуть вписуватися в інше, але при цьому Ви не готові витрачати величезні зусилля на розробку проекту, це, на жаль, може призвести до зниження масштабу Вашого проекту. Ідея репозиторію функцій Wolfram полягає в тому, щоб забезпечити функціональністю визначальну частину проекту, даний підхід дозволить додати потужний функціонал, водночас спрощуючи підтримку хорошої узгодженості проекту програмування.

Допомога при додаванні функцій користувача в репозиторій функцій

Фахівці нашої компанії наполегливо працювали над тим, щоб зробити свій внесок у функції репозиторію Wolfram досить легким для користувачів. На робочому столі (вже в версії 12.0), Ви можете просто послідовно перейти за вкладками основного меню: File > New > RepositoryItem > Function Repository Item і Ви отримаєте «Definition Notebook» (програмно всередині робочого середовища. Ви також можете використовувати функцію аналог — CreateNotebook["FunctionResource"]):

Wolfram Function Repository: відкритий доступ до платформи для розширення мови Wolfram

Існують дві основні дії, які Ви повинні виконати: по-перше, фактично записати код Вашої функції і, по-друге, записати документацію, що ілюструє, як має працювати Ваша функція.
Натисніть кнопку «Відкрити зразок», щоб побачити приклад того, що Вам потрібно зробити:

Wolfram Function Repository: відкритий доступ до платформи для розширення мови Wolfram

Фактично Ви намагаєтеся створити щось схоже на вбудовану функцію в мові Wolfram Language. За винятком того, що вона може робити щось набагато конкретніше, ніж вбудована функція. При цьому очікування щодо її повноти та надійності будуть набагато нижчими.
Вам необхідно задати ім'я для Вашої функції, яке відповідатиме принципам іменування функцій Wolfram Language. Крім цього, Вам знадобиться розробити документацію для Вашої функції, за аналогією з вбудованими функціями мови. Докладніше я розповім про це пізніше. Зараз просто зверніть увагу на те, що в ряді кнопок у верхній частині файлу блокнота визначень є кнопка «Рекомендації за стилем», в якій пояснюється, що робити, та кнопка «Інструменти», яка надає інструментарій для форматування документації Вашої функції.
Коли Ви переконаєтесь, що все заповнено належним чином і Ви готові, натисніть кнопку Check (Перевірити). Цілком нормальним є те, що Ви ще не розібралися у всіх деталях. Тому функція Check буде автоматично виконуватися і робити багато перевірок стилю та узгодженості. Часто вона відразу ж запропонує Вам підтвердити і прийняти виправлення (Наприклад: «Цей рядок має закінчуватися двокрапкою», і він запропонує ввести двокрапку). Іноді вона попросить Вас додати чи змінити щось самостійно. Ми постійно додаватимемо нові можливості до автоматичної функціональності кнопки «Check», але в основному його мета полягає в тому, щоб гарантувати — все, що ви відправляєте до репозиторій функцій, вже точно відповідає якомога більшій кількості рекомендацій щодо стилю

Wolfram Function Repository: відкритий доступ до платформи для розширення мови Wolfram

Отже, після запуску Check ви можете використовувати Preview (Перегляд). "Preview" створює попередній перегляд сторінки документації, яку Ви визначили для своєї функції. Ви також можете створити попередній перегляд для файлу, створеного на Вашому комп'ютері або файлу, що знаходиться в хмарному сховищі. Якщо Вас, з якихось причин, не влаштовує те, що Ви побачите в попередньому перегляді, просто поверніться назад і виконайте необхідні виправлення, а потім натисніть кнопку Preview.
Тепер Ви готові розмістити свою функцію у репозиторії. Кнопка Deploy надає Вам чотири варіанти дій:

Wolfram Function Repository: відкритий доступ до платформи для розширення мови Wolfram

На цьому кроці важливим є те, що Ви можете відправити свою функцію до репозиторій функцій Wolfram, щоб вона була доступна будь-якому користувачеві. При цьому Ви також можете розмістити свою функцію для обмеженої кількості користувачів. Наприклад, Ви можете створити функцію, розміщену локально на Вашому комп'ютері, таким чином, щоб вона була доступна, коли Ви використовуєте цей конкретний комп'ютер. Або Ви можете розмістити її у своїй хмарного облікового записущоб вона була доступна Вам, коли Ви підключені до хмари. Ви також можете публічно розмістити (розгорнути) функцію через свій хмарний обліковий запис. При цьому її не буде в центральному репозиторії функцій Wolfram, але ви зможете дати комусь URL-адресу, яка дозволить їм отримати Вашу функцію з Вашого облікового запису. (У майбутньому ми також підтримуватимемо центральні репозиторії в масштабах всієї нашої компанії).

Отже, скажімо, Ви хочете фактично передати свою функцію в базу знань функцій Wolfram. Для цього Ви натискаєте кнопку «Надіслати» до репозиторію. То що тоді відбувається в даний момент? Ваша заявка відразу ж потрапляє в чергу для розгляду та затвердження нашою спеціальною командою кураторів.

У міру того, як Ваша заявка проходить через процес узгодження (який зазвичай займає кілька днів), Ви отримуватимете повідомлення про стан її розгляду, а також, можливо, пропозиції щодо її подальшого використання. Але як тільки вашу функцію буде схвалено, вона буде негайно опублікована в репозиторії функцій Wolfram і стане доступною для будь-якого використання. (І це буде відображатися в дайджестах новин нових функцій і т.д.)

Що ж має бути у сховищі?

Слід зазначити, що в нашій компанії дуже високі стандарти повноти, надійності та загальної якості, з 6000+ функцій, які ми вже вбудували в мову Wolfram за останні 30 з лишком років, всі відповідають вищезазначеним вимогам. Мета репозиторію функцій Wolfram полягає в тому, щоб використовувати всю структуру та функціональні можливості, які вже існують у мові Wolfram Language, для того, щоб додати якомога більше набагато легших функцій (тобто функцій з більш високою продуктивністю).

Безумовно, функції в репозиторії функцій Wolfram повинні відповідати принципам розробки мови Wolfram Language — щоб вони могли повноцінно взаємодіяти з іншими функціями та очікуваннями користувачів щодо того, як функції слід правильно працювати. Однак, при цьому функції не повинні мати однакову повноту або надійність.

У вбудованих функціях мови Wolfram, ми працюємо над тим, щоб зробити програмні функції якомога загальнішими. При цьому при знаходженні в репозиторії функцій Wolfram немає нічого поганого в тому, щоб у нього потрапила функція, яка просто обробляє дуже конкретний, але корисний випадок. Наприклад, функція SendMailFromNotebook може отримувати файли в одному певному форматі та створювати пошту одним певним способом. PolygonalDiagram створює діаграми лише з певними кольорами та маркуванням тощо.

Ще одним моментом, пов'язаним із вбудованими функціями, є те, що наша компанія докладає всіх зусиль для обробки всіх нетипових випадків, для правильної обробки некоректного введення тощо. У репозиторії функцій абсолютно нормальним є випадок, коли у ньому існує спеціальна функція, яка обробляє основні випадки розв'язання задачі та ігнорує всі інші.

Очевидним є той факт, що краще мати функції, які роблять більше, і роблять це краще, але оптимізація для репозиторію функцій – на відміну від вбудованих функцій мови Wolfram – повинна мати більше функцій, перев'язаних з великою кількістю функцій, ніж заглиблюватися у процеси реалізації кожної конкретної функції.

Тепер розглянемо приклад тестування функцій в репозиторії. Очікування узгодженості для таких функцій, природно, набагато нижчі, ніж для вбудованих функцій мови. Це особливо актуально у випадках, коли функції залежать від зовнішніх ресурсів, таких як API, важливо постійно проводити послідовні тести, що автоматично відбувається всередині алгоритмів перевірки. У файлі nb ви можете явно вказати визначення (у розділі «Додаткова інформація») та задати стільки тестів, що визначаються або рядками введення та виведення, або повними символьними об'єктами типу VerificationTestскільки вважаєте за потрібне. Крім того, система постійно намагається перетворити наведені Вами приклади документації на процес перевірки (при цьому іноді це може бути досить ресурсомістким, наприклад, для функції, результат якої залежить від випадкових чисел або часу доби).

У результаті репозиторії функцій буде низку складнощів реалізації. Деякі будуть просто одним рядком коду, інші можуть включати тисячі або десятки тисяч рядків, можливо з використанням безлічі допоміжних функцій. У яких випадках варто додати функцію, визначення якої потрібно дуже мало коду? В принципі якщо для функції є гарна мнемонічна назва, яке користувачі охоче зрозуміли б, побачивши це в частині коду, то її вже можна додати. В іншому випадку, ймовірно, краще просто знову дописати до Вашої програми код щоразу, у тих випадках, коли Вам потрібно використовувати його.

Основна мета репозиторію функцій (як випливає з його назви) полягає в тому, щоб вводити у функціонал мови нові функції. Якщо Ви хочете додати нові дані або нові сутності, використовуйте репозиторій Wolfram Data. Але що робити, якщо ви хочете ввести нові види об'єктів для ваших обчислень?

Насправді є два шляхи. Можливо, ви захочете ввести новий тип об'єкта, який буде використовуватися в нових функціях репозиторії функцій. І в цьому випадку Ви завжди можете просто записати його символьне уявлення та використовувати його при введенні або виведенні функцій у репозиторії функцій.

Але що робити, якщо ви хочете представити об'єкт, а потім визначити, через існуючі функції в мові Wolfram Language, які повинні працювати разом з ним? Для цього Wolfram Language завжди мав легкий механізм, який називається UpValues. З деякими обмеженнями (особливо для функцій, які не можуть оцінювати свої аргументи), репозиторій функцій дозволяє Вам просто уявити функцію та визначити значення для неї. (Щоб підвищити очікування узгодженості при створенні нової важливої ​​конструкції, повністю інтегрованої скрізь у мові Wolfram Language, це, як правило, дуже важлива процедура, яка не може бути досягнута лише за допомогою підвищення вартості проекту і це те, що наша компанія робить у рамках проектів довгострокового розвитку мови, це завдання не є метою, яка ставиться в рамках розвитку репозиторію).

Отже, що може бути в коді функцій в репозиторії функцій? Все, що вбудоване в мову Wolfram Language, звичайно (принаймні, якщо це не уявляє загрози для безпеки і працездатності самої програми, як обчислювального середовища) так само, як і будь-яка функція з репозиторію функцій. При цьому існують інші можливості функціонування: функція в репозиторії функцій може викликати API, або в Вольфрам Хмара, або з іншого джерела. Звичайно, є деякі ризики, пов'язані з цим. Тому що немає гарантій, що API не зміниться, а функція в сховищі функцій при цьому перестане працювати. Для виявлення подібних проблем існує примітка на сторінці документації (в розділі "Вимоги") для будь-якої функції, яка спирається не лише на вбудовану функціональність Wolfram Language. (Звичайно, коли йдеться про реальні дані, можуть бути проблеми навіть з такою функціональністю — тому що реальні дані про світ постійно змінюються, а іноді навіть змінюють їх визначення та структуру.)

Чи повинен весь код для репозиторію функцій Wolfram бути написаний мовою Wolfram? Визначено, що код всередині зовнішнього API не повинен бути написаний мовою Wolfram, що власне навіть не робить код мови. Насправді, якщо Ви знайдете функцію практично будь-якою зовнішньою мовою або бібліотекою, ви зможете створити оболонку, яка дозволить використовувати її в репозиторії функцій Wolfram. (Зазвичай для цього слід використовувати вбудовані функції ExternalEvaluate або ExternalFunction у коді мови Wolfram.)

То який же сенс робити це? Це дозволяє використовувати всю інтегровану систему Wolfram Language і весь її уніфікований набір програмних можливостей. Якщо Ви отримуєте базову реалізацію із зовнішньої бібліотеки або мови, то Ви можете використовувати багату символьну структуру мови Wolfram Language для створення зручної функції верхнього рівня, яка дозволяє користувачам досить легко використовувати будь-яку вже реалізовану функціональність. Принаймні це повинно мати можливість реалізації в ідеальному світі, де існують всі складові елементи завантаження бібліотек і т.п., в даному випадку вони автоматично вирішуватимуться за допомогою Wolfram Language. (Слід зазначити, що на практиці можуть виникнути проблеми з настроюванням зовнішніх мов у конкретній комп'ютерній системі, а у хмарному сховищі можуть виникнути додаткові проблеми з безпекою).

До речі, коли ви вперше аналізуєте типові зовнішні бібліотеки, вони часто здаються занадто складними, щоб їх можна було охопити лише кількома функціями, але в багатьох випадках більша частина складності виникає через створення інфраструктури, необхідної для бібліотеки, та всіх функцій для її підтримки . Однак при використанні мови Wolfram Language, інфраструктура, як правило, вже вбудована в пакети, і тому не потрібно докладно розкривати всі ці функції підтримки, а потрібно лише створити функції для кількох найвищих функцій, орієнтованих на додаток в бібліотеці.

"Екосистема" бази знань

Якщо Ви написали функції, які використовуєте постійно, надішліть їх до репозиторій функцій Wolfram! Якщо з цього в результаті не вийде щось більше (розвиток мови), то тоді Вам буде набагато зручніше використовувати функції для особистого користування. Однак логічно припустити, що, якщо Ви використовуєте функції постійно, можливо, й інші користувачі також знайдуть їх корисними.

Природно, що Ви можете опинитися в ситуації, коли ви не маєте можливості чи не хочете ділитися своїми функціями або у разі отримання доступу до приватних інформаційних ресурсів. Навіть у таких випадках Ви можете просто розгорнути функції у своєму власному обліковому записі в хмарі, вказавши права доступу до них. (Якщо у Вашій організації є приватна хмара Wolfram Enterprise, то незабаром воно зможе розмістити власний приватний репозиторій функцій, який можна адмініструвати з Вашої організації та встановлювати примусовий перегляд уявлень чи ні для сторонніх користувачів.

Функції, які Ви надсилаєте до репозиторій функцій Wolfram, не обов'язково мають бути ідеальними; вони просто мають бути корисними. Це трохи схоже на розділ «Помилки» у класичній документації Unix — у «Розділі визначень» є розділ «Нотатки автора», в якому Ви можете описати обмеження, проблеми тощо, про які Ви вже знаєте про свою функцію. Крім того, коли ви надсилаєте свою функцію до репозиторій, Ви можете додати примітки до відправки, які будуть прочитані спеціальною командою кураторів.

Після публікації функції її сторінка має дві посилання внизу: «Надіслати повідомлення про цю функцію» та «Обговорити у спільноті Wolfram». Якщо Ви прикріплюєте позначку (наприклад, повідомляти про помилки), Ви можете встановити прапорець, в якому говориться, що ви хочете, щоб Ваше повідомлення та контактна інформація були передані автору функції.

Іноді виникає необхідність просто використовувати функції з репозиторію функцій Wolfram, наприклад, вбудовані функції, не заглядаючи в їх код. Однак, якщо ви хочете «заглянути всередину», у верхній частині завжди є кнопка «Блокнот». Натисніть на неї і Ви отримаєте власну копію оригінального зошита визначення, яка була відправлена ​​до репозиторій функцій. Іноді Ви можете просто використовувати її як приклад для своїх потреб. При цьому Ви також можете розробити власну модифікацію цієї функції. Можливо, Ви захочете розмістити ці знайдені Вами функції з репозиторію на своєму комп'ютері або у своєму обліковому записі у Вашому хмарному сховищі попелиці, можливо, Ви захочете відправити їх до бази знань функцій, можливо, як покращена, доповнена версія початкової функції.

У майбутньому ми плануємо підтримувати розгалуження в стилі Git для репозиторіїв функцій, але зараз ми намагаємося зробити це простіше, і ми завжди маємо лише одну загальноприйняту версію кожної функції, вбудованої в мову. Найчастіше (якщо розробники не відмовляються від підтримки розроблених ними функцій та відповідають на повідомлення користувачів), первісний автор функції отримує контроль над оновленнями до неї та відправляє нові версії, які потім перевіряються і, якщо проходять процес перевірки, публікуються у мові.

Розглянемо питання, як працює "версійність" розроблених функцій. Прямо зараз, коли Ви використовуєте функцію з репозиторію функцій, її визначення постійно зберігатиметься на вашому комп'ютері (або у вашому хмарному обліковому записі, якщо ви використовуєте хмару). Якщо з'явилася нова версія функції, то при наступному її використанні ви отримаєте повідомлення, яке сповіщає про це. І якщо ви хочете оновити функцію до нової версії, ви можете зробити це за допомогою команди ResourceUpdate. («Функціональний BLOB-об'єкт» насправді зберігає більше інформації про версії, і в майбутньому ми плануємо зробити це доступнішим для наших користувачів.)

Однією з чудових особливостей репозиторію функцій Wolfram є те, що будь-яка програма Wolfram Language у будь-якому місці може використовувати функції з нього. Якщо програма з'являється в блокноті, часто буває зручно відформатувати функції репозиторію у вигляді функцій «функціональних двійкових об'єктів, що легко читаються» (можливо, з відповідним набором версій).

Ви завжди можете звернутися до будь-якої функції репозиторію функцій, використовуючи текстову ResourceFunction [...]. І це дуже зручно, якщо Ви пишете код або сценарії безпосередньо для Wolfram Engine, наприклад, з за допомогою IDE або текстового редактора коду (Слід особливо відзначити, що репозиторій функцій повністю сумісний з Free Wolfram Engine для розробників).

Як це працює?

Усередині функцій у репозиторії Wolfram це можливо з використанням такої самої системи ресурсів бази, як і в всіх інших наших існуючих репозиторіях (сховище даних, Neural Net Repository, колекція демонстраційних проектів і т.д.), як і решта системних ресурсів Wolfram, ResourceFunction зрештою заснований на функції ResourceObject.

Розглянемо ResourceFunction:

Wolfram Function Repository: відкритий доступ до платформи для розширення мови Wolfram

Усередині Ви можете побачити деяку інформацію за допомогою функції Інформація:

Wolfram Function Repository: відкритий доступ до платформи для розширення мови Wolfram

Як працює налаштування функції ресурсу? Найпростіший - це суто локальний випадок. Ось приклад, який бере функцію (у разі просто чисту функцію) і визначає її як функцію ресурсу для даного сеансу роботи у програмі:

Wolfram Function Repository: відкритий доступ до платформи для розширення мови Wolfram

Після того, як Ви зробили визначення, ви можете використовувати функцію ресурсу:

Wolfram Function Repository: відкритий доступ до платформи для розширення мови Wolfram

Зверніть увагу, що в цьому об'єкті BLOB функції є чорний значок Wolfram Function Repository: відкритий доступ до платформи для розширення мови Wolfram. Це означає, що функція BLOB відноситься до функції ресурсів у пам'яті, визначеної для поточного сеансу. Для функції ресурсу, яка постійно зберігається на Вашому комп'ютері або у хмарному обліковому записі, є сірий значок Wolfram Function Repository: відкритий доступ до платформи для розширення мови Wolfram. А для офіційної функції ресурсу у репозиторії функцій Wolfram є помаранчевий значок Wolfram Function Repository: відкритий доступ до платформи для розширення мови Wolfram.

Отже, що відбувається, коли ви використовуєте меню "Розгортання" у блокноті визначення? По-перше, він бере всі визначення у блокноті і з них створює символьний ResourceObject). (А якщо Ви використовуєте текстову IDE або програму, то Ви також можете явно створити ResourceObject)

Локальне розгортання функції з репозиторію на комп'ютері виконується за допомогою команди LocalCache для об'єкта ресурсу, щоб зберегти його як LocalObject у файловій системі. Розгортання у хмарному обліковому записі виконується за допомогою команди CloudDeploy для об'єкта ресурсу, а публічне розгортання у хмарі CloudPublish. У всіх випадках ResourceRegister також використовується для реєстрації імені функції ресурсу, так що ResourceFunction["name"] буде працювати.

Якщо натиснути кнопку Submit для Function Repository, то під ним відбувається ResourceSubmit викликається об'єкт ресурсу. (І якщо Ви використовуєте текстовий інтерфейс введення, Ви також можете викликати ResourceSubmit безпосередньо.)

За замовчуванням надсилання виконується під іменем, пов'язаним з ідентифікатором Wolfram ID. Але якщо ви надсилаєте заявку від імені групи розробників або організації, Ви можете встановити окремий ідентифікатор видавця і замість цього використовувати його як ім'я для взаємодії з Вашими уявленнями.

Після того, як Ви відправили будь-яку Вашу функцію до бази знань функцій, вона потрапить у чергу на перевірку. Якщо Ви отримаєте коментарі у відповідь, вони зазвичай будуть у формі текстового файлу з доданими додатковими комірками коментарів. Ви завжди можете перевірити статус своєї заявки, зайшовши на портал учасника системи ресурсів. Але як тільки Ваша функція буде схвалена, Ви будете повідомлені (електронною поштою), і Ваша функція буде розміщена в репозиторії функцій Wolfram.

Деякі тонкощі у роботі

На перший погляд може скластися враження, що можна просто взяти блокнот визначення і дослівно помістити його в репозиторій функцій, проте насправді є досить багато тонкощів — і для їх обробки потрібно виконати досить складне мета-програмування, символьне обробляючи як код, що визначає функцію , і сам Блокнот визначення. Більшість цього відбувається всередині, тобто «за кадром», але це може мати деякі наслідки, які варто зрозуміти, якщо Ви збираєтеся зробити свій внесок у базу знань функцій.

Перша безпосередня тонкість: Коли Ви заповнюєте Блокування визначень, Ви можете просто посилатися на свою функцію скрізь, використовуючи ім'я, подібне MyFunction, що виглядає як звичайне ім'я для функції в мові Wolfram Language, але для документації репозиторія функцій це замінюється ResourceFunction["MyFunction"] – це саме те, що користувачі фактично використовуватимуть під час роботи з функцією.

Друга тонкість: коли ви створюєте функцію ресурсу з Блокнота визначення, всі залежності, залучені до визначення функції, повинні бути зафіксовані і явно включені. Однак, щоб гарантувати, що визначення залишаються модульними, потрібно помістити все в унікальне простір імен. (Зрозуміло, що функції, які роблять все це, знаходяться в репозиторії функцій.)

Зазвичай, Ви ніколи не побачите жодних слідів роботи коду, який використовується для налаштування цього простору імен. Але якщо з якоїсь причини Ви викликаєте недовиконаний символ усередині вашої функції, то побачите, що цей символ знаходиться у внутрішньому контексті функції. Однак при обробці Блокнота визначення, щонайменше, символ, що відповідає самій функції, налаштовується для найкращого відображення у вигляді функціонального BLOB, а чи не необробленого символу у внутрішньому контексті.

Репозиторій функцій призначений визначення нових функцій. І ці функції можуть мати настройки. Часто ці параметри (наприклад, Метод або Розмір зображення) матимуть можливість використання для вбудованих функцій, а також для тих, для яких вже існують вбудовані символи. Але іноді нові функції можуть знадобитися і нові опції. Для того, щоб зберегти модульність, необхідно, щоб ці параметри були символами, визначеними в унікальному внутрішньому контексті (або щось подібне до цілих функцій ресурсу, тобто самі по собі). Для простоти репозиторій функцій дозволяє задавати нові опції визначення у вигляді рядків. І для зручності користувачу ці визначення (за умови, що вони використовували OptionValue и OptionsPattern) також обробляються так, що при використанні функцій параметри можуть бути задані не тільки як рядки, а й як глобальні символи з тими самими іменами.

Більшість функцій просто роблять те, що вони мають робити щоразу, коли їх викликають, але деякі функції потребують ініціалізації, перш ніж вони зможуть працювати у певному сеансі — і для вирішення цієї проблеми у розділі «Визначення» є розділ «Ініціалізація».

Функції з репозиторію можуть використовувати інші функції, які вже знаходяться в репозиторії, для того щоб налаштувати визначення для репозиторію функцій, що включають дві (або більше) функції, які посилаються одна на одну, необхідно розгорнути їх у своєму сеансі роботи з програмою, щоб Ви могли посилатися на них як ResourceFunction["name"]Потім Ви можете створити потрібні Вам комбінації цих функцій приклади (не зрозуміла) і додати в репозиторій нову функцію на базі вже розміщених раніше. (або вже або раніше – обидва слова коряво)

Перспективи розвитку. Що має статися, коли репозиторій стане по-справжньому більшим?

Сьогодні ми тільки запускаємо репозиторій функцій Wolfram, але з часом ми очікуємо, що він (видалити) його обсяг і функціональність може різко зрости, і в міру його зростання розвитку виникнуть з'являться різні проблеми, які, як ми вже здогадуємося, можуть виникнути.

Перша проблема стосується імен функцій та їхньої унікальності. Репозиторій функцій спроектований таким чином, що в ньому, як і для вбудованих функцій у мові Wolfram Language, можна посилатися на будь-яку цю функцію, просто вказавши її ім'я. Але це неминуче означає, що імена функцій мають бути глобально унікальними по всьому репозиторію, отже, наприклад, у репозиторії може лише одна ResourceFunction["MyFavoriteFunction"].

На перший погляд, це може здатися великою проблемою, але варто розуміти, що це в основному та сама проблема, що і для таких речей, як інтернет-домени або маркери соціальних мереж. І річ у тому, що в системі просто необхідно мати реєстратора — і це одна з ролей, яку наша компанія виконуватиме для бази знань функції Wolfram. (Для приватних версій репозиторію їх реєстраторами можуть бути адміністратори.) Звичайно, інтернет-домен може бути зареєстрований, не маючи нічого на ньому, але в репозиторії функцій ім'я функції може бути зареєстроване лише за фактичного визначення функції.

Частиною нашої ролі в управлінні базою знань функцій Wolfram є забезпечення того, щоб ім'я, обране для функції, було логічним з урахуванням визначення функції, а також, щоб воно відповідало угодам про імена Wolfram Language. У нас вже більше 30 років досвіду з іменування вбудованих функцій мовою Wolfram Language, і наша команда курування (кураторів?) перенесе цей досвід також до репозиторій функцій. Безперечно, завжди є винятки. Наприклад, може здатися кращим мати коротке ім'я для деякої функції, але краще «захищатися» з довшим, конкретнішим ім'ям, тому що при цьому менше шансів зіткнутися з тим, що хтось хоче зробити схоже ім'я функції в майбутньому.

(Тут слід зазначити, що просте додавання будь-якого тега учасника для усунення неоднозначності функцій не принесе очікуваного ефекту. Тому що, якщо не наполягати на тому, щоб завжди присвоювався тег, потрібно буде визначати тег за промовчанням для будь-якої заданої функції, а також виділяти теги автора, що знову вимагатиме глобальної координації.)

У міру зростання обсягу бази знань функцій Wolfram одна з проблем, які, напевно, виникнуть - це виявленість функцій, для цього в системі передбачена функція пошуку (а файли визначення можуть включати ключові слова тощо). Для вбудованих функцій у мові Wolfram Language у документації є всі види перехресних посилань, які допомагають рекламувати функції. Функції репозиторії функцій можуть посилатися на вбудовані функції. А як же навпаки? Для цього ми збираємося експериментувати з різними схемами, щоб надати функції репозиторію на сторінках документації для вбудованих функцій.

Для вбудованих функцій у мові Wolfram Language існує так званий рівень виявлення, що забезпечується мережею «довідкових сторінок», які надають організовані списки функцій, що належать до конкретних областей. Завжди складно належним чином збалансувати сторінки довідника та зі зростанням мови Wolfram, сторінки довідника часто мають бути повністю реорганізовані. Досить просто помістити функції з репозиторію до широких категорій і навіть послідовно розбивати ці категорії, але набагато цінніше мати правильно організовані сторінки довідника мови. Поки не ясно, як найкраще створити їх для всієї бази знань функцій. Наприклад, CreateResourceObjectGallery у репозиторії функцій кожен може розмістити веб-сторінку, що містить свої «вибори» з репозиторію:

Wolfram Function Repository: відкритий доступ до платформи для розширення мови Wolfram

Репозиторій функцій Wolfram налаштований як постійне сховище функцій, де будь-яка функція завжди буде працювати. Безумовно, можуть з'явитися і нові версії функцій, і ми очікуємо, що деякі функції згодом, звичайно, застаріють. Функції будуть працювати, якщо вони використовуються в програмах, але їх сторінки документації будуть посилатися на нові, більш сучасні функції.

Репозиторій функцій Wolfram призначений для швидкого отримання нових функцій та вивчення нових можливостей використання мови Wolfram. З великою часткою оптимізму ми сподіваємося, що частина того, що було досліджено в репозиторії функцій, зрештою матиме сенс стати вбудованими частинами основної мови Wolfram Language. За останнє десятиліття ми мали схожий набір функцій, які були спочатку представлені у Wolfram | Alpha. І один з уроків, отриманих на підставі цього досвіду, полягає в тому, що для досягнення стандартів якості та узгодженості, на яких ми наголошуємо у всьому, що вбудоване в мову Wolfram, потрібно багато роботи, яка найчастіше складніше, ніж початкові зусилля з впровадження ідеї. Але навіть у цьому випадку функція в основі знань функцій може бути дуже корисним підтвердженням концепції майбутньої функції, яка в результаті може бути вбудована в мову Wolfram.

Тут найголовніше те, що функція в репозиторії функцій це те, що доступно кожному користувачеві для використання прямо зараз. Можливо, вбудована функція мови може бути набагато кращою та продуктивнішою, але репозиторій функцій дозволить користувачам одразу отримати доступ до всіх нових функцій. І, що особливо важливо, ця концепція дозволяє кожному додавати будь-які нові функції.

Раніше в історії мови Wolfram ця ідея не заробила б так добре, як зараз, але на даному етапі в мову вже закладено стільки зусиль, а також настільки глибоке розуміння принципів проектування мови, що тепер бачиться вельми можливим, щоб велике співтовариство користувачів додавало функції, які будуть підтримувати узгодженість проекту, щоб зробити їх корисними для широкого кола користувачів.

У спільноті користувачів Wolfram Language є неймовірний дух таланту(?). (Зрозуміло, до цієї спільноти входять багато провідних фахівців у галузі досліджень і розробок у різних областях.) Сподіваюся, що репозиторій функцій Wolfram надасть ефективну платформу для розкриття та поширення цього духу таланту. Тільки разом ми зможемо створити щось, що значно розширить область, до якої можна застосувати обчислювальну парадигму мови Wolfram.

За 30 з лишком років ми пройшли довгий шлях мовою Wolfram. Тепер разом, давайте підемо ще далі. Наполегливо закликаю всіх шанованих користувачів мови Wolfram у всьому світі, використовувати як платформу для цього функціональний репозиторій, а також новий програмний проект, як Free Wolfram Engine для розробників.

Джерело: habr.com

Додати коментар або відгук