Urbiscript - Википедия - urbiscript

urbiscript
Парадигмамультипарадигма: объектно-ориентированный, событийный, императив, функциональный, процедурный, отражающий
РазработаноЖан-Кристоф Бэйли
РазработчикGostai et al.
Впервые появился2003; 17 лет назад (2003)
Стабильный выпуск
2.7.4 / 17 ноября 2011 г.; 9 лет назад (2011-11-17)
Печатная дисциплинаутка, динамичный
Операционные системыКроссплатформенность
ЛицензияЛицензии BSD[1]
Расширения имени файла.u
Интернет сайтgithub.com/ urbiforge/ urbi
Под влиянием
C ++, Себя,[2] Ио[2]

urbiscript это язык программирования для робототехники.[3] Он имеет синтаксическую поддержку параллелизма и программирования на основе событий. Это на основе прототипа объектно-ориентированный язык сценариев. Это динамично: разрешение имени выполняется во время выполнения программы (позднее связывание ); слоты (переменные-члены ) могут быть добавлены / удалены во время выполнения, и даже прототипы (суперклассы ) объекта можно изменить во время выполнения.

Управление памятью выполняется подсчет ссылок.

Плотно привязан к Платформа Urbi он поддерживает бесшовную интеграцию компонентов C ++ / Java.

Синтаксис и семантика

Вдохновение

С синтаксической точки зрения urbiscript принадлежит C -семейство языков программирования.

Его объектно-ориентированный дизайн, основанный на прототипах, находился под влиянием Себя и Ио языки программирования.[2]

Он предназначен для программирования, но также для взаимодействия с роботами;[2] как таковой, на него влияют Оболочки Unix и другие языки, обеспечивающие цикл чтения-оценки-печати стиль интерактивного верхнего уровня. Однако, в отличие от других, нет подсказки для ввода пользователем, но ответы от системы имеют префикс времени (в миллисекундах) между квадратными скобками:

 1 + 1; сон (1 сек); 1 + 2 * 3;
[00005420] 2
[00006420] 7

Последовательные операторы и поток управления

Операторы urbiscript включают (среди прочего):[4]

  • В если утверждение, который условно выполняет блок кода вместе с еще.
  • Традиционный за утверждение, как в C, который выполняет итерацию по итерируемому объекту, записывая каждый элемент в локальную переменную для использования присоединенным блоком.
  • Другой за утверждение, который выполняет итерацию по итерируемому объекту, записывая каждый элемент в локальную переменную для использования присоединенным блоком.
  • В пока утверждение, который выполняет блок кода, пока его условие истинно.
  • В пытаться утверждение, что позволяет перехватывать и обрабатывать исключения, созданные в присоединенном блоке кода. ловить статьи. Необязательный еще предложение запускается, если не было сгенерировано исключение. Можно гарантировать запуск кода очистки в каждом случае, если он указан в наконец-то-пункт.
  • В утверждать утверждение, используется во время отладки для проверки условий, которые должны применяться. urbiscript также есть утверждать блоки, которые можно использовать для разложения нескольких утверждать заявления.

Фактически, в отличие от большинства C-подобных языков и несмотря на то, что предполагает синтаксис, операторы «имеют значение» и, следовательно, являются выражениями, если они заключены в фигурные скобки:

  вар положение дел = { если (закрыто) "закрыто" еще "открыто" };  вар проходить = { пытаться { фу } ловить { ложный } еще { истинный } };

Параллельные операторы и поток управления

В urbiscript некоторые конструкции потока управления имеют несколько «разновидностей»: два типа последовательной композиции и два типа параллельной композиции. Под капотом параллелизм реализован с использованием сопрограммы.[5]

Состав заявления

Как и в C, точка с запятой обозначает последовательный состав: а; б означает "запустить инструкцию" а затем запустите инструкцию б. Другие задачи могут выполняться между а и б. Другой разделитель операторов, вертикальная черта, обозначает «плотную последовательную композицию»: никакая другая задача не может выполняться между а и б в а | б.

