городской пейзаж
Парадигма | мультипарадигмальность : объектно-ориентированная , событийно-ориентированная , императивная , функциональная , процедурная , рефлексивная. |
---|---|
Разработано | Жан-Кристоф Бэйли |
Разработчик | Гостай и др. |
Впервые появился | 2003 год |
Стабильная версия | 2.7.4
/ 17 ноября 2011 г |
Дисциплина набора текста | утка , динамично |
ТЫ | Кросс-платформенный |
Лицензия | Лицензии BSD [1] |
Расширения имен файлов | .в |
Веб-сайт | github |
Под влиянием | |
С++ , Самостоятельно , [2] Этот [2] |
urbiscript — язык программирования для робототехники. [3] Он имеет синтаксическую поддержку параллелизма и программирования на основе событий. Это на основе прототипов объектно-ориентированный язык сценариев . Оно динамическое: разрешение имен выполняется во время выполнения программы ( позднее связывание ); слоты ( переменные-члены ) можно добавлять/удалять во время выполнения, и даже прототипы ( суперклассы ) объекта можно изменять во время выполнения.
Управление памятью осуществляется путем подсчета ссылок .
Тесно привязанный к платформе Urbi, он поддерживает плавную интеграцию компонентов C++/Java.
Синтаксис и семантика
[ редактировать ]Вдохновение
[ редактировать ]С синтаксической точки зрения urbiscript принадлежит к C. семейству языков программирования
Его объектно-ориентированный дизайн, основанный на прототипах, был создан под влиянием языков программирования Self и Io . [2]
Он предназначен для программирования, а также взаимодействия с роботами; [2] как таковой, на него влияют оболочки Unix и другие языки, которые обеспечивают интерактивный верхний уровень в стиле цикла чтения-оценки-печати . Однако, в отличие от других, здесь нет запроса на ввод данных пользователем, а ответы системы предваряются меткой времени (в миллисекундах) в квадратных скобках:
1 + 1; sleep(1s); 1 + 2 * 3;
- [00005420] 2
- [00006420] 7
Последовательные операторы и поток управления
[ редактировать ]Заявления городского сценария включают (среди прочего): [4]
- The
if
оператор , который условно выполняет блок кода вместе сelse
. - Традиционный
for
оператор , как в C, который выполняет итерацию по итерируемому объекту, записывая каждый элемент в локальную переменную для использования прикрепленным блоком. - Другой
for
оператор , который выполняет итерацию по итерируемому объекту, записывая каждый элемент в локальную переменную для использования прикрепленным блоком. - The
while
оператор , который выполняет блок кода, пока его условие истинно. - The
try
оператор , который позволяет перехватывать и обрабатывать исключения, возникающие в прикрепленном к нему блоке кода.catch
статьи. Дополнительныйelse
Предложение выполняется, если не было создано исключение. Код очистки может быть гарантированно запущен в каждом случае, если он задан вfinally
-пункт. - The
assert
оператор , используемый во время отладки для проверки условий, которые должны применяться. урбискрипт также имеет функциюassert
блоки, которые можно использовать для факторизации несколькихassert
заявления.
На самом деле, в отличие от большинства C-подобных языков и несмотря на то, что предполагает синтаксис, операторы «имеют значение» и, следовательно, являются выражениями, при условии, что они заключены в фигурные скобки:
var status = { if (closed) "closed" else "open" };
var pass = { try { foo } catch { false } else { true } };
Параллельные операторы и поток управления
[ редактировать ]В urbiscript некоторые конструкции потока управления бывают нескольких «разновидностей»: два типа последовательной композиции и два типа параллельной композиции. Под капотом параллелизм реализуется с помощью сопрограмм . [5]
Состав заявления
[ редактировать ]Как и в C, точка с запятой обозначает последовательную композицию: a;b
означает «оператор запуска» a
затем запустите оператор b
. Другие задачи могут выполняться между a
и b
. Другой разделитель операторов, труба, обозначает «жесткую последовательную композицию»: ни одна другая задача не может быть запущена между ними. a
и b
в a|b
.
Аналогичным образом, в urbiscript есть два способа одновременного составления операторов. С a,b
, первый a
запускается, и в какой-то момент b
будет --- возможно, пока a
все еще работает. Это очень похоже на &
оператор в оболочках Unix. Альтернативно, с a&b
, оба a
и b
запускаются вместе; в интерактивных сессиях это означает, что a
не будет запущен до тех пор, пока b
введен полностью и за ним должным образом следует либо ;
или ,
.
Области — это границы фоновых заданий, как показано в следующем примере: [5]
{
{ sleep(2s); echo(2) },
{ sleep(1s); echo(1) },
};
echo(3);
- [00012451] *** 1
- [00013447] *** 2
- [00013447] *** 3
Параллельные разновидности последовательных конструкций
[ редактировать ]Большинство конструкций циклов в urbiscript имеют несколько «разновидностей», основанных на четырех разделителях операторов: ;
, |
, ,
, и &
.
Например
// This is actually "for;".
for (var i : [0, 1, 2])
{
echo(i);
echo(i ** 2);
};
дисплеи
- [00002919] *** 0
- [00002921] *** 0
- [00002921] *** 1
- [00002922] *** 1
- [00002922] *** 2
- [00002922] *** 4
т.е. тела цикла выполняются не последовательно, а for&
Ключевое слово запускает тела цикла одновременно:
for& (var i : [0, 1, 2])
{
echo(i);
echo(i ** 2);
};
- [00021680] *** 0
- [00021680] *** 1
- [00021680] *** 2
- [00021682] *** 0
- [00021682] *** 1
- [00021682] *** 4
Программирование на основе событий
[ редактировать ]Стремясь к разработке портативных роботизированных приложений, [6] urbiscript использует определенные синтаксические конструкции для определения реактивного поведения, такого как «подойти к зарядной станции, когда батарея разряжена», «воспроизвести дружелюбный звук при распознавании известного лица» или «остановиться при обнаружении препятствия».
Явная обработка событий
[ редактировать ]Обработка событий состоит из трех этапов. Сначала определите событие
var e = Event.new;
Во-вторых, укажите обработчики событий
at (e?)
echo("received event e");
В-третьих, «испустить» это событие
e!;
- [00014333] *** получено событие e
События могут иметь полезные данные, а обработчики событий используют сопоставление с образцом полезных данных:
at (e?(1, var x) if x % 2 == 0)
echo("received event e(1, %s)" % x);
e!(1, 1);
- [00014336] *** получено событие e
e!(1, 2);
- [00014336] *** получено событие e
- [00014336] *** получено событие e(1, 2)
Неявные события
[ редактировать ]Язык urbiscript также позволяет отслеживать выражения:
at (batteryLevel <= 0.2)
robot.goToChargingDock;
Следующий пример демонстрирует эту функцию:
var x = 0;
- [00002165] 0
var y = 0;
- [00002166] 0
var z = 0;
- [00002167] 0
at (x + y == z)
echo("%s + %s == %s" % [x, y, z]);
- [00002168] *** 0 + 0 == 0
x = 1;
- [00002169] 1
z = 1;
- [00002170] 1
- [00002170] *** 1 + 0 == 1
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ «Urbi, операционная система с открытым исходным кодом для роботов» . Проверено 27 октября 2012 г.
- ^ Jump up to: а б с д Бэйли, Жан-Кристоф; Демайль, аким; Ноттале, Матье; Хоке, Квентин; Тардье, Самуэль (2008). «Универсальная платформа Urbi для робототехники» (PDF) . Проверено 6 октября 2011 г.
- ^ Бэйли, Жан-Кристоф. «Urbi: новый параллельный и управляемый событиями язык сценариев для робототехники, игр и многого другого» . Ютуб . Проверено 6 октября 2011 г.
- ^ «Справочное руководство по городскому языку» . Проверено 20 сентября 2011 г.
- ^ Бэйли, Жан-Кристоф; Демайль, аким; Ноттале, Матье; Хоке, Квентин (2010). «События! (Реактивность в городском письме)». arXiv : 1010.5694 [ cs.PL ].
Внешние ссылки
[ редактировать ]- Семейство языков программирования C
- Динамически типизированные языки программирования
- Бесплатные компиляторы и интерпретаторы
- Кроссплатформенное бесплатное программное обеспечение
- Языки программирования высокого уровня
- Объектно-ориентированные языки программирования
- Языки программирования, созданные в 2003 году.
- Языки программирования на основе прототипов
- Языки сценариев
- Текстоориентированные языки программирования
- Языки программирования роботов