Jump to content

urbiscript

From Wikipedia, the free encyclopedia
urbiscript
Paradigmmulti-paradigm:object-oriented,event-driven,imperative,functional,procedural,reflective
Designed byJean-Christophe Baillie
DeveloperGostai et al.
First appeared2003;21 years ago(2003)
Stable release
2.7.4 / November 17, 2011;12 years ago(2011-11-17)
Typing disciplineduck,dynamic
OSCross-platform
LicenseBSD licenses[1]
Filename extensions.u
Websitegithub.com/urbiforge/urbi
Influenced by
C++,Self,[2]Io[2]

urbiscriptis a programming language for robotics.[3]It features syntactic support for concurrency and event-based programming. It is aprototype-basedobject-orientedscripting language.It is dynamic:name resolutionis performed during the program execution (late binding); slots (member variables) can be added/removed at runtime, and even prototypes (superclasses) of an object can be changed at runtime.

Memory managementis performed byreference counting.

Tightly bound to theUrbi platformit supports seamless integration of C++/Java components.

Syntax and semantics

[edit]

Inspiration

[edit]

From the syntactical point of view, urbiscript belongs to theC-family of programming languages.

Its prototype-based object-oriented design was influenced by theSelfand theIoprogramming languages.[2]

It is designed to program, but also interact with robots;[2]as such, it is influenced byUnix shellsand other languages that provide aread-eval-print loopstyle interactive toplevel. However, contrary to others, there is no prompt for user input but answers from the system are prefixed by a timestamp (in milliseconds) between square brackets:

1 + 1; sleep(1s); 1 + 2 * 3;
[00005420] 2
[00006420] 7

Sequential statements and control flow

[edit]

urbiscript statements include (among others):[4]

  • Theifstatement,which conditionally executes a block of code, along withelse.
  • The traditionalforstatement,as in C which iterates over an iterable object, capturing each element to a local variable for use by the attached block.
  • Anotherforstatement,which iterates over an iterable object, capturing each element to a local variable for use by the attached block.
  • Thewhilestatement,which executes a block of code as long as its condition is true.
  • Thetrystatement,which allows exceptions thrown in its attached code block to be caught and handled bycatchclauses. An optionalelseclause is run if no exception was thrown. Clean-up code can be guaranteed to be run in every case when given in afinally-clause.
  • Theassertstatement,used during debugging to check for conditions that ought to apply. urbiscript also featureassertblocks, which can be used to factor severalassertstatements.

Actually, contrary to most C-like languages and despite what the syntax suggests, statements "have a value", and therefore are expressions, provided they are embedded in braces:

varstatus={if(closed)"closed"else"open"};
varpass={try{foo}catch{false}else{true}};

Concurrent statements and control flow

[edit]

In urbiscript, some control-flow constructs come in several "flavors": two types of sequential composition, and two types of concurrent composition. Under the hood, concurrency is implemented usingcoroutines.[5]

Statement composition

[edit]

Like in C, the semicolon denotes sequential composition:a;bstands for "run statementathen run statementb.Other tasks may be run betweenaandb.Another statement separator, pipe, denotes "tight sequential composition": no other task can be run betweenaandbina|b.

Similarly urbiscript features two means to compose statements concurrently. Witha,b,firstais run, and at some pointbwill be --- possibly whileais still running. This is very similar to the&operator in Unix shells. Alternatively, witha&b,bothaandbare started together; in interactive sessions, this means thatawon't be run untilbis fully entered and properly followed by either a;or a,.

Scopes are boundaries for backgrounded jobs, as demonstrated in the following example:[5]

{
{sleep(2s);echo(2)},
{sleep(1s);echo(1)},
};
echo(3);
[00012451] *** 1
[00013447] *** 2
[00013447] *** 3

Concurrent flavors of sequential constructs

[edit]

Most looping constructs in urbiscript come in several "flavors", which are based on the four statement separators:;,|,,,and&.

For instance

// This is actually "for;".
for(vari:[0,1,2])
{
echo(i);
echo(i**2);
};

displays

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

i.e., the loop bodies are not executed sequentially, while thefor&keyword runs the loop bodies concurrently:

for&(vari:[0,1,2])
{
echo(i);
echo(i**2);
};
[00021680] *** 0
[00021680] *** 1
[00021680] *** 2
[00021682] *** 0
[00021682] *** 1
[00021682] *** 4

Event-based programming

[edit]

Aiming at the development of portable robotic applications,[6]urbiscript relies on specific syntactic constructs to specify reactive behaviors such as "go to the charging dock when the battery is low", "play a friendly sound when a known face is recognized", or "stop when an obstacle is detected".

Explicit event handling

[edit]

Event handling goes into three steps. First, define an event

vare=Event.new;

Second, specify event handlers

at(e?)
echo("received event e");

Third, "emit" this event

e!;
[00014333] *** received event e

Events can have payloads, and event handlers enjoy pattern matching on the payload:

at(e?(1,varx)ifx%2==0)
echo("received event e(1, %s)"%x);
e!(1,1);
[00014336] *** received event e
e!(1,2);
[00014336] *** received event e
[00014336] *** received event e(1, 2)

Implicit events

[edit]

The urbiscript language also allows to monitor expressions:

at(batteryLevel<=0.2)
robot.goToChargingDock;

The following example demonstrates the feature:

varx=0;
[00002165] 0
vary=0;
[00002166] 0
varz=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

See also

[edit]

References

[edit]
  1. ^"Urbi, the open source operating system for robots".Retrieved2012-10-27.
  2. ^abcdBaillie, Jean-Christophe; Demaille, Akim; Nottale, Matthieu; Hocquet, Quentin; Tardieu, Samuel (2008)."The Urbi Universal Platform for Robotics"(PDF).Retrieved6 October2011.
  3. ^ Baillie, Jean-Christophe."Urbi: a new parallel & event-driven script language for robotics, games and more".YouTube.Retrieved6 Oct2011.
  4. ^"urbiscript Language Reference Manual".Retrieved2011-09-20.
  5. ^abBaillie, Jean-Christophe; Demaille, Akim; Nottale, Matthieu; Hocquet, Quentin (2010)."Tag: Job Control in urbiscript"(PDF).Retrieved6 October2011.
  6. ^Baillie, Jean-Christophe; Demaille, Akim; Nottale, Matthieu; Hocquet, Quentin (2010). "Events! (Reactivity in urbiscript)".arXiv:1010.5694[cs.PL].
[edit]