Точно так же urbiscript предлагает два средства для одновременного составления операторов. С а, б, первый а запускается, и в какой-то момент б будет --- возможно пока а все еще работает. Это очень похоже на & оператор в оболочках Unix. В качестве альтернативы с а и б, обе а и б запускаются вместе; в интерактивных сеансах это означает, что а не будет запущен, пока б полностью введен и должным образом сопровождается либо ; или ,.

Области - это границы фоновых заданий, как показано в следующем примере:[5]

  {    { спать(2 с); эхо(2) },    { спать(1 с); эхо(1) },   };  эхо(3);
[00012451] *** 1
[00013447] *** 2
[00013447] *** 3

Параллельные разновидности последовательных конструкций

Большинство циклических конструкций в urbiscript имеют несколько "разновидностей", основанных на четырех разделителях операторов: ;, |, ,, и &.

Например

  // На самом деле это «for;».  за (вар я : [0, 1, 2])  {    эхо(я);    эхо(я ** 2);  };

отображает

[00002919] *** 0
[00002921] *** 0
[00002921] *** 1
[00002922] *** 1
[00002922] *** 2
[00002922] *** 4

т.е. тела цикла не выполняются последовательно, а за& ключевое слово запускает тела цикла одновременно:

  за& (вар я : [0, 1, 2])  {    эхо(я);    эхо(я ** 2);  };
[00021680] *** 0
[00021680] *** 1
[00021680] *** 2
[00021682] *** 0
[00021682] *** 1
[00021682] *** 4

Событийное программирование

Стремясь к разработке портативных роботизированных приложений,[6] urbiscript использует определенные синтаксические конструкции для определения реактивного поведения, такого как «перейти к зарядной док-станции при низком заряде батареи», «воспроизвести дружеский звук при распознавании известного лица» или «остановиться при обнаружении препятствия».

Явная обработка событий

Обработка событий состоит из трех этапов. Сначала определите событие

  вар е = Мероприятие.новый;

Во-вторых, укажите обработчики событий

  в (е?)    эхо("получено событие е");

В-третьих, "испустить" это событие

  е!;
[00014333] *** получено событие e

События могут иметь полезные данные, а обработчики событий могут использовать сопоставление с шаблоном полезной нагрузки:

  в (е?(1, вар Икс) если Икс % 2 == 0)    эхо("получено событие e (1,% s)" % Икс);  е!(1, 1);
[00014336] *** получено событие e
  е!(1, 2);
[00014336] *** получено событие e
[00014336] *** получено событие e (1, 2)

Неявные события

Язык urbiscript также позволяет отслеживать выражения:

  в (batteryLevel <= 0.2)    робот.goToChargingDock;

Следующий пример демонстрирует эту функцию:

  вар Икс = 0;
[00002165] 0
  вар у = 0;
[00002166] 0
  вар z = 0;
[00002167] 0
  в (Икс + у == z)    эхо("% s +% s ==% s" % [Икс, у, z]);
[00002168] *** 0 + 0 == 0
  Икс = 1;
[00002169] 1
  z = 1;
[00002170] 1
[00002170] *** 1 + 0 == 1

Смотрите также

Рекомендации

  1. ^ «Urbi, операционная система с открытым исходным кодом для роботов». Получено 2012-10-27.
  2. ^ а б c d Бэйли, Жан-Кристоф; Демайль, Аким; Ноттале, Матье; Хоке, Квентин; Тардье, Сэмюэл (2008). «Универсальная платформа для робототехники Urbi» (PDF). Получено 6 октября 2011.
  3. ^ Бэйли, Жан-Кристоф. «Urbi: новый язык сценариев с параллельным и событийным управлением для робототехники, игр и многого другого». YouTube. Получено 6 октября 2011.
  4. ^ "Справочное руководство по языку urbiscript". Получено 2011-09-20.
  5. ^ а б Бэйли, Жан-Кристоф; Демайль, Аким; Ноттале, Матье; Хоке, Квентин (2010). "Тег: Управление заданиями в urbiscript" (PDF). Получено 6 октября 2011.
  6. ^ Бэйли, Жан-Кристоф; Демайль, Аким; Ноттале, Матье; Хоке, Квентин (2010). «События! (Реакция в urbiscript)». arXiv:1010.5694 [cs.PL ].

внешняя ссылка