Поділитися через


Огляд Microsoft Power Fx

Power Fx — це мова із базовим кодуванням, яка використовуватиметься у Microsoft Power Platform. Це загальна сильна, декларативна та функціональна мова програмування.

Power Fx виражена в зрозумілому тексті. Це малокодова мова, з якою розробники можуть працювати безпосередньо в рядку формул типу Excel або текстовому вікні Visual Studio Code. «Мало» у терміні «малокодова» пояснюється лаконічністю та простотою мови, що полегшує виконання загальних завдань програмування як для авторів, так і для розробників. Вона дає змогу отримати повний спектр розробки від «без написання коду» для тих, хто ніколи раніше не програмував, до «професійного коду» для досвідчених спеціалістів, без навчання або переписування різниці між ними, що дає змогу різним командам співпрацювати й заощаджувати час і гроші.

Нотатка

  • Microsoft Power Fx — це нова назва мови формул для компонованих програм у Power Apps. Робота над цим оглядом і пов’язаними статтями триває, оскільки ми отримаємо мову з компонованих програм, інтегруємо її з іншими продуктами Microsoft Power Platform і робимо її доступною як відкритий код. Щоб дізнатися більше про мову та спробувати її сьогодні, розпочніть із статті Початок роботи з формулами в компонованих програмах у інструкції Power Apps і підпишіться на безкоштовну ознайомлювальну версію Power Apps.
  • У цій статті ми посилаємося на авторів, коли описуємо функцію, що може використовуватися на будь-якому кінці спектру навиків програмування. Ми називаємо користувача розробником, якщо функція більш вдосконалена і, ймовірно, виходить за межі звичайного користувача Excel.

Power Fx зв’язує об’єкти разом із декларативними формулами, подібними до електронних таблиць. Наприклад, можна уявити властивість Видимий елементу керування інтерфейсу користувача як комірку на аркуші Excel з пов'язаною формулою, що обчислює її значення на основі властивостей інших елементів керування. Логіка формул автоматично повторно обчислює значення так само, як і сама електронна таблиця, що впливає на видимість елемента керування.

Крім того, якщо потрібно, Power Fx пропонує імперативну логіку. На аркушах зазвичай немає кнопок, які можуть надсилати зміни в базу даних, але часто це роблять програми. Для декларативної т імперативної логіки використовується та сама мова вразу.

Power Fx буде доступним як програмне забезпечення з відкритим вихідним кодом. Вони наразі інтегровано в компоновані програми та ми перебуваємо в процесі отримання її з Power Apps для використання в інших продуктах Microsoft Power Platform як відкритого коду. Додаткові відомості: Microsoft Power Fx на GitHub

Ця стаття — це огляд мови та принципів її проектування. Докладніше про Power Fx див. у таких статтях:

Роздуми про електронну таблицю

Що, якби програму можна було б створювати так само легко, як створювати аркуш у програмі Excel?

Що робити, якщо можна скористатися наявними знаннями з електронних таблиць?

Це були запитання, які надихнули на створення Power Apps і Power Fx. Сотні мільйонів людей щодня створюють аркуші з Excel; запропонуймо їм створення простих програм з використанням вже відомих понять Excel. Отримавши Power Fx з Power Apps ми збираємося відповісти на ці питання для автоматизації створення, віртуальних агентів або інших доменів.

Усі мови програмування, включно з Power Fx, мають вирази: спосіб представлення розрахунку за числами, рядками або іншими типами даних. Наприклад, mass * acceleration у більшості мов означає множення mass та acceleration. Результат виразу можна додати до змінної, що використовується як аргумент для процедури, або вкладення у більший вираз.

Power Fx робить ще один крок уперед. Вираз сам по собі нічого не каже про предмет обчислення. Завдання автора — помістити його в змінну або функцію. Замість формування виразу, який не має конкретного значення, у Power Fx пишеться формула, яка прив’язує вираз до ідентифікатора. Ви записуєте force = mass * acceleration як формулу для обчислення force Як зміни mass і acceleration, force автоматично оновлюється до нового значення. Вираз описав обчислення, формула дала назву цьому обчисленню та використала його як розрахунок. Ось чому Power Fx називається мовою формул.

