Urbiscript - Википедия - urbiscript
Парадигма | мультипарадигма: объектно-ориентированный, событийный, императив, функциональный, процедурный, отражающий |
---|---|
Разработано | Жан-Кристоф Бэйли |
Разработчик | Gostai et al. |
Впервые появился | 2003 |
Стабильный выпуск | 2.7.4 / 17 ноября 2011 г. |
Печатная дисциплина | утка, динамичный |
Операционные системы | Кроссплатформенность |
Лицензия | Лицензии BSD[1] |
Расширения имени файла | .u |
Интернет сайт | github |
Под влиянием | |
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
Смотрите также
Рекомендации
- ^ «Urbi, операционная система с открытым исходным кодом для роботов». Получено 2012-10-27.
- ^ а б c d Бэйли, Жан-Кристоф; Демайль, Аким; Ноттале, Матье; Хоке, Квентин; Тардье, Сэмюэл (2008). «Универсальная платформа для робототехники Urbi» (PDF). Получено 6 октября 2011.
- ^ Бэйли, Жан-Кристоф. «Urbi: новый язык сценариев с параллельным и событийным управлением для робототехники, игр и многого другого». YouTube. Получено 6 октября 2011.
- ^ "Справочное руководство по языку urbiscript". Получено 2011-09-20.
- ^ Бэйли, Жан-Кристоф; Демайль, Аким; Ноттале, Матье; Хоке, Квентин (2010). «События! (Реакция в urbiscript)». arXiv:1010.5694 [cs.PL ].