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


Обзор 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 или accelerationforce автоматически обновляется до нового значения. Выражение описывает вычисление, формула дала этому вычислению имя и использовала его как рецепт. Вот почему мы называем 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 — "ложь", мы можем отложить это вычисление до тех пор, пока метка не станет видимой, и эффективно удалить ее, если это случается редко.

  • Перевод синтаксиса Excel: Excel используется многими пользователями, большинству из которых известно, что амперсанд (&) используется для объединения строк. JavaScript использует знак плюса (+), а в других языках используется точка (.).

  • Отображаемые имена и локализация: First Name используется в формуле Power Fx, когда в эквиваленте JavaScript используется nwind_firstname. В 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 Code.

Профессиональный код 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. Мы удалили функцию, которая ранее находилась в производстве, и заменили ее чем-то другим. Поскольку одно и то же можно было сделать двумя способами, это вызвало бы путаницу — особенно для новых пользователей — и, самое главное, это добавило бы сложности. Никто не жаловался, все оценили изменение, а затем перешли к своей следующей функции Notify.

Так выглядит то же приложение при загрузке в последнюю версию Power Apps. От пользователя не требовалось никаких действий, чтобы это преобразование произошло, оно произошло автоматически при открытии приложения.

Функция Notify заменяет ShowError.

С этим средством Power Fx может развиваться быстрее и агрессивнее, чем большинство языков программирования.

Нет неопределенного значения

Некоторые языки, такие как JavaScript, используют концепцию неопределенного значения для неинициализированных переменных или отсутствующих свойств. Для простоты мы отказались от этой концепции. Экземпляры, которые не были бы определены на других языках, обрабатываются либо как ошибка, либо как пустое значение. Например, все неинициализированные переменные начинаются с пустого значения. Все типы данных могут принимать пустое значение.

Типы данных
Операторы и идентификаторы
Таблицы
Переменные
Императивная логика
Глобальная поддержка
Грамматика выражений
Грамматика формул YAML
Формулы в приложениях на основе холста