Наприклад, ця формула зі Stack Overflow здійснює пошук рядку у зворотному порядку. У програмі Excel це має вигляд, як зображення нижче.

Пошук у зворотному напрямку

Знімок екрана: рядок формул у програмі Excel із формулою: =RIGHT(A1,LEN(A1)- FIND("|", SUBSTITUTE(A1," ","|", LEN(A1)-LEN(SUBSTITUTE(A1," ","")))) Комірка A1 містить текст "Привіт! Приємно познайомитися!" Клітинка A2 містить текст «познайомитися!»

Power Fx працює з тією самою формулою, у якій посилання на комірки замінено на посилання на властивість елементу керування.

Power Fx зворотний пошук.

Знімок екрана: рядок формул Power Fx у Power Apps. Формула має такий вигляд =RIGHT(Input.Text,Len(Input.Text)- FIND("|", SUBSTITUTE(Input.Text," ","|", Len(Input.Text)-Len(Substitute(Input.Text," ","")))) У полі введення під формулою текст «Привіт! Приємно познайомитися!" з’являється буква за буквою. У той же час у полі «Надпис» відображаються літери останнього слова. Коли в полі введення відобразиться весь текст, слово «познайомитися!» з’являється в полі «Надпис».

Якщо змінюється значення елемента керування Input, елемент керування Label автоматично перераховує формулу та відображає нове значення. Тут немає обробників подій OnChange, що були б поширені в інших мовах.

Інший приклад, в якому використовується формула Fill для кольору екрана. Коли змінюються повзунки, які керують червоним, зеленим і блакитним кольорами, колір фону автоматично змінюється після повторного обчислення.

Кольоровий повзунок.

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

Оскільки повзунки встановлені на темний колір, надписи для червоного, зеленого і синього кольорів змінюються на білий для компенсації. Це робиться за допомогою простої формули для властивості Color кожного елемента керування надписом.

Power Fx кольорові повзунки.

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

Power Fx — це декларативна мова, як і Excel. Автор визначає потрібну поведінку, а система має визначити та оптимізувати, як і коли її виконати. Щоб зробити це практичним, більша частина роботи виконується виключно через функції без побічних дій, що робить Power Fx також і функціональною мовою, знову ж таки, як і Excel.

Завжди активні

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

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

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

Завжди живи.

Коли вводиться .Employee, це призводить до того, що панель Data додає таблицю «Працівник», отримуються метадані для цієї таблиці, і відразу пропонуються пропозиції для стовпців. Ми переходили по зв'язкам з однієї таблиці до іншої, а система внесла необхідні зміни до посилань програми. Те ж саме відбувається в разі додавання .Customer.

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

Малий код

Power Fx описує бізнес-логіку в коротких, але дієвих формулах. Більшість логік можна зменшити до одного рядка, який має широку виразність і контроль для більш складних завдань. Мета полягає в тому, щоб звести до мінімуму кількість понять, які має розуміти розробник, в ідеалі, не більше, ніж уже знає користувач Excel.

Наприклад, щоб знайти ім’я працівника для замовлення, потрібно написати Power Fx, як показано в анімації нижче. Крім понять Excel, єдиним доданим поняттям, що використовується тут, є додана крапка ".", що означає деталізацію структури даних, у цьому випадку .Employee.'First Name'. У анімації відображаються відповідність між частинами формули Power Fx і поняттями, які потрібно явно кодувати в рівнозначному JavaScript.

з базовим кодуванням JavaScript.

Перегляньмо детальніші все, що робить Power Fx для нас, і ту свободу, яку вона має для оптимізації, тому що формула була декларативною.

  • Асинхронний: усі операції з даними є Power Fx асинхронними. Автору не потрібно вказувати це, і не потрібно синхронізувати операції після завершення виклику. Автору взагалі не потрібно знати про цю концепцію, про те, що таке зобов'язання або лямбда-функція.

  • Локальні та віддалені: Power Fx використовує однаковий синтаксис та функції для даних, які зберігаються локально в пам’яті, і віддалено підключають базу даних або службу. Користувачу не потрібно міркувати про таку відмінність. Power Fx автоматично передає всі свої можливості серверу, щоб ефективніше обробляти фільтри та сортувати їх.

  • Реляційні дані: Замовлення та Клієнти – це дві різні таблиці зі зв’язком «багато до одного». Для запиту OData потрібна $expand зі знанням зовнішнього ключа, подібно до з'єднання в SQL. Фактично, у формулі немає нічого з цього, ключі бази даних — це ще одне поняття, про яке не потрібно знати автору. Розробник може використовувати просту точкову нотацію для доступу до всього графіка зв’язків із запису.

  • Проекція: При написанні запиту багато розробників пишуть select * from table, що повертає всі стовпці даних. Power Fx аналізує всі стовпці, що використовуються в усій програмі, навіть через залежності формул. Прогнозування автоматично оптимізовано, і, знову ж таки, автору не потрібно знати, що означає «прогнозування».

  • Отримуйте лише те, що потрібно: у цьому прикладі LookUp функція передбачає, що слід отримати лише один запис, і це все, що повертається. Якщо за допомогою функції Filter запитуються додаткові записи, — для яких можуть відповідати тисячі записів, — то за один раз повертається лише одна сторінка даних, приблизно зі 100 записами на одній сторінці. Щоб переглянути інші дані, користувач має пройти через колекцію або таблицю даних, і вони будуть автоматично введені для нього. Автор може розраховувати на великі набори даних без потреби думати про обмеження запитів даних для керованих фрагментів.

  • Виконується лише за потреби: ми визначили формулу для Text властивості елемента керування міткою. Коли вибрана змінна змінюється, LookUp автоматично перераховується, і надпис оновлюється. Автору не потрібно було писати обробник OnChange для вибору, і він не повинен пам'ятати, що цей надпис залежить від нього. Це декларативне програмування, як обговорювалось раніше, автор вказав, що б він хотів мати на надписі, а не як і коли це потрібно отримати. Якщо цей надпис не відображається, оскільки він розташований на екрані, що не відображається, або його властивість Visible має значення «false», ми можемо відкласти цей розрахунок, поки надпис не стане видимим, і ефективно видалити його, якщо це відбувається рідко.

  • Переклад синтаксису Excel: Excel використовується багатьма користувачами, більшість з яких знають, що амперсанд (&) використовується для конкатенації рядків. У JavaScript використовується знак «плюс» (+) та інші мови, які використовують крапку (.).

  • Відображувані імена та локалізація: First Name використовується у формулі, Power Fx тоді як nwind_firstname використовується в еквіваленті JavaScript. У Microsoft Dataverse і SharePoint крім унікального логічного імені до стовпців і таблиць додається коротке ім'я. Короткі імена часто є набагато зручнішими, як у цьому випадку, проте вони мають іншу важливу якість: їх можна локалізувати. Якщо у вас є багатомовна робоча група, кожен її учасник може переглядати назви таблиць і полів власною мовою. У всіх випадках використання Power Fx забезпечує автоматичне надсилання в базу даних правильного логічного імені.

Без коду

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

Давайте розглянемо наведені далі приклади. У Power Apps на панелі властивостей представлені перемикачі і ручки «без коду» для властивостей елементів керування. На практиці більшість значень властивостей є статичними. За допомогою конструктора кольорів можна змінити колір фону в області Gallery. Зауважте, що ця зміна відображається в рядку формул, оновлюючи формулу до іншого RGBA виклику. У будь-який момент ви можете перейти до панелі формул і виконати ще один крок — у цьому прикладі, використовуючи ColorFade для налаштування кольору. Властивість кольору залишиться на панелі властивостей, але під час наведення курсору з'являється піктограма fx, і ви переходите до панелі формул. Це можна зробити двома способами: видалення виклику ColorFade повертає колір на те, що може зрозуміти панель властивостей, і ви можете використати його знову для встановлення кольору.

Колір без коду.

Нижче наведено складний приклад. У колекції відображається список працівників із Dataverse. Dataverse надає подання даних таблиці. Можна вибрати одне з цих подань і змінити формулу на використання функції Filter з цим ім'ям подання. За допомогою двох розкривних меню можна набрати відповідну таблицю та переглядати її, не торкаючись рядка формул. Але припустимо, що ви хочете продовжити й додати сортування. Це можна зробити в рядку формул, а на панелі властивостей знову з'являться піктограма fx і внесе зміни в рядок формул. І знову ж таки, якщо ми спростимо формулу на те, що панель властивостей може читати та записувати, її знову можна буде використати.

Сортування без коду.

Це були прості приклади. Вважаємо, що Power Fx створює чудову мову для опису взаємодії без коду. Вона коротка, потужна і проста у аналізі, а також надає часто необхідний запас від «немає різниці» до низького коду.

Промо-код

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

Фахівці хочуть використовувати професійні засоби для найбільшої продуктивності. Формули Power Fx можна зберігати у вихідних файлах YAML, які легко редагувати за допомогою Visual Studio Code, Visual Studio або будь-якого іншого текстового редактора, що дає змогу розмістити Power Fx у системі керування вхідним кодом за допомогою GitHub, Azure DevOps або будь-якої іншої системи керування вхідним кодом.

 Visual Studio Код Pro.

Про код GitHub.

Power Fx підтримує компоненти на основі формул для спільного доступу та повторного використання. Ми оголосили про підтримку параметрів до властивостей компонентів, що дозволяє створювати лише користувацькі функції з додатковими вдосконаленнями.

Крім того, Power Fx відмінно підходить для поєднання компонентів та послуг, створених фахівцями. Готові з’єднувачі надають доступ до сотень джерел даних і веб-служб. Настроювані з’єднувачі дають змогу Power Fx спілкуватись із будь-якою веб-службою REST, а компоненти коду дають змогу Power Fx взаємодіяти з повністю настроюваним JavaScript на екрані та сторінці.

Принципи проектування

Простий

Надбудова Power Fx призначена для цільової аудиторії розробників, учасники якої не пройшли підготовку в ролі розробників. Скрізь, де можливо, ми використовуємо знання, які ця аудиторія вже знає або може швидко вловити. Кількість понять, необхідних для успіху, зведено до мінімуму.

Бути простим також добре для розробників. Для аудиторії розробників ми прагнемо бути мовою з низьким кодом, який зменшує час, потрібний для створення рішення.

Узгодження з Excel

Мова Microsoft Power Fx багато запозичує з мови формул Excel. Ми прагнемо скористатися знаннями та досвідом багатьох авторів, які також використовують Excel. Типи, оператори та семантика функцій наближені до Excel, наскільки це можливо.

Якщо відповіді в Excel немає, ми звертаємось до SQL. Після Excel, SQL — це наступна найчастіше використовувана декларативна мова, яка надає інструкції щодо операцій з даними і суворої типізації, чого немає в Excel.

Декларативний

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

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

Функціонал

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

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

Композиція

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

Наприклад, елемент керування Колекція не має окремих властивостей Sort і Filter. Натомість функції Sort і Filter об’єднані в одну властивість Items. Інтерфейс користувача для вираження поведінки Sort і Filter накладається на властивість Items за допомого двостороннього редактора для цієї властивості.

Сильна типізація

Типи всіх значень відомі під час компіляції. Це дає змогу на ранньому етапі виявляти помилки і пропонувати розширені можливості під час створення.

Поліморфні типи підтримуються, але перед їх використанням їхній тип має бути закріплений за статистичним типом, і цей тип має бути відомий під час компіляції. Функції IsType і AsType призначені для тестування і зведення типів.

Виведення типів

Типи даних отримано від використання без оголошення. Наприклад, встановлення для значення змінної числа призводить до встановлення типу змінної як числа.

Використання конфліктуючого типу призводить до помилки під час компіляції.

Десяткові роздільники з урахуванням мовного стандарту

У деяких регіонах світу в ролі десяткового роздільника використовується крапка (.), а в інших — кома (,). І все це також робить Excel. Зазвичай це не робиться іншими мовами програмування, в яких зазвичай використовується канонічна крапка (.) як десятковий роздільник для всіх користувачів світу. Щоб бути якомога доступнішим для авторів на всіх рівнях, важливо, щоб 3,14 було десятковим числом для особи у Франції, яка все своє життя використовувала цей синтаксис.

Вибір десяткового роздільника має каскадний вплив на роздільник списків, який використовується для аргументів викликів функцій і оператора побудови ланцюжка.

Десятковий роздільник мови автора Десятковий роздільник Power Fx Роздільник елементів списку Power Fx Ланцюжковий оператор Power Fx
. (крапка) . (крапка) , (кома) ; (крапка з комою)
, (кома) , (кома) ; (крапка з комою) ;; (подвійна крапка з комою)

Додаткові відомості: Глобальна підтримка

Немає орієнтації на об’єкт.

Ні Excel, ні Power Fx не є орієнтованими на об’єкт. Наприклад, у деяких мовах довжина рядка виражається як властивість рядка, як-от "Hello World".length у JavaScript. Excel і Power Fx замість цього виражають це в термінах функції, як Len( "Hello World" ).

Компоненти із властивостями та методами є об’єктно-орієнтованими, і надбудова Power Fx легко працює з ними. Але за можливості ми вважаємо за краще функціональний підхід.

Розширюваний

Автори можуть створювати компоненти та функції за допомогою самої надбудови Power Fx. Розробники можуть створювати компоненти та функції за допомогою JavaScript.

Дружній для розробників

Незважаючи на те, що автори є основною ціллю, ми намагаємося бути дружнім для розробників, де це можливо. Якщо це не суперечить описаним раніше принципам проектування, ми дотримуємося принципів, які оцінить розробник. Наприклад, Excel не може додавати коментарі, тому ми використовуємо рядок типу C і внутрішньорядкові коментарі.

Розвиток мови

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

Штамп мовної версії додається до кожного збереженого документів Power Fx. Якщо ми хочемо внести несумісні зміни, ми напишемо текст, що називається «конвертером зворотної сумісності», який автоматично перезаписує формулу під час наступного редагування. Якщо зміна є значущою, про що нам потрібно розповісти користувачу, відобразиться також повідомлення з посиланням на документи. За допомогою цього приміщення можна завантажувати програми, створені за допомогою попередніх версій Power Apps багато років тому, попри всі зміни, що відбулися з того часу.

Наприклад, ми ввели функцію ShowError для відображення банеру з помилкою з червоним фоном.

Показати помилку.

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

Ось такий вигляд має програма під час завантаження в останню версію Power Apps. Від користувача не вимагалося жодних дій, щоб це перетворення відбувалося, воно відбулося автоматично при відкритті програми.

Функція Notify замінює ShowError.

Завдяки цьому Power Fx може розвиватися швидше й агресивніше, ніж більшість мов програмування.

Немає невизначеного значення

Деякі мови, наприклад JavaScript, використовують поняття невизначеного значення для неініціалізованих змінних або пропущених властивостей. Задля простоти ми уникали цього поняття. Сутності, які не були б визначені іншими мовами, розглядаються як помилка або пусте значення. Наприклад, усі деініціалізовані змінні починаються з пустого значення. Усі типи даних можуть мати пусте значення.

Типи даних
Оператори та ідентифікатори
Таблиці
Змінні
Імперативна логіка
Глобальна підтримка
Граматика виразу
Граматика формули YAML
Формули в програмах Canvas